我尝试将数据库从联网的SQLServer复制到本地SQLExpress:
private void DoRestore()
{
if (!File.Exists(fileNach))
{
MessageBox.Show("Restore gescheitert " + fileNach);
return;
}
Restore res = new Restore();
Server srv = new Server(Environment.MachineName.ToString()+@"\SQLEXPRESS");
//MessageBox.Show("Ziel Server :"+srv.Name);
try
{
string fileName = @fileNach;
string databaseName = "Outdoor";
srv.KillAllProcesses(databaseName);
res.Database = databaseName;
res.Action = RestoreActionType.Database;
res.Devices.AddDevice(fileName, DeviceType.File);
res.ReplaceDatabase = true;
res.NoRecovery = true;
string odb;
string odblog;
odb = @"C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Outdoor.mdf";
odblog = @"C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Outdoor.ldf";
res.RelocateFiles.Add(new RelocateFile("Outdoor", odb));
res.RelocateFiles.Add(new RelocateFile("Outdoor_Log", odblog));
// restore starten
res.SqlRestore(srv);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
此代码在SQLExpress上启动恢复过程但永远不会结束。 mdf和日志文件在目标目录中创建,但还原不会完成。
我也试过srv.KillAllProcesses(databaseName);
,但没有结果。
在C#级别没有引发错误。
答案 0 :(得分:1)
你说它永远不会结束,是你看到你的代码完成但是数据库停留在“恢复”模式?如果是这样,我认为您希望恢复恢复,否则您将使数据库无法运行。尝试将NoRecovery设置为false而不是true:
res.NoRecovery = false;
来自here
通过回滚未提交的数据库使数据库可供使用 交易。无法还原其他事务日志。 (恢复恢复)
恢复数据库。此选项相当于RECOVERY Transact-SQL RESTORE语句中的选项。
仅当您没有所需的日志文件时才选择此选项 还原
让数据库无法运行,不要回滚 未提交的交易。其他事务日志可以是 恢复。 ( RESTORE WITH NORECOVERY )
使数据库处于未恢复状态。这个选项是 相当于在Transact-SQL RESTORE中使用NORECOVERY选项 言。
选择此选项时,保留复制设置 选项不可用。