2011-11-18 39 views
4

如果我嘗試執行> 100的數據庫使用控制檯應用程序中的線程一次插入一個數據庫,則會出現以下錯誤。按照當前的體系結構,我需要一次插入一條記錄。對於較少數量的記錄(10-30),錯誤不會發生。一次插入這麼多的記錄是否會造成這個問題?多個數據庫插件上的控制檯應用程序上的ThreadAbortException

的代碼是一樣的東西:

foreach (MyObject myObject in myObjectCollection) 
{ 
    var database = new SqlDatabase(connectionString); 
    using (DbCommand command = database.GetStoredProcCommand(storedProcedureName)) 
    { 
     // Create parameters from myObject 
     // Add parameters to the command object   
     database.ExecuteNonQuery (command); 
    }  

} 

錯誤:

System.Threading.ThreadAbortException: Thread was being aborted.  
at SNIReadSync(SNI_Conn* , SNI_Packet** , Int32)  
at SNINativeMethodWrapper.SNIReadSync(SafeHandle pConn, IntPtr& packet, Int32 timeout)  
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)  
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()  
at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()  
at System.Data.SqlClient.TdsParserStateObject.ReadByte()  
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)  
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)  
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)  
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)  
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)  
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()  
at Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteNonQuery(DbCommand command)  
at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand command) 
+0

您妥善處理,你可能會被清空連接池的連接。 –

+0

@Ben,所有數據庫調用都使用相同的連接對象。這會造成這種情況嗎? – user1052927

+0

@ user1052927:如果您重複使用相同的連接,當然。嘗試將連接放在'使用'塊 – Icarus

回答

0

難道你觸發了DataBaseTimeout?嘗試在客戶端添加更高的TimoutNumber。

2

您將耗盡連接池資源。更改循環外部的分配和創建。

更新

我已經更新了答案,表明該SqlDatabase打開需要在finally語句來進行連接的明確的關閉:

SqlDatabase database = new SqlDatabase(connectionString); 
    try { 
     using (DbCommand command = database.GetStoredProcCommand(storedProcedureName)) { 
     // Create parameters from myObject 
     foreach (MyObject myObject in myObjectCollection) 
     { 
      // Add parameters to the command object   
      database.ExecuteNonQuery (command); 
     } 
     } 
    } finally { 
     if (database != null) { 
     // Do whatever is necessary here to explicitly close the connection to the database 
     } 
    } 
+1

SqlDatabase沒有實現IDisposable既不是基類「數據庫」。因此,SqlDatabase不能與使用塊一起使用。 – user1052927

+0

但是,我們不需要在SqlDatabase上使用「使用」塊,在DbCommand上使用「應用」應該釋放連接。 – user1052927

+0

@ user1052927:謝謝,我已經在那段代碼中已經有一段時間了,所以我不記得了。我已經更新了答案,以反映關閉與數據庫的連接非常重要。 –

0

你碰巧有Asynchronous Processing=true(或只是async=true)在您的連接字符串?如果你這樣做,嘗試刪除它。

另外,你是否嘗試過使用「純粹的」ADO.NET實現這個?

0

線程是後臺線程嗎?如果是這樣,Main()可能會在執行期間返回,這將中止後臺線程。

0

如果您使用的是EF,這裏的方法運行任何程序DB確保連接被關閉:

void EnsureClose<TObjectContext>(Action<TObjectContext> dbAction) where TObjectContext : ObjectContext, new() 
    { 
     using (var objContext = new TObjectContext()) 
     { 
      try 
      { 
       dbAction(objContext); 
      } 
      finally 
      { 
       objContext.Connection.Close(); 
      } 
     } 
    } 
相關問題