16

与检查行是否等于 DbNull.value 相比,使用 c# 方法 DataRow.IsNull 确定空值有什么好处?

if(ds.Tables[0].Rows[0].IsNull("ROWNAME")) {do stuff}

对比

if(ds.Tables[0].Rows[0]["ROWNAME"] == DbNull.value) {do stuff}
4

5 回答 5

23

没有真正的实际好处。使用对您来说更具可读性的任何一个。

至于它们之间的特定差异,基本答案是IsNull查询列中特定记录的空状态。Using== DBNull.Value实际上检索该值并在它实际上为空的情况下进行替换。换句话说,IsNull在不实际检索值的情况下检查状态,因此速度稍快(至少在理论上)。

如果您要使用自定义存储类型,则从理论上讲,列可能会返回空值以外DBNull.Value内容,但这永远不会完成(根据我的经验)。如果是这种情况,IsNull将处理存储类型使用除 之外的其他内容的情况DBNull.Value,但同样,我从未见过这样做过。

于 2011-04-11T16:57:20.337 回答
8

DBNull.Value != null

DBNull.Value 代表具有 value 的列<NULL>。弹出一个表并返回一些行,查看任何行中的任何列是否包含<NULL>(ctrl 0) 值。如果您看到一个等效于 DBNull.Value。

如果您将值设置为 null 或 DBNull.Value,那么您将需要使用IsNull(). 如果值设置为 null 或 DBNull.Value,则返回 true。

考虑以下:

row["myCol"] = null;

row["myCol"] = DBNull.Value

if (row["myCol"] == DBNull.Value)//返回真

if (row["myCol"] == null)//返回假

if (row.IsNull("myCol"))//返回真

关键是如果您只是检查 null 或 DBNull.Value 使用 IsNull,如果您只是检查 DBNull.Value 明确说明并使用它。

于 2011-04-08T18:41:17.470 回答
4

一方面,它减少了打字。除此之外,我认为它们是等价的。

试图澄清为什么我说它们是等价的。

[Test()]
public void test() {
    var t = new System.Data.DataTable();
    t.Columns.Add("col1");
    var r = t.NewRow();

        // null is converted to DBNull.Value by DataRow
        r["col1"] = null;
        Assert.IsFalse(r["col1"] == null);
        Assert.IsTrue(r["col1"] == DBNull.Value);
        Assert.IsTrue(r.IsNull("col1"));

        // nullable types w/o values are also converted
        int? val = null;
        Assert.IsFalse(val.HasValue);
        r["col1"] = val;
        Assert.IsTrue(r["col1"] == DBNull.Value);
        Assert.IsTrue(r.IsNull("col1"));


}
于 2011-04-08T18:43:01.853 回答
0

FWIW,我写了一堆 DataRow 扩展方法——CastAsXXX()以避免不得不处理 DB 可空性......或者至少推迟一点 B^)。这是我的CastAsInt()CastAsIntNullable()方法:

#region downcast to int

public static int CastAsInt( this DataRow row , int index )
{
  return toInt( row[index] ) ;
}
public static int CastAsInt( this DataRow row , string columnName )
{
  return toInt( row[columnName] ) ;
}

public static int? CastAsIntNullable( this DataRow row , int index )
{
  return toIntNullable( row[index] );
}
public static int? CastAsIntNullable( this DataRow row , string columnName )
{
  return toIntNullable( row[columnName] ) ;
}

#region conversion helpers

private static int toInt( object o )
{
  int value = (int)o;
  return value;
}

private static int? toIntNullable( object o )
{
  bool hasValue = !( o is DBNull );
  int? value    = ( hasValue ? (int?) o : (int?) null ) ;
  return value;
}

#endregion conversion helpers

#endregion downcast to int

用法非常简单。您只需要预先说明您的期望。

DataRow dr = GetADataRowFromSomewhere() ;
// Throws NullReferenceException if the column is null
int     x  = dr.CastAsInt(         "column_1" ) ;
// Is perfectly happy with nulls (as it should be)
int?    y  = dr.CastAsIntNullable( "column_1" ) ;

我试图使它们通用,但没有骰子,除非我愿意将数据库中的 NULL 与类型的默认值(例如,数字类型为 0)相关联,但我不是。

于 2011-04-08T18:53:54.480 回答
0

它使表在行中具有检查空值

if (! DBNull.Value.Equals(dataset.Tables["tablename"].Rows[n][0].ToString())) {
    //enter code here
} else {
  //enter code here
}
于 2012-10-28T07:38:38.503 回答