none
SQL数据库备份问题 RRS feed

  • 问题

  • 我从《C#数据库高级教程》学到如何在备份数据库,依样画葫芦写了以下代码:

    (一)先编写存储过程。

    Create Procedure TestBackup
    @DeviceName Varchar(80),
    @FileName Varchar(125)
    As

    If Exists(Select @FileName)
    Begin
      Exec sp_addumpdevice 'Disk', @DeviceName, @FileName
      Backup Database test To @DeviceName
    End

    Go

    (二)程序布局是两个文本框(tbxDeviceName和tbxFileName)和一个btnBackUp按钮。

    (三)编写一个btnBackUp按钮点击事件。

    private void btnBackUp_Click(object sender, EventArgs e)
    {
      SqlConnection conn = new SqlConnection("Data Source=.\\xpw;Initial Catalog=Test; 

        Integrated Security=True;");
      SqlCommand cm = new SqlCommand("TestBackup", conn);
      cm.CommandType = CommandType.StoredProcedure;

      try
      {
        SqlParameter pmDeviceName =
          new SqlParameter("@DeviceName", SqlDbType.VarChar, 80);
          pmDeviceName.Value = tbxDeviceName.Text;
          cm.Parameters.Add(pmDeviceName);

          SqlParameter pmFileName =
            new SqlParameter("@FileName", SqlDbType.VarChar, 125);
          pmFileName.Value = tbxFileName.Text;
          cm.Parameters.Add(pmFileName);

          conn.Open();
          cm.ExecuteNonQuery();
      }
      catch (Exception)
      {
        conn.Close();
        MessageBox.Show("错误!,请检查参数");
        return;
      }
      conn.Close();
      MessageBox.Show("备份成功!");
    }

    现在问题是:

    ⒈每次点击BackUp按钮后,会把备份附加在同一个文件,文件越来越大。

    ⒉删除备份文件后再备份,老是提示错误,但仍然有备份文件。

    ⒊在备份时换别的文件名都无效!

    2012年9月11日 5:00

答案

  • 我先在MSSMS里用sp_dropdevice 删除备份设备,然后才执行C#程序倒是可以解决,不再发生异常,不过如不删除原有备份,仍然会累加在原备份文件。我现在需要的是:

    如已存在备份文件,应该用什么SQL语句先删除原有备份?

    在C#里如何执行sp_dropdevice?

    谢谢!

    和备份一样,只是备份前先执行 dropdevice的存储过程

    http://feiyun0112.cnblogs.com/

    • 已标记为答案 栾涅 2012年9月11日 9:07
    2012年9月11日 8:29
    版主

全部回复

  • private void btnBackUp_Click(object sender, EventArgs e)
     {
       SqlConnection conn = new SqlConnection("Data Source=.\\xpw;Initial Catalog=Test; 
     
        Integrated Security=True;");
       SqlCommand cm = new SqlCommand("TestBackup", conn);
       cm.CommandType = CommandType.StoredProcedure;
     
      try
       {
         SqlParameter pmDeviceName = 
          new SqlParameter("@DeviceName", SqlDbType.VarChar, 80);
           pmDeviceName.Value = tbxDeviceName.Text;
           cm.Parameters.Add(pmDeviceName);
     
          SqlParameter pmFileName = 
            new SqlParameter("@FileName", SqlDbType.VarChar, 125);
           pmFileName.Value = tbxFileName.Text;
           cm.Parameters.Add(pmFileName);
     
          conn.Open();
           cm.ExecuteNonQuery();
            MessageBox.Show("备份成功!");
       }
       catch (Exception)
       { 
        conn.Close();
         MessageBox.Show("错误!,请检查参数");
         return;
       }
       finally
       {
       conn.Close();
       }
     }

    加上finally试试看。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月11日 5:21
    版主
  • sp_addumpdevice 这样备份有一个弊端。如果没有修改数据库备份名称,多次使用原有备份的名称,会将数据累加到该原有备份文件上面

    可以先用sp_dropdevice 删除备份设备




    http://feiyun0112.cnblogs.com/

    2012年9月11日 6:20
    版主
  • 添加finally块也是一样!
    2012年9月11日 7:46
  • 我先在MSSMS里用sp_dropdevice 删除备份设备,然后才执行C#程序倒是可以解决,不再发生异常,不过如不删除原有备份,仍然会累加在原备份文件。我现在需要的是:

    如已存在备份文件,应该用什么SQL语句先删除原有备份?

    在C#里如何执行sp_dropdevice?

    谢谢!

    2012年9月11日 7:57
  • 我先在MSSMS里用sp_dropdevice 删除备份设备,然后才执行C#程序倒是可以解决,不再发生异常,不过如不删除原有备份,仍然会累加在原备份文件。我现在需要的是:

    如已存在备份文件,应该用什么SQL语句先删除原有备份?

    在C#里如何执行sp_dropdevice?

    谢谢!

    和备份一样,只是备份前先执行 dropdevice的存储过程

    http://feiyun0112.cnblogs.com/

    • 已标记为答案 栾涅 2012年9月11日 9:07
    2012年9月11日 8:29
    版主
  • 谢谢您的帮助!
    2012年9月11日 9:33