【问题标题】:Making sure a connection is closed确保连接已关闭
【发布时间】:2013-12-10 22:58:14
【问题描述】:

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

这是我的程序,但我在异常中看到,connection.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;
            }
        }

【问题讨论】:

  • 你看到了什么异常?
  • 这似乎回答了你的问题 - stackoverflow.com/a/4717802/978528.
  • 使用“使用”时不需要关闭,连接/阅读器会自动关闭。 .net 默认使用连接池,因此如果您将其丢弃,连接不会关闭,它会被放入池中以供重用(这在大多数情况下会提高性能)。
  • 在 using 块中,对象是只读的,不能修改或重新分配。所以,也许当你 close() 被认为是对对象的修改时,因为 close() 在 using 块的关闭 } 之后是隐式的,因此会出现错误。
  • 只是为了澄清@Petoj 所说的在您调用Close() 时连接没有关闭,它只是将连接返回到池,直到超时然后真正关闭。 (除非您在创建连接时告诉它不要在连接字符串中使用连接池)

标签: c# sqlconnection


【解决方案1】:

您不必显式执行此操作,因为由于 using 语法糖,您的 SqlConnection 实例将始终被释放(然后连接关闭)。

【讨论】:

    【解决方案2】:

    您正在使用using 块打开连接,这意味着编译器将确保在连接上调用Dispose(),这将调用Close()。所以不用担心,您不需要自己Close() 连接,即使是Exception

    【讨论】:

      【解决方案3】:

      我应该对整个块使用 try-catch 吗?因为出于某种原因 我看到大多数人没有。

      没有。由于您使用的是using 语句,这将转换为try-finally 块,因此即使发生异常也会确保对象的处置。

      using Statement (C# Reference)

      using 语句确保 Dispose 被调用,即使 如果 当您在对象上调用方法时发生异常你 可以通过将对象放在 try 块中来达到相同的结果 然后在 finally 块中调用 Dispose;事实上,这就是 using 语句由编译器翻译。

      SqlConnection.Dispose 确保连接已关闭。

      为确保连接始终关闭,请打开连接 在using 块内,....... 这样做可以确保连接 代码退出块时自动关闭。

      【讨论】:

        猜你喜欢
        • 2016-07-18
        • 1970-01-01
        • 2021-09-01
        • 2013-05-31
        • 1970-01-01
        相关资源
        最近更新 更多