代码改变世界

C#简单备份/还原代码

2011-05-15 11:20  jiangys  阅读(1743)  评论(1编辑  收藏  举报

 (图1)      (图2)

界面如上,记得加上一个OpenFileDialog控件(ofd)和SaveFileDialog控件(sd)

代码如下:(图1的代码)

图1代码
1 #region 点击备份按钮
2 privatevoid btnBackup_Click(object sender, EventArgs e)
3 {
4 string Str_dar ="";
5 Str_dar = txtDefaultWay.Text.Trim().ToString();//备份路径
6  if (txtDefaultWay.Text =="")
7 {
8 MessageBox.Show("请选择备份数据库文件的路径。");
9 return;
10 }
11 try
12 {
13 Str_dar ="backup database DB_MovieFilm to disk='"+ Str_dar +"'";
14 sqlhelper.getcomnum(Str_dar);//执行SQL语句
15   MessageBox.Show("数据备份成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
16 }
17 catch (Exception ex)
18 {
19 MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
20 }
21 }
22 #endregion
23
24 #region 点击备份路径按钮
25 privatevoid btnWay_Click(object sender, EventArgs e)
26 {
27 sd.InitialDirectory = Application.StartupPath +"\\";//默认路径为D://
28 sd.Filter ="备份文件 (*.bak)|*.bak|所有文件 (*.*)|*.*";//筛选器,定义文件类型
29 sd.FilterIndex =1; //默认值为第一个
30 sd.RestoreDirectory =true; //重新定位保存路径
31 if (sd.ShowDialog() == DialogResult.OK)
32 {
33 txtDefaultWay.Text = sd.FileName.ToString();//文本框的内容=路径
34 }
35 }
36 #endregion
37
38 #region 点击备份数据库的取消按钮
39 privatevoid btnClose_Click(object sender, EventArgs e)
40 {
41 this.Close();
42 }
43 #endregion

图2代码:

图2
1 #region 点击还原路径按钮
2 privatevoid btnRestoreWay_Click(object sender, EventArgs e)
3 {
4 ofd.InitialDirectory = Application.StartupPath +"\\";
5 ofd.Filter ="(*.bak)|*.bak|(所有文件)|*.*";
6 ofd.FilterIndex =1;
7 ofd.RestoreDirectory =true;
8 if (ofd.ShowDialog() == DialogResult.OK)
9 {
10 txtWay.Text = ofd.FileName.ToString();//文本框的内容=路径
11 }
12 }
13 #endregion
14
15 #region 点击还原按钮
16 privatevoid btnRestore_Click(object sender, EventArgs e)
17 {
18 if (txtWay.Text =="")
19 {
20 MessageBox.Show("请选择备份数据库文件的路径。");
21 return;
22 }
23 try
24 {
25 string P_Str_cmdtxt ="USE master DECLARE tb CURSOR LOCAL FOR SELECT 'Kill '+ CAST(Spid AS VARCHAR) FROM master.dbo.sysprocesses";
26 P_Str_cmdtxt +=" WHERE dbid=DB_ID('DB_MovieFilm') DECLARE @s nvarchar(1000) OPEN tb FETCH tb INTO @s";
27 P_Str_cmdtxt +=" WHILE @@FETCH_STATUS = 0 BEGIN EXEC (@s) FETCH tb INTO @s END CLOSE tb DEALLOCATE tb";
28 P_Str_cmdtxt +=" RESTORE DATABASE DB_MovieFilm FROM disk='"+ txtWay.Text +"'";
29 SqlConnection sqlcon = sqlhelper.getcon();//数据库连接
30 sqlcon.Close();//关闭数据库
31 sqlcon.Open();//重新打开数据库
32 SqlCommand sqlcom =new SqlCommand(P_Str_cmdtxt, sqlcon);
33 sqlcom.ExecuteNonQuery();
34 MessageBox.Show("数据还原成功!", "提示框", MessageBoxButtons.OK, MessageBoxIcon.Information);
35 if (sqlcon.State == ConnectionState.Closed)
36 {
37 sqlcon.Open();
38 }
39
40 MessageBox.Show("为了避免数据丢失,在数据库原还后将关闭整个系统。");
41 Application.Exit();
42
43 }
44 catch (Exception ex)
45 {
46 MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
47 }
48 }
49 #endregion

运行还原的时候,还是会出错,错误如下:

尚未备份数据库 "DB_MovieFilm" 的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。请使用 RESTORE 语句的 WITH REPLACE 或 WITH STOPAT 子句来只覆盖该日志的内容。

解决如下:

将恢复模式的完整改为简单即可

附:恢复模式                说明
   简单           不用备份的事务日志,即可还原
                  用于小型数据库和不经常更改的数据库
   完整           所有事务都被记录到日志中
                  保留所有日志,直到事务日志备份
                  用于生产数据库
 大容量日志       完整恢复模式的补充
                  不将大容量日志操作写入日志