【问题标题】:Which of IsDBNull and IsNull should be used?应该使用 IsDBNull 和 IsNull 中的哪一个?
【发布时间】:2013-07-07 01:08:45
【问题描述】:

如果在VB.NET 我有DataRow 并且我想测试列值是否为Null,我应该使用:

myDataRow.IsNull("Column1")

IsDBNull(myDataRow("Column1"))

【问题讨论】:

  • 我认为你给出的两个例子在功能上是相同的

标签: .net vb.net null dbnull


【解决方案1】:

我将始终使用myDataRow.IsNull("Column1"),因为在发出SELECT 时,如果值为null,则返回为null 而不是DBNull

【讨论】:

  • 为什么null 会为SELECT 语句返回?是否为所有其他 SQL 语句返回 DBNull
  • @CJ7,当它被放入属性或数据行时,它被封送为空。
【解决方案2】:

使用IsDBNull IsNull 与 IsDBNull 略有不同。一个检查使用的数据库中的 DB Null 值,另一个检查 Null。

【讨论】:

    【解决方案3】:

    在处理 DataRow 数据时,最好使用 IsDBNull() 函数。 IsDBNull() 的优点是它检查您的对象是否表示 null,而不是简单地为 null 本身,这是一个重要的区别。当您查询数据库中为空的数据行项目时,项目本身作为对象存在,但它表示一个 NULL 值。如果你使用 IsNull() 你会错过 NULL 值。

    【讨论】:

      【解决方案4】:

      .NET 几乎从不会意外地为您提供两种方法来做同样的事情。 DataRow.IsNull() 更有效,它避免了必须检索列值然后检查 IsDBNull。在内部,它已经跟踪列是否为空,由创建行时确定。所以 IsNull() 可以很快地为您提供非常。因此,它应该是您的偏好。

      【讨论】:

        【解决方案5】:

        短答案:使用第一种方式,它更快,因为第一个方法使用预先计算的结果,而第二种方法每次调用它时需要在飞行中重新计算它。

        长答案 :(你需要读取c#代码来理解这一部分; MS在C#中提供框架代码,但VB程序员应该能够获得发生的事情的一般想法)

        这是在IsNull 987654322 @:

        的@ 987654321中发生的事情
        public bool IsNull(string columnName) {
            DataColumn column = GetDataColumn(columnName);
            int record = GetDefaultRecord();
            return column.IsNull(record);
        }
        

        column.IsNull 执行快速断言,并将调用转发到内部类 DataStorage

        internal bool IsNull(int record) {
            Debug.Assert(null != _storage, "no storage");
            return _storage.IsNull(record);
        }
        

        最后,_storage.IsNull 做了什么:

        public virtual bool IsNull(int recordNo) {
            return this.dbNullBits.Get(recordNo);
        }
        

        dbNullBitsBitArray,这个操作非常快速完成。

        现在考虑索引器myDataRow("Column1") dome(在将结果传递给IsDBNull)之前(您调用此索引器):

        get {
            DataColumn column = GetDataColumn(columnName);
            int record = GetDefaultRecord();
            _table.recordManager.VerifyRecord(record, this);
            VerifyValueFromStorage(column, DataRowVersion.Default, column[record]);
            return column[record];
        }
        

        注意IsNull 方法的前两行和索引器是相同的。但是,接下来的三行需要执行验证,并获取值本身。只有在此之后,您的代码可以开始计算其目标值 - 仅在其中表示值为DBNull @ @ @ @ @ @的标志。这需要更多的计算,但更重要的是,每次执行检查时都需要一些计算。这比使用预先计算的值要慢。

        【讨论】:

          【解决方案6】:

          从数据库设计和使用的角度来看,IsNull 是询问列值的正确且公认的方法,它基于各种数据库技术的使用,包括 SQL、DB2、OLAP、MOLAP、RDBMS、MDBMS、SPSS、 Essbase 等。根据定义,Null 是不存在值、未知数,并且 Null 甚至不等于 Null,因此 Null 的任何附加只是为了方便。

          【讨论】:

            【解决方案7】:

            我做了一些调查,发现了一些有趣的事实,这些事实可以更深入地了解 DataRow.IsNullIsDBNull 的用法。

            DataRow.IsNull - 获取一个值,该值指示指定的 DataColumn 是否包含空值。 Convert.IsDBNull - 返回指定对象是否为 DBNull 类型的指示。

            参考:DataRow.IsNullIsDBNull

            提供明确结论的最有趣的讨论可以来自Performance Consideration

            之前已经进行了几乎类似的讨论,以下是参考:

            Finding null value in dataset datarow isnull...

            Most efficient way to check for dbnull...

            Avoid checking for datarow isdbnull...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-04-11
              • 2014-12-21
              • 1970-01-01
              • 1970-01-01
              • 2011-02-14
              • 1970-01-01
              • 2022-11-20
              相关资源
              最近更新 更多