You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#从.bak备份恢复.mdf数据库?恢复代码故障排查

从.mdf文件恢复SQL Server数据库的问题修正

你的代码存在几个核心错误,直接导致恢复失败:

核心问题分析

  • 混用SQL Server与MySQL组件:.mdf是SQL Server的数据文件,但你错误使用了MySqlConnection、MySqlBackup这类MySQL专属组件,两者完全不兼容。
  • 恢复语句写反:代码中生成的是BACKUP DATABASE备份语句,而恢复需要用RESTORE DATABASE语句,逻辑完全颠倒。
  • 连接与操作逻辑混乱:打开了SQL Server的连接,但实际执行恢复的却是未打开的MySQL连接,操作对象完全错误。

修正后的恢复代码

以下是针对SQL Server数据库的正确恢复代码(假设你的.bak文件是通过SQL Server备份生成的):

private void restoreButton_Click(object sender, EventArgs e)
{
    try
    {
        OpenFileDialog op = new OpenFileDialog();
        op.Filter = "数据库备份文件|*.bak";
        op.Title = "选择备份文件";

        if (op.ShowDialog() == DialogResult.OK)
        {
            // 获取备份文件路径
            string backupFilePath = op.FileName;
            // 目标数据库名称
            string dbName = "Car_Database";
            // 连接到master库执行恢复操作(必须用master库上下文)
            string connString = @"Data Source=localhost;Initial Catalog=master;Integrated Security=True;";

            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                // 1. 将数据库设为单用户模式,避免恢复时被占用
                string setSingleUser = $"ALTER DATABASE [{dbName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE";
                using (SqlCommand cmd = new SqlCommand(setSingleUser, conn))
                {
                    cmd.ExecuteNonQuery();
                }

                // 2. 执行恢复命令
                string restoreCmd = $@"RESTORE DATABASE [{dbName}] 
                                      FROM DISK = N'{backupFilePath}' 
                                      WITH REPLACE, 
                                      RECOVERY";
                using (SqlCommand cmd = new SqlCommand(restoreCmd, conn))
                {
                    cmd.ExecuteNonQuery();
                }

                // 3. 恢复多用户模式
                string setMultiUser = $"ALTER DATABASE [{dbName}] SET MULTI_USER";
                using (SqlCommand cmd = new SqlCommand(setMultiUser, conn))
                {
                    cmd.ExecuteNonQuery();
                }

                conn.Close();
                MessageBox.Show("数据库恢复成功");
            }
        }
    }
    catch (Exception ex)
    {
        // 显示具体错误信息,便于排查问题
        MessageBox.Show($"恢复失败:{ex.Message}");
    }
}

关键说明

  • 必须连接master数据库执行恢复:恢复操作需要在系统库上下文完成,不能直接连接待恢复的目标数据库。
  • 单用户模式设置:避免恢复过程中数据库被其他进程占用,操作完成后需改回多用户模式。
  • WITH REPLACE参数:允许覆盖已存在的数据库,适合重新恢复场景。
  • 捕获具体异常:原代码仅提示通用错误,修改后显示具体异常信息,方便快速定位问题。

内容的提问来源于stack exchange,提问作者Ashen_Boy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:54:14