确保连接关闭

3

我想问一下使用数据库连接的常见方式和关闭它们的方法。

这是我的程序,但我在异常中看到连接.Close()将不会执行。

我应该在整个块中使用try-catch吗?因为某些原因,我看到大多数人并没有这样做。

using (SqlConnection connection = new SqlConnection(ConnectionString))
        {
            using (SqlCommand command = new SqlCommand())
            {
                command.CommandText = "procedure";

                command.Connection = connection;

                command.CommandType = CommandType.StoredProcedure;

                tmpParameter = DBUtils.createInSQLParam("@ImageID", SqlDbType.SmallInt, htmlImageId);
                command.Parameters.Add(tmpParameter);

                command.Connection.Open();

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    htmlImageDetails = GetHtmlImageDetailsFromReader(reader, true, out newId);

                    reader.Close();
                }

                connection.Close();

                return htmlImageDetails;
            }
        }

你看到了什么异常? - Richard Seal
这似乎回答了你的问题 - https://dev59.com/cm445IYBdhLWcg3wustT#4717802。 - nickfinity
在使用“using”时不需要添加关闭操作,连接/读取器会自动关闭。.net默认使用连接池,因此如果您释放了连接,它将被放入池中以供重用(这在大多数情况下可以提高性能)。 - Peter
在using块内,对象是只读的,不能被修改或重新分配。因此,当您关闭()时,可能会被视为对象的修改,因为在using块的结束}之后,close()是隐式的,因此会出现错误。 - Edper
只是为了澄清@Petoj所说的,当您调用Close()时,连接并没有关闭,它只是将连接返回到池中直到超时,然后才会真正关闭。(除非在创建连接时在连接字符串中告诉它不使用连接池) - Scott Chamberlain
3个回答

7

您不需要显式地执行这个操作,因为您的SqlConnection实例将始终由于using语法糖而被处理(然后关闭连接)。


2
“我应该为整个代码块使用 try-catch 吗?因为某些原因,我看到大多数人都不这样做。”
不需要。由于您正在使用 `using` 语句,它会转换为 `try-finally` 代码块,因此即使发生异常,它也会确保对象的处理。`using Statement (C# Reference)` 中提到:“`using` 语句确保在调用对象方法时即使出现异常也将调用 `Dispose` 方法。你可以通过将对象放在 try 块内并在 finally 块中调用 `Dispose` 来实现相同的结果;事实上,这就是编译器如何转换使用语句的方式。” `SqlConnection.Dispose` 确保连接被关闭。
为确保连接始终关闭,请在 using 块中打开连接,...... 这样做可以确保当代码退出块时,连接会自动关闭。

2
你正在使用 using 块打开连接,这意味着编译器会确保在连接上调用 Dispose() 方法,从而调用 Close() 方法。因此不用担心,在出现异常的情况下,你也不需要自己手动关闭连接。请保留 HTML 标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接