如何用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
相关产品推荐
相关产品推荐

