ADO.Net DataReader 超时问题

6
我正在使用ADO.Net + C# + VSTS 2008 + ADO.Net连接SQL Server 2008 Enterprise。我几乎使用了这里提到的相同模式/示例——使用ADO.Net DataReader逐个获取数据项(行)。

http://msdn.microsoft.com/en-us/library/haa3afyz.aspx

我的问题是,如果我在此示例中设置SqlCommand超时, 1. 我认为超时应用于我们可以用作检索一行的最大值的时间,而不是整个数据逐个输入循环的总超时时间?

顺便说一下:我指的是循环。

while (reader.Read())
{
    Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
        reader.GetString(1));
}

2. 这个超时时间只与从数据库检索数据条目所需的时间有关,这个超时时间与我们处理每个条目所需的时间无关(例如,如果我们将超时时间设置为20秒,并且检索一个数据条目需要1秒钟,而我的应用程序逻辑需要30秒来操作该数据条目,则不会发生超时)。

理解正确吗?

2个回答

10

您可以设置的命令超时时间适用于您给予ADO.NET执行其任务的时间长度。

如果您调用的是cmdQuery.ExecuteNonQuery(),它不返回任何内容,但会执行一个SQL语句,这个超时时间就是执行该语句所需的时间。

如果您调用的是cmdQuery.ExecuteReader(),它返回一个数据读取器,那么这个超时时间就是ADO.NET设置/构建数据读取器所需的时间,以便您随后使用它。

如果您调用的是cmdQuery.ExecuteScalar(),它返回一个单个标量值,那么这个超时时间就是执行查询并获取该单个结果所需的时间。

如果您使用dataAdapter.Fill()来填充数据表或数据集,则这个超时时间是ADO.NET检索数据并填充数据表或数据集所需的时间。

因此总体而言:超时适用于ADO.NET可以完成的工作部分-执行语句、填充数据集、返回标量值。

当然,这适用于您迭代结果的时间(在数据读取器的情况下)。那样毫无意义...

Marc


谢谢Marc,1.您的意思是对于DataReader的情况,当我收到DataReader实例时,超时将不会产生任何影响吗?2.如果是这样,我的困惑是,我之前阅读过一些文档,对于DataReader,ADO.Net以流式方式检索数据,即在创建DataReader时并非从SQL Server检索所有数据。如果这是真的,那么ADO.Net客户端和SQL Server服务器之间应该有更多的传输吧?但是正如您所说,一旦创建了DataReader,超时就不再产生影响,因此没有超时控制来进行进一步的流式传输? - George2
我对上述评论的担忧是,有些客户端会长时间持有DataReader,而我认为在流模式下(因为ADO.Net无法预测客户端是否想要读取更多数据或者只是中断读取循环),连接将一直保持活动状态。我希望对这种行为进行超时控制,强制这种长时间存活的DataReader从ADO.Net关闭/释放连接。似乎SqlCommand(用于创建DataReader)的超时不是我要找的?谢谢。 - George2
1
你说得完全正确:如果你保持DataReader的开启时间很长,底层连接也会被保持同等时间。没有超时机制可以阻止你这样做 - 这是你的责任,确保不要让这个时间太长。 - marc_s
谢谢Marc,那我就要编写一些定制的代码了。问题已回答。 - George2

2

是的,你说得对。CommandTimeout 意味着数据库执行命令(任何命令)所需的时间。


让我困惑的是,对于 DataReader SqlCommand,我们可以逐个检索数据条目,但对于其他类型的 SqlCommand,我们一次检索所有数据。因此,对于 DataReader,超时仅适用于一个数据条目,而不是整个数据条目检索循环?如果您能确认一下就太感激了 :-) - George2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接