【问题标题】:SqlDataReader Close and SqlConnectionSqlDataReader 关闭和 SqlConnection
【发布时间】:2017-07-20 19:52:45
【问题描述】:

在这种情况下,连接会发生什么?不知道 reader.Close() 是否关闭了打开的sqlconnection。

private static void ReadOrderData(string connectionString)
{
    string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;";

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Call Read before accessing data.
        while (reader.Read())
        {
            Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
        }

        // Call Close when done reading.
        reader.Close();
    }
}

【问题讨论】:

    标签: sql-server ado.net sqldatareader sqlconnection


    【解决方案1】:

    reader.Close() 不会关闭 SqlConnection,但是因为你有一个 using 语句,一旦你退出 using 块,连接无论如何都会被关闭。

    【讨论】:

      【解决方案2】:

      关闭阅读器不会改变连接状态。如果您确实想这样做,您可以将CommandBehavior.CloseConnection 传递给SqlCommand 实例的ExecuteReader 方法。

      SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
      

      建议您在所有一次性类型(如 SqlDataReader 实例)周围放置一个 using 块。

      using(SqlDataReader reader = command.ExecuteReader()) {
        // rest of code
      }
      

      更多选项请参见CommandBehavior

      【讨论】:

        【解决方案3】:

        查看Connection State

        if(connection.State == ConnectionState.Open)
        {
            connection.Close();
        }
        connection.Open();
        

        既然你这样做了

        using (SqlConnection connection =
                       new SqlConnection(connectionString))
            {
        

        这将确保连接被释放,因为它从 IDisposable 继承,尽管有异常。对象一旦退出相应的作用域就会被释放。

        更好的使用

        using(SqlCommand command = new SqlCommand(queryString, connection))
        

        using(SqlDataReader reader = command.ExecuteReader())
        

        出于与上述相同的原因。

        【讨论】: