2011-08-30 130 views
0

我一直在努力工作数小时,试图找出为什么我无法让我的C#应用​​程序还原SQL Server 2008数据库。 我使用下面的代码:还原SQL Server数据库的问题

var conn = new SqlConnection("SERVER=Server;DATABASE=master;User ID=sa;Pwd=Password"); 
var srvConn = new ServerConnection(conn); 
var srv = new Server(srvConn); 

Restore res = new Restore(); 
res.Database = "RestoredDatabase"; 
res.Action = RestoreActionType.Database; 
res.Devices.AddDevice("Path to .bak-file", DeviceType.File); 
res.ReplaceDatabase = false; 
res.SqlRestore(srv); 

当我运行的代码没有任何反应。没有错误或例外发生!我一直在网上寻找一个解决方案,但所有的例子都是一样的,所以没有帮助。

它可能是连接问题,或者.bak文件可能存在问题?

令人惊讶的是,使用Microsoft.SqlServer.Management.Smo中的对象时,没有真正的调试功能,例如异常。

+1

尝试使用SQL来恢复它?你的恢复课是什么课程?命名空间? – TomTom

+1

尝试使用'ReplaceDatabase = true' - 如果数据库尚未存在,它不会伤害任何人... –

+0

您可能还想查看:http://www.codeproject.com/KB/database/ BackupRestoreWithSmo.aspx –

回答

0

这可能是一些权限问题,由于这种情况有时也不会发生还原。尝试使用您的用户名和密码访问的本地数据库恢复“.bak”文件。任何如何访问Sql BackupRestore网站以了解更多关于使用C#.net进行SQL备份的细节。希望它能帮助你。

+0

我使用相同的命名空间/类来创建具有相同用户/权限的.bak文件。应用程序与数据库不在同一台机器上运行,但.bak文件位于“DB-machine”上。 –

+0

完成数据库备份后,请确保通过Sql Server Management Studio连接到Sql服务器已关闭或未关闭,如果未关闭,则还原代码将不起作用。 –

1
  • 首先,尝试使用management studio选项恢复数据库,使用相同的认证信息和相同的.BAK。如果它不起作用,则问题不在您的代码上。
  • 如果第一个实验工作正常,并且已经创建了数据库,请确保在启动恢复之前没有人连接到它。您可以在Sql Server中执行sp_who2指令,以确保没有连接到该数据库。
1

如果您愿意,您也可以推出自己的代码。我在一些集成测试中使用它来将数据库恢复到干净状态。我将数据库重置为单用户模式,所以如果有人连接到它 - 它会将它踢掉,以便我可以恢复它。

StringBuilder sb = new StringBuilder(); 
sb.Append("ALTER DATABASE "); 
sb.Append(" ["); 
sb.Append(databasename); 
sb.Append("] "); 
sb.Append(" SET SINGLE_USER WITH ROLLBACK IMMEDIATE;"); 
sb.Append("RESTORE DATABASE "); 
sb.Append(" ["); 
sb.Append(databasename); 
sb.Append("] "); 
sb.Append(@" FROM DISK = N'D:\SQLBACKUPS\AUTOMATION\"); 
sb.Append(backupfilename); 
sb.Append("' WITH FILE=1, NOUNLOAD, REPLACE, STATS=10"); 
return sb.ToString(); 

然后,只需创建一个sql命令对象,并将字符串生成器的结果作为命令文本传递并执行。