2013-04-06 172 views
5

备份SQL Server备份和恢复

string connectionString1 = (@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Database1.mdf;Database=Database1;Integrated Security=True; User Instance=True"); 
      SqlConnection cn = new SqlConnection(connectionString1); 
      cn.Open(); 
      SqlCommand cmd = new SqlCommand(); 
      SqlDataReader reader; 
      cmd.CommandText = @"BACKUP DATABASE Database1 TO DISK = 'C:\SRI2Works.bak'"; 

      cmd.CommandType = CommandType.Text; 
      cmd.Connection = cn; 
      reader = cmd.ExecuteReader(); 
      cn.Close(); 
      MessageBox.Show("Database Backup Successfull."); 

恢复

string connectionString1 = (@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Database1.mdf;Database=Database1;Integrated Security=True; User Instance=True"); 
      SqlConnection cn = new SqlConnection(connectionString1); 
      cn.Open(); 

      SqlCommand cmd = new SqlCommand(); 
      SqlDataReader reader; 
      cmd.CommandText = @"use master; RESTORE DATABASE Database1 FROM DISK = 'C:\SRI2Works.bak'"; 
      cmd.CommandText = "DBCC CHECKDB ('Database1')"; 
      cmd.CommandType = CommandType.Text; 
      cmd.Connection = cn; 
      reader = cmd.ExecuteReader(); 
      cn.Close(); 
      MessageBox.Show("Database Restored Successfull."); 

这段代码成功运行,但不进行任何更改。

+0

您是如何验证代码确实被执行的?消息框是否触发? – usr 2013-04-06 15:29:53

+0

文件'C:\ SRI2Works.bak'实际写入了吗?而且,实际上,您的恢复命令仅执行'DBCC CHECKDB('Database1')',它取代了上面一行中设置的'CommandText'。 – 2013-04-06 15:34:50

+0

@ThomasGerstendörfer好抓! OP应该使用SQL事件探查器来验证预期的命令是否被实际发送。 – usr 2013-04-06 15:41:21

回答

0

例如我们有2个菜单条;一个用于备份,另一个用于恢复,以便他们执行他们的方法!试试这个:

private void saveDatabaseToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      BackupDatabase(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message + " \nPlease choose the folder Sauvegardes to backup !"); 
     } 

    } 
    private void restoreDatabaseToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      RestoreDatabase(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
    private void BackupDatabase() 
    { 
     saveFileDialogBackUp.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory + @"Sauvegardes"; 
     if (saveFileDialogBackUp.ShowDialog() == DialogResult.OK) 
     { 
      Con.ExecuteCmd("BACKUP DATABASE MyFooDatabase TO DISK = '" + saveFileDialogBackUp.FileName + "'"); 
      MessageBox.Show("Success , done!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
    } 
    private void RestoreDatabase() 
    { 
     openFileDialogBackUp.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory + @"Sauvegardes"; 
     if (openFileDialogBackUp.ShowDialog() == DialogResult.OK) 
     { 
      Con.ExecuteCmd(" USE MASTER RESTORE DATABASE MyFooDatabase FROM DISK = '"+openFileDialogBackUp.FileName+"' WITH REPLACE"); 
      MessageBox.Show("Database Restored", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 

    } 
0

从代码中删除以下语句:

cmd.CommandText = "DBCC CHECKDB ('Database1')"; 

,如果你想覆盖现有的数据库使用以下命令的CommandText:

cmd.CommandText = @"use master; RESTORE DATABASE Database1 FROM DISK = 'C:\SRI2Works.bak' WITH REPLACE"; 
6

试试这个代码还原数据库:

private void restoreButton_Click(object sender, EventArgs e) 
    { 
    string database = con.Database.ToString(); 
    if (con.State != ConnectionState.Open) 
    { 
     con.Open(); 
    } 
    try 
    { 
     string sqlStmt2 = string.Format("ALTER DATABASE [" + database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); 
     SqlCommand bu2 = new SqlCommand(sqlStmt2, con); 
     bu2.ExecuteNonQuery(); 

     string sqlStmt3 = "USE MASTER RESTORE DATABASE [" + database + "] FROM DISK='" + textBox2.Text + "'WITH REPLACE;"; 
     SqlCommand bu3 = new SqlCommand(sqlStmt3, con); 
     bu3.ExecuteNonQuery(); 

     string sqlStmt4 = string.Format("ALTER DATABASE [" + database + "] SET MULTI_USER"); 
     SqlCommand bu4 = new SqlCommand(sqlStmt4, con); 
     bu4.ExecuteNonQuery(); 

     MessageBox.Show("database restoration done successefully"); 
     con.Close(); 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

详细说明请查看本教程:Backup & Restore Sql Server database using C#

+0

太棒了。节省了我的时间。和+1参考链接也:) – Mehmood 2016-12-26 17:31:45

0
RESTORE DATABASE [C] FROM DISK = 'D:\\Inventory.bak' WITH RECOVERY, 
MOVE 'Inventory_Data' 
TO 'C:\\Program Files\\Microsoft SQL Server\\MSSQL\\Data\\c_Data.MDF', 
MOVE 'Inventory_Log' 
TO 
'C:\\Program Files\\Microsoft SQL Server\\MSSQL\\Data\\c_Log.LDF', 
REPLACE, stats =1 

,你必须关心的唯一的事情,恢复是不是在MS SQL Server创建的数据库。在我的情况下,查询运行后,它应该创建一个名称为[C]的新数据库,并在[C:\\Program Files\\Microsoft SQL Server\\MSSQL\\Data\\]的路径上创建它的文件。