如果我尝试使用控制台应用程序中的线程一次执行一次> 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] 举报,一经查实,本站将立刻删除。