SqlDataReader关闭和SqlConnection

时间:2017-07-20 19:52:45

标签: sql-server ado.net sqldatareader sqlconnection

在这种情况下,连接会发生什么?我不知道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();
    }
}

3 个答案:

答案 0 :(得分:3)

reader.Close()不会关闭SqlConnection,但由于你有一个 using 语句,一旦退出using块,连接就会被关闭。

答案 1 :(得分:1)

检查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())

出于同样的原因。

答案 2 :(得分:1)

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

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

建议您在using个实例的所有可支配类型周围放置一个SqlDataReader块。

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

有关更多选项,另请参阅CommandBehavior