我正在将SQL数据库备份和恢复部分插入到我的程序中。我一直在使用MSDN示例(尝试另一个,它不会工作)。 MSDN页面 - http://msdn.microsoft.com/en-us/library/ms162133.aspx
我有备份文件,并在Management Studio中测试了该文件。
但是我在恢复文件方面遇到了麻烦。
代码似乎正常工作,但SQL Server中的数据库停留在“正在恢复...”
if (openFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Server sqlServer = new Server();
Restore sqlRestore = new Restore();
sqlRestore.NoRecovery = true;
sqlRestore.Action = RestoreActionType.Database;
BackupDeviceItem deviceItem = new BackupDeviceItem(openFile.FileName, DeviceType.File);
sqlRestore.Devices.Add(deviceItem);
sqlRestore.Database = "firstRecoverTest";
sqlRestore.SqlRestore(sqlServer);
//Add the recovered database into the Entity Table
SqlCommand intoEntity = new SqlCommand("IF NOT EXISTS(SELECT entityName FROM Entitys WHERE entityName = 'firstRecoveryTest') INSERT INTO Entitys VALUES ('firstRecoveryTest');", sqlConnection);
sqlConnection.Open();
intoEntity.ExecuteNonQuery();
Database db = default(Database);
db = sqlServer.Databases["firstRecoverTest"];
db.RecoveryModel = (RecoveryModel)1;
db.AutoClose = true;
//db.Alter();
}
在示例中有一个db.Alter();函数,但是会抛出一个错误,上面写着“Alter failed for database'firstRecoverTest'”。
请让我知道你的想法
提前致谢
更新
插入“ReplaceDatabase = true;”后最终结果没有变化。 同时逐行逐步执行代码,表明它正在通过。
“db.Alter();”就是放在代码末尾的那个(显示为注释)。它用于创建备份并且无错误地工作。 使用db.Alter()时,InnerError显示此信息;
“数据库处于还原状态时不允许使用ALTER DATABASE”
有趣的部分是SQL日志文件。我得到3个日志:
“启动数据库'firstRecoverTest'。”
“数据库'firstRecoverTest'被标记为RESTORING,并且处于不允许运行恢复的状态。”
“数据库已恢复:数据库:firstRecoverTest,创建日期(时间):2011/09/20(15:44:48),第一个LSN:37:159:37,最后一个LSN:37:175:1,数字转储设备:1,设备信息:(FILE = 1,TYPE = DISK:{'C:\ Users \ Administrator \ Desktop \ installer_backup'})。信息性消息。无需用户操作。“
但是,当我使用SQL Management Studio进行正常恢复时,还有2个日志记录
“启动数据库'[databaseName]'。”
“数据库'[databaseName]'上的恢复已完成。数据库现已可用”
我没有足够的声誉来发布一个关于它如何在SQL Management Studio中出现的小图片。
答案 0 :(得分:4)
您应该尝试删除数据库或使用sqlRestore.ReplaceDatabase = true;
。
如果看起来没有发生任何事情,您可以在单独的线程中启动该过程,并通过使用这些事件来连接事件以通知进度更改。
sqlRestore.Complete += new ServerMessageEventHandler(completionEvent);
sqlRestore.PercentCompleteNotification = 10; // Call progress event every x percent change.
sqlRestore.PercentComplete += new PercentCompleteEventHandler(progressEvent);
如果这不起作用,请发布不起作用的Alter代码。另请检查SQL Server日志和权限。
<强>已更新强>
好的,更新更有意义。原因是因为您正在设置sqlRestore.NoRecovery = true;
。这样做的结果是,在完成还原之后,数据库将保持在恢复状态,因此除了刚恢复的完整备份之外,还可以还原其他差异备份。
当它处于此状态时,您将无法对数据库执行任何其他操作。我建议除非你需要它,否则你保留默认值NoRecovery = false
。
希望有所帮助。