【问题标题】:Check if SQL Connection is Open or Closed检查 SQL 连接是打开还是关闭
【发布时间】:2011-10-20 02:41:06
【问题描述】:

你如何检查我使用的是打开还是关闭

 if (SQLOperator.SQLCONNECTION.State.Equals("Open"))

但是,即使状态是“开放”,它也无法通过此检查。

【问题讨论】:

  • 这个问题和所有的答案真的没有任何意义:SqlConnection.State 只是告诉你过去是否打开了连接,它并没有告诉你服务器是否真的可用。无论如何都没有必要,您只需要创建一个新连接,然后使用using 进行处理

标签: c# ado.net sqlconnection


【解决方案1】:

你应该使用SqlConnection.State

例如,

using System.Data;

if (myConnection != null && myConnection.State == ConnectionState.Closed)
{
   // do something
   // ...
}

【讨论】:

  • +1 完全正确 - 使用 SqlConnectionState 枚举作为枚举,而不是将其变成字符串.....
  • 应该在答案中添加using System.Data;,恕我直言。我忘记了这个命名空间(有using System.Data.SqlClient),直到我添加它才知道如何将ConnectionState 作为关键字。希望这对某人有所帮助。
  • 如果服务器(或本地机器和服务器之间的东西)关闭了连接,这是否有效?
  • if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }不是更好吗?这样,如果连接为空,它也会“关闭”。
【解决方案2】:

要检查 OleDbConnection 状态,请使用:

if (oconn.State == ConnectionState.Open)
{
    oconn.Close();
}

State 返回ConnectionState

public override ConnectionState State { get; }

这是另一个ConnectionState枚举

public enum ConnectionState
    {
        //
        // Summary:
        //     The connection is closed.
        Closed = 0,
        //
        // Summary:
        //     The connection is open.
        Open = 1,
        //
        // Summary:
        //     The connection object is connecting to the data source. (This value is reserved
        //     for future versions of the product.)
        Connecting = 2,
        //
        // Summary:
        //     The connection object is executing a command. (This value is reserved for future
        //     versions of the product.)
        Executing = 4,
        //
        // Summary:
        //     The connection object is retrieving data. (This value is reserved for future
        //     versions of the product.)
        Fetching = 8,
        //
        // Summary:
        //     The connection to the data source is broken. This can occur only after the connection
        //     has been opened. A connection in this state may be closed and then re-opened.
        //     (This value is reserved for future versions of the product.)
        Broken = 16
    }

【讨论】:

    【解决方案3】:

    这段代码有点防御性,在打开连接之前,检查状态。 如果连接状态为 Broken,那么我们应该尝试关闭它。 Broken 表示连接之前已打开且无法正常运行。 第二个条件确定连接状态必须先关闭,然后再尝试再次打开,以便重复调用代码。

    // Defensive database opening logic.
    
    if (_databaseConnection.State == ConnectionState.Broken) {
        _databaseConnection.Close();
    }
    
    if (_databaseConnection.State == ConnectionState.Closed) {
        _databaseConnection.Open();
    }
    

    【讨论】:

    • 只是有点防御性。
    • 来自审核队列:我可以请求您在您的答案周围添加更多上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,它将帮助提问者和未来的读者。另请参阅Explaining entirely code-based answers
    【解决方案4】:

    .NET 文档说:State 属性:ConnectionState 值的按位组合

    所以我认为你应该检查一下

    !myConnection.State.HasFlag(ConnectionState.Open)
    

    而不是

    myConnection.State != ConnectionState.Open
    

    因为状态可以有多个标志。

    【讨论】:

    【解决方案5】:

    要检查数据库连接状态,您可以简单地执行以下操作

    if(con.State == ConnectionState.Open){}
    

    【讨论】:

      【解决方案6】:

      这是我正在使用的:

      if (mySQLConnection.State != ConnectionState.Open)
      {
          mySQLConnection.Close();
          mySQLConnection.Open();
      }
      

      我不简单使用的原因:

      if (mySQLConnection.State == ConnectionState.Closed)
      {
          mySQLConnection.Open();
      }
      

      是因为ConnectionState也可以是:

      Broken, Connnecting, Executing, Fetching
      

      除了

      Open, Closed
      

      此外,Microsoft 声明关闭,然后重新打开连接“将刷新 State 的值”。 看这里http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx

      【讨论】:

      • 你应该测试一下mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connecting 以避免因连接速度慢而重置,不是吗?
      • @caligari 虽然为真,但不能保证 DbConnection 存在,因此如果对抽象 DbConnection 进行编程,请小心。
      • 我个人认为这是你通过避免解决的问题。我也许可以在有状态的应用程序层中看到此代码 sn-p 的用例,但在 Web 上却看不到?
      • John,这正是这段代码的用例。运行可能提供页面的服务器应用程序的代码,连接到另一个 REST 服务器。我没有看到任何情况下我会在 Web 应用程序的客户端代码中连接到服务器数据库。
      • 有一个巨大的警告:1)随着本地存储现在成为一种东西,迟早(已经?)使用本地存储的网络应用程序将使用该存储中的数据库。如果不是现在,他们很快就会。另一件事是,我的代码可能没有被适当地概括为在大型应用程序中使用。我的主要关注点是嵌入式编程,所以我还在服务器端学习。
      【解决方案7】:

      检查 MySQL 连接是否打开

      ConnectionState state = connection.State;
      if (state == ConnectionState.Open)
      {
          return true;
      }
      else
      {
          connection.Open();
          return true;
      }
      

      【讨论】:

      • 返回always true的目的是什么?此时,使方法无效。仅,检查连接是否未打开,如果未打开,请打开它。还有……为什么要写两次return true;?放在方法的最后,if/else!
      • 如果出现网络问题,这些会给出错误的答案。你不能确定 open 确实会打开。
      • @user613326 实际上不会。示例代码中没有错误处理,因此连接时的任何问题都会简单地抛出并让您处理异常。因此返回的值是正确的。
      【解决方案8】:

      你也可以用这个

      if (SQLCON.State == ConnectionState.Closed)
      {
           SQLCON.Open();
      }
      

      【讨论】:

      • using System.Data; 对于不知道或不知道为什么它不起作用的人
      【解决方案9】:

      我用下面的方式sqlconnection.state

      if(conexion.state != connectionState.open())
         conexion.open();
      

      【讨论】:

      • connectionState.open() 不存在;你的意思是ConnectionState.Open
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多