Yazılımımızın demoları için veritabanlarını yönetmek için kullanılan bir uygulamam var, yaptığı şeylerden biri veritabanının bir kopyasını merkezi sunucudan almak ve geri yüklemek. yerel bir SQL örneğine. Her şey yedek kısımda doğru şekilde çalışıyor ancak geri yükleme sırasında bazı insanlar geri yükleme işleminin ortasında aşağıdaki istisnaları aldıklarını bildiriyorlar. SMO.Restore.SqlRestore bazen dağıtılan bilgisayarlarda bir zaman aşımı istisnası atar
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)
SMO sınıfları iç çalışma ile MSDN is fairly light
. Geri yüklemeyi yürütmek için zaman aşımı süresini değiştirmek için herhangi bir yöntem bulamadım. Ne yapabilirim ki istisna olmayacak?İşte bu sorunun çözümü, ben ServerConnection.StatementTimeout
yüksek ayarlamanız gerekir olmasıydı Camerons öneriye
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);
}
size Can REPROD Bunu şahsen mi yaptın? Veritabanı boyutu bir faktör mü? Buna neden olabilecek gerçekten büyük ikili alanlar var mı? Zaman aşımı tutarlı bir zaman aralığından sonra ortaya çıkıyor mu? Eğer gerçekten sıkışmışsanız, nasıl çalıştığını (ve muhtemelen yansıtma yoluyla (özel/dahili üyelere ulaşmak için), daha yüksek bir zaman aşımıyla) görmek için Reflector'u kullanarak gerçek meclisleri kazmaktan biraz şansınız olabilir. Bunu gördünüz mü (http://stackoverflow.com/q/5979086/21475)? – Cameron