【问题标题】:.NET State of DB Connection.NET 数据库连接状态
【发布时间】:2016-02-18 14:01:33
【问题描述】:

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

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

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

如果你反编译 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?

【问题讨论】:

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


    【解决方案1】:

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

    注意:
    此枚举中的值并非旨在用作一组标志。

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

    【讨论】:

    • 打败我!!!我怎么能跳过这个。在询问之前我已经看过这个页面两次)))没有问题。
    【解决方案2】:

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

    在这种情况下,有时可能意味着 ConnectionState 是 Open 并且 Executing

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

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

    【讨论】:

    • 我明白了你的想法。但是关闭是程序员检查的重要状态。我的意思是 enum 应该编码为 enum ConnectionState { Undefined = 0, Closed =1.... }。关闭不是未定义的未知状态。 Closed 是已知和定义的状态,在连接关闭时在其他 System.Data 代码中显式分配
    • 我必须检查“!=关闭”,但“HasFlag(打开)”。这对你来说不丑吗?
    • 你说得对!根据this article,我们必须仅将 HasFlag 用于枚举类型的非零值。引用链接文章:如果 flag 的基础值为零,则该方法返回 true。如果此行为不可取,您可以使用 Equals 方法测试是否与零相等,并仅在 flag 的基础值非零时调用 HasFlag,如下例所示。
    • 那么我必须知道 Closed 是“未定义”的枚举元素。我怎么知道这个?只能反编译……不公平! =) 如果它是非托管代码,例如 C++,该怎么办。对我来说,这是一个小小的 API 故障
    • 我认为 HasFlag 是一个通用的实现,在这个特定的上下文中可能会失败。您可以将此报告给 .NET Framework 人员,看看他们想出了什么 :)
    【解决方案3】:

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

    0 0 0 0 0 
    B F E C O 
    
    Open = 1,
    Connecting = 2,
    Executing = 4,
    Fetching = 8,
    Broken = 16,
    

    【讨论】:

    • 您的意思是这里的逻辑是“如果不是其他状态则关闭”。好的,但是为什么它具有标志属性而不用作常量呢?对于其他多个州?嗯……
    • 我并不是要对此表示赞同。我可以撤销它吗?如何?编辑:投票被撤销:P
    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多