检查SQL连接是打开还是关闭


Answers:


175

您应该使用SqlConnection.State

例如,

using System.Data;

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

2
确切地+1-使用SqlConnectionState枚举作为枚举,而不是将其转换为字符串..
marc_s

4
应该添加using System.Data;答案,恕我直言。我忘记了这个名称空间(已using System.Data.SqlClient),并且在ConnectionState添加它之前不知道如何获得关键字。希望这对某人有帮助。
vapcguy 2015年

如果服务器(或本地计算机和服务器之间的某个设备)关闭了连接,这是否可行?
jpmc26 2016年

说不是更好if (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }吗?这样,如果连接为空,它也会被“关闭”。
Arvo Bowen

52

这是我正在使用的:

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/zh-cn/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


您应该测试是否mySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connecting可以避免由于连接速度慢而重置,不是吗?
caligari 2014年

@caligari虽然为true,但不保证DbConnection,因此,如果要编程为抽象DbConnection,请小心。
John Zabroski 2014年

1
我个人认为这是您要避免的问题。我也许可以在有状态的应用程序层中看到此代码段的用例,但从未在Web上看到过?
John Zabroski 2014年

John,这正是此代码的用例。代码运行可能正在提供页面的服务器应用程序,并连接到其他REST服务器。我看不到在Web应用程序的客户端代码中连接到服务器数据库的任何情况。
therealjumbo 2014年

有一个巨大的警告:1)随着本地存储成为一种事物,使用本地存储的Web应用迟早会(已经?)将使用该存储中的数据库。如果不是现在,他们很快就会。另一件事是,我的代码可能没有正确地推广到大型应用程序中。我的主要重点是嵌入式编程,因此我仍在服务器端学习。
therealjumbo 2014年

24

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

所以我认为你应该检查

!myConnection.State.HasFlag(ConnectionState.Open)

代替

myConnection.State != ConnectionState.Open

因为State可以有多个标志。


我想知道为什么这是带有标志的枚举。由于此枚举的Close项的值为零,因此State.HasFlag(ConnectionState.Close)将对任何值返回true。对我来说,这意味着我应检查“!=关闭”
Ivan


4
注意:我觉得有必要提及Ivan的链接提到您不应将其用作标志。看到这个特定的答案:stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

检查MySQL连接是否打开

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

返回始终为真的目的是什么?此时,使该方法无效。仅检查连接是否未打开,是否打开。还有...为什么要写两次return true;?把它放在方法的结束,外界if/ else
Massimiliano Kraus

如果出现网络问题,这些将给出错误的答案。您不确定打开是否确实会打开。
user613326 '18

@ user613326实际上,事实并非如此。示例代码中没有错误处理,因此连接时出现的任何问题都只会抛出并让您处理异常。因此,返回的值是正确的。
汤姆·林特

6

你也可以用这个

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

1
using System.Data;对于任何不知道或不知道为什么它不起作用的人
Coops 2013年

5

这段代码更具防御性,在打开连接之前,请检查状态。如果连接状态为“断开”,则应尝试将其关闭。断开意味着该连接先前已打开并且无法正常运行。第二个条件确定必须再次关闭连接状态才能尝试再次打开它,以便可以重复调用该代码。

// Defensive database opening logic.

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

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

只是更具防御性。
GBGOLC

1
在审核队列中:我可以要求您在答案周围添加更多背景信息。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,将对询问者和将来的读者都有帮助。另请参阅解释完全基于代码的答案
help-info.de

3

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

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

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
    }

-5

我使用以下方式 sqlconnection.state

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

7
connectionState.open()不存在 你的意思是ConnectionState.Open
彼得·里奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.