【问题标题】:C# SQL when/how do I close the connection?C# SQL 何时/如何关闭连接?
【发布时间】:2014-07-16 18:37:04
【问题描述】:

我正在使用此代码:

public class SQLConnection : IConnection
{
    private SqlConnection _sqlConnection = null;

    //bunch of interface implementations for my project

    //the destructor
    ~SQLConnection()
    {
        if(_sqlConnection != null)
        {
            if(_sqlConnection.State == ConnectionState.Open)
            {
                _sqlConnection.Close();
            }
            _sqlConnection.Dispose();
        }
    }
}

这一直很好,直到前一段时间我开始收到此错误:Internal .Net Framework Data Provider error 1

在谷歌搜索了一下之后,我找到了this link(警告部分),我认为这就是发生在我身上的事情。 我的班级每次都在管理连接状态的打开和关闭,但现在我似乎无法以这种方式管理它,有没有其他方法可以做到这一点,而无需访问我使用连接的每个功能和显式调用connection.Close()

【问题讨论】:

标签: c# sql connection


【解决方案1】:

始终使用“使用”来安全地处理连接。

using(var _sqlConnection = new SqlConnection())
{
     //code here
     _sqlConnection.Open();
}


//Safely disposed.

此外,除非您有非托管代码,否则在 C# 代码中显式使用析构函数绝不是一个好主意。

【讨论】:

  • 我很久以前就应该采用这个标准,但我从来没有遇到过不使用(双关语无意)这个的任何问题......将它添加到所有块中需要一段时间在我的代码中连接,但我想我必须开始一些时间......谢谢!
【解决方案2】:

当一个代码尝试访问已被垃圾回收的 SQLConnection 时,您可能会收到此错误。这种情况通常会发生这种情况

 SqlConnection sqlConn;

 using (var sqlConnection = new SqlConnection())
 {
    sqlConn = sqlConnection;
    sqlConnection.Open();
 }

 sqlConn.Close();

我知道这个例子看起来很傻,因为它过于简化了,但是当程序员倾向于在管理类之间共享一个连接对象时,它经常发生。查找代码中最近的任何更改。也许您正在传递多个对象之间的连接实例。其中一个对象被垃圾收集,反过来连接也被释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多