数据库连接的 .NET 状态

.NET State of DB Connection

当您手动管理数据库连接时,您总是打开和关闭它。有时您需要在执行某些操作之前检查连接是否具有某种状态。 一个经典的情况是在关闭连接之前检查是否为未关闭状态。 像

if (connection.State != ConnectionState.Closed)
    connnection.Close();

正如 MSDN 所述,ConnectionState 是带标志的枚举。这意味着连接状态可以同时具有不同的状态。可能是 Broken+Closed 或其他原因...

如果你反编译 System.Data.ConnectionState enum 你会看到

[Flags]
public enum ConnectionState
{
    Closed = 0,
    Open = 1,
    Connecting = 2,
    Executing = 4,
    Fetching = 8,
    Broken = 16,
}

已关闭项目的值为零。这意味着以下始终为真:

connection.State.HasFlag(ConnectionState.Closed)

所以。有什么建议为什么这个枚举有 Flags 属性吗?或者(如果这个枚举必须是标志)为什么 Closed item 有 0 值?

零表示未选择任何内容。 如果打开 00001,如果连接 00010,如果打开 AND 连接 00011 ....

0 0 0 0 0 
B F E C O 

Open = 1,
Connecting = 2,
Executing = 4,
Fetching = 8,
Broken = 16,

枚举的 [Flags] 属性允许您一次为枚举分配多个值,否则这是不可能的。您可以通过按位操作来执行此操作,这意味着您可以存储一个包含 A 和 C 集(同时设置)的枚举,而不仅仅是 A 也不仅仅是 C。

在这种情况下,它有时可能意味着 ConnectionState 是 OpenExecuting

Closed 的值被分配为零,因此它可能永远不会意味着 ConnectionState 既是 Closed 又是 Open。​​

This post将就此事提供更多说明。

我相信最初的 .NET 1.1 实现,他们计划将其作为基于标志的枚举,但是如果您查看注释 in the remarks section[,我认为当前的实现不是这样使用的=14=]

Note:
The values in this enumeration are not designed to be used as a set of flags.

您无需检查标志,直接 == 测试是安全的。他们没有删除 Flags 属性,因为它会破坏与 .NET 1.1 的二进制兼容性,而他们不会这样做。