数据库连接的 .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 是 Open 和 Executing。
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 的二进制兼容性,而他们不会这样做。
当您手动管理数据库连接时,您总是打开和关闭它。有时您需要在执行某些操作之前检查连接是否具有某种状态。 一个经典的情况是在关闭连接之前检查是否为未关闭状态。 像
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 是 Open 和 Executing。
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 的二进制兼容性,而他们不会这样做。