SqlDataReader连接超时vs命令超时

时间:2017-02-14 02:14:03

标签: sql .net sql-server sqldatareader sqlconnection

我想了解连接超时和命令超时之间的关系以及如何影响其他关系。请将此代码视为示例。

// 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有关。

1 个答案:

答案 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块中包装连接,命令和阅读器,这样一旦你完成它们就会被处理掉。