我发现自己从各种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值返回给对象属性?
答案 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?; }