循环时,ExecuteReader执行超时到期

时间:2017-08-07 08:37:46

标签: c# .net sql-server

之前我很抱歉,因为标题太笼统了。我只是想知道它在这段代码中是如何发生的:

foreach (var item in list)
{
     .........
     using (SqlCommand cmd = new SqlCommand(@"SELECT some_fields FROM tbl WHERE id=@id", new SqlConnection(db.ConnectionString)))
     {
           cmd.Connection.Open();
           cmd.Parameters.AddWithValue("@id", item.id);

           var reader = cmd.ExecuteReader();
           while (reader.Read())
           {
                //do something
           }
           cmd.Connection.Close();
     }
     .........
}

执行超时发生在第二个循环上。第一个循环没问题。这种语法有什么问题吗?请告诉我。

ExecuteReader()抛出异常:

   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader()
   at HPM_WEB.Areas.InventoryManagementForms.Transaction.OutboundTransaction.InsertOrUpdateDetailOutbound(MOutboundAdviseModel mout, List`1 doutList, SqlConnection connection, SqlTransaction transaction, String message) in F:\MyFolder\..\Transaction.cs:line 444

提前致谢

3 个答案:

答案 0 :(得分:0)

尝试增加连接超时

// Setting command timeout to 3 Minutes (60*3=180 Seconds)
cmd.CommandTimeout = 60*3;

ExecuteReader()

之前执行此操作

cmd.ExecuteReader();执行需要多长时间?

答案 1 :(得分:0)

在您的connectionstring中,您可能希望通过允许多个活动结果集来尝试。

看看这是否可以解决您的问题?像:

<add name="yourDBConn" connectionString="Data Source=yourInstance;Initial Catalog=yourDB;Persist Security Info=True;User ID=user;Password=pwd;Connection Timeout=30;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />

答案 2 :(得分:0)

值为0表示没有限制(尝试执行命令将无限期地等待)。

默认值为30秒。如果Read需要两个网络数据包,那么它有30秒的时间来读取两个网络数据包。如果再次调用Read,它将有30秒的时间来读取它需要的任何数据。(这是在到期超时之前存在的问题,它再次调用读者)

解决方案1正在增加连接超时或将值设置为零 另一个解决方案可能有用class Observer { public: virtual ~Observer() {} virtual void onNotify(int objectID, std::weak_ptr<Subject> caller, Event ev) = 0; private: };