2011-11-30 3 views
5

मेरे पास हमारे सॉफ़्टवेयर के डेमो के लिए डेटाबेस प्रबंधित करने के लिए उपयोग किया जाने वाला ऐप है, जो कुछ करता है वह केंद्रीय सर्वर से डेटाबेस की एक प्रति प्राप्त करता है और पुनर्स्थापित करता है यह एक स्थानीय एसक्यूएल उदाहरण के लिए। सबकुछ बैकअप भाग पर सही तरीके से काम करता है लेकिन पुनर्स्थापित करने पर कुछ लोग रिपोर्ट कर रहे हैं कि उन्हें पुनर्स्थापित के बीच में निम्नलिखित अपवाद मिलता है।SMO.Restore.SqlRestore कभी-कभी तैनात कंप्यूटर पर एक टाइमआउट अपवाद फेंकता है

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) 

MSDN is fairly light एसएमओ वर्गों के भीतर काम कर रहे हैं। मुझे पुनर्स्थापना निष्पादित करने के लिए टाइमआउट समय बदलने के लिए कोई विधि नहीं मिली। मैं क्या कर सकता हूं ताकि अपवाद नहीं होगा?


यहाँ कोड बहाल

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); 
} 
+0

आप कर सकते हैं Reprod यह व्यक्तिगत रूप से है? डेटाबेस आकार एक कारक है? क्या कोई वास्तव में विशाल बाइनरी फ़ील्ड हैं जो इसका कारण बन सकती हैं? क्या समय-सारिणी लगातार समय अवधि के बाद होती है? यदि आप वास्तव में अटक गए हैं, तो हो सकता है कि आप रिफ्लेक्टर का उपयोग करके वास्तविक असेंबली में खुदाई कर सकें, यह देखने के लिए कि वे कैसे काम करते हैं (और इसे प्रतिलिपि बनाते हुए, संभवतः प्रतिबिंब (निजी/आंतरिक सदस्यों को पाने के लिए), उच्च समय के साथ)। क्या आपने [यह] देखा है (http://stackoverflow.com/q/5979086/21475)? – Cameron

उत्तर

8

धन्यवाद Camerons सुझाव इस समस्या का हल था मैं ServerConnection.StatementTimeout उच्च निर्धारित करने की आवश्यकता है कि प्रदर्शन कर रहा है। स्पष्ट रूप से यह तब होता है जब डेटाबेस 3 जीबी से बड़े होते हैं।

(...) 
serverConn = new ServerConnection(serverConnInfo); 
serverConn.StatementTimeout = 240; //<- set this. 
var remoteServer = new Server(serverConn); 
var clinicFolder = ClinicFolder(arg); 
(...) 
0

यू इस इस्तेमाल कर सकते हैं, विशेष रूप से आप कनेक्शन स्ट्रिंग या कनेक्शन स्ट्रिंग में समय समाप्ति के संशोधन काम नहीं करता है संशोधित नहीं कर सकते जब यह मेरे लिए एक मिरर डेटाबेस के लिए 2 से अधिक काम करता है जीबी

का उपयोग करना (SqlConnection1)

मंद sqlStmt स्ट्रिंग के रूप में = String.Format (, backup_directory + backupfile "बैकअप डेटाबेस डिस्क = '{0}' के लिए नक्शा")

  Using bu2 As New SqlCommand(sqlStmt, SqlConnection1) 
       SqlConnection1.Open() 
       bu2.CommandTimeout = 180 //this line is the key 
       bu2.ExecuteNonQuery() 
       SqlConnection1.Close() 
      End Using 
     End Using 
+1

हां, स्टेटमेंटटाइमआउट कमांडटाइमआउट के लिए नक्शे, हालांकि यह सवाल एसएमओ का उपयोग करने के बारे में नहीं था SqlCommand –

संबंधित मुद्दे