Sco*_*ain 5 c# sql-server smo sql-server-2005
我有一个应用程序用于管理我们软件演示的数据库,它所做的一件事是从中央服务器获取数据库的副本并将其还原到本地SQL实例.一切都在备份部分正常工作,但在恢复时,有些人报告说他们在恢复过程中遇到以下异常.
Microsoft.SqlServer.Management.Smo.FailedOperationException: Restore failed for Server 'Computername'.
---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:
An exception occurred while executing a Transact-SQL statement or batch.
---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
(snip)
at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType)
--- End of inner exception stack trace ---
at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType)
(snip)
at Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(Server srv)
--- End of inner exception stack trace ---
at Microsoft.SqlServer.Management.Smo.Restore.SqlRestore(Server srv)
at ContractFlowTool.WebInfinity2.AttachDatabase.RestoreLocal(AttachDatabaseArgs arg)
Run Code Online (Sandbox Code Playgroud)
在MSDN是相当轻的SMO类的内部工作.我找不到任何方法来更改执行还原的超时时间.我该怎么做才能解除异常?
以下是执行还原的代码
private static bool RestoreLocal(AttachDatabaseArgs arg)
{
if (arg.DestDatabase == null)
throw new ArgumentNullException("DestDatabase");
SqlConnectionInfo serverConnInfo = new SqlConnectionInfo(/*snip*/);
ServerConnection serverConn = null;
serverConn = new ServerConnection(serverConnInfo);
var remoteServer = new Server(serverConn);
var clinicFolder = ClinicFolder(arg);
var restore = new Restore();
restore.PercentCompleteNotification = 5;
restore.NoRecovery = false;
restore.RelocateFiles.Add(/*snip mdf*/);
restore.RelocateFiles.Add(/*snip ldf*/);
restore.Database = arg.LocalDB;
restore.ReplaceDatabase = true;
restore.Action = RestoreActionType.Database;
restore.PercentComplete += arg.ProgressForm.Restore_PercentComplete;
restore.SqlRestore(remoteServer);
}
Run Code Online (Sandbox Code Playgroud)
感谢Camerons建议解决这个问题的方法是我需要设置ServerConnection.StatementTimeout更高.显然,当数据库大于3GB时,这种情况经常发生.
(...)
serverConn = new ServerConnection(serverConnInfo);
serverConn.StatementTimeout = 240; //<- set this.
var remoteServer = new Server(serverConn);
var clinicFolder = ClinicFolder(arg);
(...)
Run Code Online (Sandbox Code Playgroud)