检查SQL连接是否打开或关闭

129

如何检查它是打开还是关闭,我一直在使用它。

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

然而,即使状态是“打开”的,它仍无法通过此检查。


1
这个问题和所有的答案都没有什么意义:SqlConnection.State只是告诉你连接是否在过去被打开过,它并不能告诉你服务器是否真正可用。而且这也不是必要的,你只需要创建一个新的连接,在使用完后用 using 进行释放即可。 - Charlieface
11个回答

215

你应该使用SqlConnection.State

e.g,

using System.Data;

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

2
+1 确切地说 - 使用 SqlConnectionState 枚举作为枚举,而不是将其转换为字符串。 - marc_s
6
在我的看法中,答案中应该加上 using System.Data;。我忘记了这个命名空间(只写了 using System.Data.SqlClient),所以在没有添加这个命名空间之前,我无法将 ConnectionState 作为关键字来使用。希望这可以帮助到其他人。 - vapcguy
如果服务器(或者本地机器和服务器之间的某个东西)关闭链接,这个还有效吗? - jpmc26
难道不应该这样说吗:if (myConnection == null || myConnection.State == ConnectionState.Closed) { //连接已关闭 } else { //连接以某种方式打开 }?这样,如果连接为null,它也是“关闭的”。 - Arvo Bowen

58

这是我正在使用的:

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

我不直接使用的原因是:

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

是因为 ConnectionState 也可以是以下情况:

Broken, Connnecting, Executing, Fetching

除了...之外

Open, Closed
此外,微软表示关闭并重新打开连接“将刷新状态的值。” 请参见此处 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
@caligari 在编程时,如果使用抽象的DbConnection,需要小心,因为它并没有提供任何保证。 - John Zabroski
1
我个人认为这是通过避免解决的问题类型。我可以看到在有状态的应用程序层中使用此代码片段的用例,但在Web上永远不会使用? - John Zabroski
我正在尝试使用上述代码,但它一直显示连接已打开。我想要做的是仅检查我的应用程序是否已打开连接... - Si8
如果(connection != null && connection.State == System.Data.ConnectionState.Closed) connection.Open(); - user13239154
显示剩余2条评论

30

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

因此我认为您应该进行检查。

!myConnection.State.HasFlag(ConnectionState.Open)

而不是

myConnection.State != ConnectionState.Open

因为不同的州可能拥有多面旗帜。


我在想为什么这是使用标志的枚举。由于此枚举的 Close 项的值为零,则 State.HasFlag(ConnectionState.Close) 对于任何值都将返回 true。对我来说,这意味着我应该检查是否为“!= Close”。 - Ivan
3
打开一个问题:https://dev59.com/IZTfa4cB1Zd3GeqPNjiq - Ivan
4
请注意,我觉得有必要提到 Ivan 提供的链接中指出,您不应将此用作标志。请参见此特定答案:https://dev59.com/IZTfa4cB1Zd3GeqPNjiq#35484965 - Brent Rittenhouse

13

检查 MySQL 连接是否打开

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

1
返回始终为true的目的是什么?此时,将该方法设置为void。只需检查连接是否未打开,如果未打开,则打开它。还有...为什么要写两次return true;?将其放在方法末尾,if/else之外! - Massimiliano Kraus
如果出现网络问题,这些操作可能会给出错误的答案。 你无法确定open操作是否确实打开。 - user613326
@user613326 实际上并不会。示例代码中没有错误处理,因此连接时出现的任何问题都将抛出并留给您处理异常。因此返回的值是正确的。 - Tom Lint

8
你也可以使用这个。
if (SQLCON.State == ConnectionState.Closed)
{
     SQLCON.Open();
}

1
对于那些不知道或不知道为什么它不起作用的人,可以使用 using System.Data; - Paul C

7

这段代码的防御性更强,在打开连接之前,先检查状态。如果连接状态为Broken,则应尝试关闭它。Broken表示连接先前已打开但未正常运行。第二个条件确定在尝试重新打开连接之前必须关闭连接状态,以便可以重复调用该代码。

// Defensive database opening logic.

if (_databaseConnection.State == ConnectionState.Broken) {
    _databaseConnection.Close();
}

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

只是更加谨慎一点。 - GBGOLC
1
从审核队列中:我可以请求您在您的答案周围添加更多的上下文吗?仅有代码的答案很难理解。如果您能在帖子中添加更多信息,这将有助于提问者和未来的读者。请参见解释完全基于代码的答案 - help-info.de

4

如果要检查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
    }

4

要检查数据库连接状态,只需执行以下简单操作:

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

0
检查连接状态的唯一有效方法是执行一个简单的查询(例如,在SqlServer中选择顶部1个yourfield from Table,或在mysql中选择yourfield from Table limit 1)。 我认为这是唯一有效的系统来测试连接状态。 如果你不相信我,在调试中试试这个: 在if条件之后设置一个断点。
if (oconn.State == ConnectionState.Open){
        oconn.Close(); //breakpoint here
    }

让程序一直运行到断点。 现在,拔掉局域网电缆或关闭无线网络,停止sqlserver或mysql服务,将编译器返回到前一个语句并重新测试连接。它仍然是打开状态。 除非对数据库执行任何操作,否则连接将始终保持打开状态。

0
is_connected();

这将返回一个布尔值,如果值为false,则连接仍然建立。如果值为true,则连接已关闭。

你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到有关如何撰写好的回答的更多信息。 - undefined

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