.NET状态的数据库连接

时间:2016-02-18 14:01:34

标签: c# .net ado.net database-connection

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

这样的东西
if (connection.State != ConnectionState.Closed)
    connnection.Close();

MSDN表示ConnectionState是枚举WITH FLAGS。这意味着连接状态可以同时具有不同的状态。可能会被打破+关闭或其他...

如果您反编译System.Data.ConnectionState枚举,您将看到

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

已结算商品的价值为零。这意味着以下总是如此:

connection.State.HasFlag(ConnectionState.Closed)

因此。有什么建议为什么这个枚举有Flags属性?或者(如果此枚举必须是Flags)为什么Closed项目有0值?

3 个答案:

答案 0 :(得分:8)

我相信他们计划使用基于标志的枚举的原始.NET 1.1实现,但是如果你看一下注释in the remarks section

  

注意:
  此枚举中的值不能用作一组标志。

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

答案 1 :(得分:2)

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

在这种情况下,有时可能意味着ConnectionState为打开正在执行

已关闭的值被指定为零,因此它可能并不意味着ConnectionState既关闭又打开。

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

答案 2 :(得分:0)

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

0 0 0 0 0 
B F E C O 

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