微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 多个数据库插入的控制台应用程序上的ThreadAbortException

如果我尝试使用控制台应用程序中的线程一次执行一次> 100个数据库插入,则会出现以下错误.根据当前的架构,我需要一次插入一个记录.对于较少数量的记录(10-30),不会发生错误.是否一次插入这么多记录会产生这个问题?

代码类似于:

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,Boolean returnStream,Boolean async)    
 at System.Data.sqlClient.sqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,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)

解决方法

您将耗尽连接池资源.更改循环外的分配和创建.

更新

我已经更新了答案,表明需要在finally语句中执行sqlDatabase打开的连接的显式关闭

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
      }
   }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐