c# – 多个数据库插入的控制台应用程序上的ThreadAbortException
发布时间:2020-12-15 17:21:49 所属栏目:百科 来源:网络整理
导读:如果我尝试使用控制台应用程序中的线程一次执行一次 100个数据库插入,则会出现以下错误.根据当前的架构,我需要一次插入一个记录.对于较少数量的记录(10-30),不会发生错误.是否一次插入这么多记录会产生这个问题? 代码类似于: foreach (MyObject myObject i
如果我尝试使用控制台应用程序中的线程一次执行一次> 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 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |