【问题标题】:SQL Server backup&restoreSQL Server 备份和恢复
【发布时间】:2013-03-28 23:19:04
【问题描述】:

备份

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.");

此代码运行成功,但未进行任何更改。

【问题讨论】:

  • 你是如何验证代码确实被执行的?消息框触发了吗?
  • 文件C:\SRI2Works.bak真的写了吗?而且,实际上,您的还原命令仅执行 DBCC CHECKDB ('Database1'),它替换了上面一行中设置的 CommandText
  • @ThomasGerstendörfer 好收获! OP 应该使用 SQL Profiler 来验证是否实际发送了预期的命令。
  • 我不认为您可以对在 SQL Server Express 中使用AttachDbFileName= 附加的.mdf 文件使用通常的BACKUPRESTORE 命令。据我所知,您的数据库必须附加到 SQL Server 实例,才能使用BACKUP DATABASE... 进行备份
  • 签出How to Backup and Restore SQL Server Express databases - 附加的“自动附加”数据库名称与.mdf 文件(包括驱动器和目录)的完整路径相匹配在执行BACKUPRESTORE 时,您需要使用该完整路径作为数据库名称

标签: c# sql-server backup restore


【解决方案1】:

在恢复数据库中试试这个代码:

    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#

【讨论】:

  • 太棒了。节省了我的时间。和 +1 参考链接也:)
【解决方案2】:

例如,我们有 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);
        }

    }

【讨论】:

    【解决方案3】:

    从您的代码中删除以下语句:

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

    如果要覆盖现有数据库,请使用以下命令作为命令文本:

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

    【讨论】:

      【解决方案4】:
      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\\] 的路径中创建它的文件

      【讨论】:

        猜你喜欢
        • 2013-03-31
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多