SqlDataReader 关闭和 SqlConnection

SqlDataReader Close and 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();
    }
}

勾选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())

出于与上述相同的原因。

reader.Close() 不会关闭 SqlConnection,但由于您有一个 using 语句,一旦您退出 using 块,连接将无论如何都会关闭。

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

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

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

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

另请参阅 CommandBehavior 了解更多选项。