处理数据库值的扩展方法

时间:2014-08-18 16:46:54

标签: c# extension-methods dbnull

我发现自己从各种SQL对象(DataTable,SqlReader)中读取数据并分配给我自己的自定义对象。通常,我无法确定从数据库检索的数据是否为空或包含有效数据。虽然我使对象属性可以为空但我仍然无法将对象值赋给整数属性。

public int? ClientId{ get; set; }
this.ClientId = clientTable.Rows[0]["ID"];

在上述情况下,我无法将clientTable.Rows[0]["ID"]转换为int,因为该值可能为null

this.ClientId = (int)clientTable.Rows[0]["ID"]; // WARNING! value could be null

所以我认为扩展方法是个好主意(我从this SO answer得到了这个想法)....

public static int GetIntFromDB(this DataRow row, string columnName)
{
  return row[columnName] as int? ?? default(int);
}

使用...

调用扩展方法
this.ClientId = clientTable.Rows[0].GetIntFromDB("ID");

问题是Extension方法总是返回一个整数。有没有办法将NULL值返回给对象属性?

2 个答案:

答案 0 :(得分:5)

当然,只需让您的方法返回int?而不是int。哎呀,那就更简单了:

public static int? GetIntFromDB(this DataRow row, string columnName)
{
    return row[columnName] as int?;
}

我个人会稍微改变一下,以避免掩盖你从不同字段类型要求int的地方:

public static int? GetInt32FromDB(this DataRow row, string columnName)
{
    return row.IsNull(columnName) ? (int?) null : (int) row[columnName];
}

答案 1 :(得分:0)

扩展方法中的代码将始终返回一个整数,因为您使用的是coalesce运算符“??”给出默认(int)值。如果您希望它返回null,只需删除运算符右侧的默认值(int)。

  

public static int? GetIntFromDB(this DataRow row, string columnName) { return row[columnName] as int?; }