我想了解连接超时和命令超时之间的关系以及如何影响其他关系。请将此代码视为示例。
// declare the SqlDataReader, which is used in
// both the try block and the finally block
SqlDataReader rdr = null;
// create a connection object
SqlConnection conn = new SqlConnection("someconnstr");
// create a command object
SqlCommand cmd = new SqlCommand("select * from dbo.mytable", conn);
try
{
// open the connection
conn.Open();
// 1. get an instance of the SqlDataReader
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
// get the results of each column
Guid Id = (Guid)rdr["Id"];
string displayName = (string)rdr["Name"];
// print out the results
Console.WriteLine("{0}, {1}", Id, displayName);
}
Console.WriteLine("Reading done");
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
根据MSDN link,命令超时是所有读取的累积超时。这意味着如果再次调用Read(),则还需要30秒才能完成。我想以这样一种方式设置超时,即我可以对所有记录施加最大超时。
连接超时是否适合这样做?在给定的示例中,如果我将连接超时设置为120秒并且while循环未在120秒内完成,它是否会抛出超时错误?
此问题与Stackoverflow question有关。
答案 0 :(得分:2)
我想以这样的方式设置超时,即我可以对所有记录施加最大超时。连接超时是否适合这样做?
否 - 连接超时是打开连接所需的最大数量。建立连接后,它与操作无关。
。这意味着如果再次调用Read(),还需要30秒才能完成。
可能 - 它取决于每次读取所需的网络数据包数量。你引用的那句之前的句子说明:
此属性是在命令执行或处理结果期间对所有网络读取的累积超时(对于在方法调用期间读取的所有网络数据包)。例如,如果时间为30秒,如果
Read
需要两个网络数据包,那么它有30秒的时间来读取两个网络数据包。
可能所有数据都可以在一个数据包中读取,而您只需要一次网络读取。
如果您希望while
循环超时,则需要添加变量并在while
循环中进行检查:
DateTime maxTime = DateTime.Now.AddSeconds(timeout)
while(rdr.Read())
{
if(DateTime.Now > maxTime)
// do something
}
我也习惯在using
块中包装连接,命令和阅读器,这样一旦你完成它们就会被处理掉。