与检查行是否等于 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}
没有真正的实际好处。使用对您来说更具可读性的任何一个。
至于它们之间的特定差异,基本答案是IsNull
查询列中特定记录的空状态。Using== DBNull.Value
实际上检索该值并在它实际上为空的情况下进行替换。换句话说,IsNull
在不实际检索值的情况下检查状态,因此速度稍快(至少在理论上)。
如果您要使用自定义存储类型,则从理论上讲,列可能会返回空值以外的DBNull.Value
内容,但这永远不会完成(根据我的经验)。如果是这种情况,IsNull
将处理存储类型使用除 之外的其他内容的情况DBNull.Value
,但同样,我从未见过这样做过。
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 明确说明并使用它。
一方面,它减少了打字。除此之外,我认为它们是等价的。
试图澄清为什么我说它们是等价的。
[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"));
}
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)相关联,但我不是。
它使表在行中具有检查空值
if (! DBNull.Value.Equals(dataset.Tables["tablename"].Rows[n][0].ToString())) {
//enter code here
} else {
//enter code here
}