Wpf SMO:服务器';的还原失败';
我正在使用以下SMO代码尝试还原SQL Server数据库:Wpf SMO:服务器';的还原失败';,wpf,sql-server,c#-4.0,restore,smo,Wpf,Sql Server,C# 4.0,Restore,Smo,我正在使用以下SMO代码尝试还原SQL Server数据库: Server _server; ServerConnection _conn; public void Restore(string destinationPath) { Restore res = new Restore(); _conn = new ServerConnection { ServerInstance = "." }; _server = new Server(_conn); try
Server _server;
ServerConnection _conn;
public void Restore(string destinationPath)
{
Restore res = new Restore();
_conn = new ServerConnection { ServerInstance = "." };
_server = new Server(_conn);
try
{
string fileName = destinationPath;
const string databaseName = "RelationAtOffice";
res.Database = databaseName;
res.Action = RestoreActionType.Database;
res.Devices.AddDevice(fileName, DeviceType.File);
res.PercentCompleteNotification = 10;
res.ReplaceDatabase = true;
res.PercentComplete += new PercentCompleteEventHandler(ProgressEventHandler);
res.SqlRestore(_server);
System.Windows.Forms.MessageBox.Show("Restore of " + databaseName + " Complete!", "Restore", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (SmoException exSMO)
{
System.Windows.Forms.MessageBox.Show(exSMO.ToString());
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
}
}
为什么要将下面的代码链接到正确答案。但是我的代码不起作用了?
代码就像在一起。我使用了wpf和下面的链接用户winapp
SMO错误:
Microsoft.SqlServer.Management.Smo.FailedOperationException:还原
服务器“MORTEZA”失败。--->Microsoft.SqlServer.Management.Smo.Smo异常:
System.Data.SqlClient.SqlError:无法获得独占访问权限 因为数据库正在使用中。
位于Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQueryWithMessage(StringCollection 查询,ServerMessageEventHandler dbccMessageHandler,布尔值 错误消息)
位于Microsoft.SqlServer.Management.Smo.BackupRestoreBase.ExecuteSql(服务器 服务器,StringCollection查询)
在Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(服务器srv)上
在RelationAtOfficeApp.Admin.AdministratorMainPage.Restore(字符串 目的路径)在 E:\prozhe\RelationAtOfficeApp\RelationAtOfficeApp\RelationAtOfficeApp\Admin\AdministratorMainPage.xaml.cs:第268行
最可能的原因是:
- 您已从服务器进行备份-已将
和Data.mdf
备份到Data\u Log.ldf
文件中backup.bak
- 在同一台(服务器)计算机上,您现在正尝试恢复同一个数据库
.mdf
和.ldf
,但这不会发生,因为SQL Server仍控制着该数据库,因此恢复失败,因为无法覆盖数据和日志文件
有两种方法可以解决此问题:
....
res.Devices.AddDevice(fileName, DeviceType.File);
// define "file relocation" - for all "logical" files in a SQL Server database,
// define a new physical location where the file will end up at
RelocateFile relocateDataFile = new RelocateFile("Data", @"(your data dir)\RestoredData.mdf");
RelocateFile relocateLogFile = new RelocateFile("Log", @"(your log dir)\Data\RestoredData_log.ldf");
res.RelocateFiles.Add(relocateDataFile);
res.RelocateFiles.Add(relocateLogFile);
res.ReplaceDatabase = true;
打电话之前
res.SqlRestore(_server);
还原
命令上的FILELISTONLY
选项,从而在还原.bak
文件之前检查该文件。试着这样做:
RESTORE FILELISTONLY
FROM DISK = N'path-and-full-file-name-of-your-bak-file-here.bak'
这将为您提供一个小网格,其中包含.bak
文件中包含的逻辑和物理文件名对象资源管理器
,找出数据库的逻辑文件名;右键单击您选择的数据库,然后您将看到此对话框,在文件
部分,您将获得要查找的信息:.SqlRestore()前面添加一行代码时出现的“数据库正在使用”错误:
这将模拟与Sql Server Management Studio还原完全相同的行为:
您能复制准确的错误消息吗?错误消息:服务器“King”的还原失败您正在尝试还原到现有数据库,但仍有人在其中。“某人”可以是您自己的会话之一,因此请确保其中没有一个会话持续存在于该数据库中;res.SqlRestore(_服务器);但这是错误:Microsoft.SqlServer.Management.Smo.FailedOperationException:服务器“MORTEZA”的还原失败。-->Microsoft.SqlServer.Management.Smo.Smo异常:System.Data.SqlClient.SqlError:无法获得独占访问权限,因为数据库正在使用中。at@MMDMNC:我在回答中展示了两种解决方案-尝试解决方案#1!使用Restore
上的RelocateFiles
属性…错误尝试解决方案#1:smo:Microsoft.SqlServer.Management.smo.FailedOperationException:服务器“MORTEZA”的还原失败。-->Microsoft.SqlServer.Management.Smo.Smo异常:System.Data.SqlClient.SqlError:逻辑文件“Data”不是数据库“RelationaOffice”的一部分。使用RESTORE FILELISTONLY可列出逻辑文件名。在Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteOnQueryWithMessage(StringCollection查询、ServerMessageEventHandler dbccMessageHandler、Boolean errorsAsMessages)…@MMDMNC:在这种情况下,您的文件具有不同的逻辑文件名-您需要找出这些文件名是什么(使用该命令-仅还原文件列表
),然后在SMO应用程序中使用正确的逻辑文件名!
_server.KillAllPrecesses("MyDatabaseName");
res.SqlRestore(_server);