处理数据库值的扩展方法
本文关键字:扩展 方法 数据库 处理 | 更新日期: 2023-09-27 18:18:26
我发现自己从各种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
所以我认为一个扩展方法将是一个好主意(我从这个答案得到这个想法)....
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值的对象属性?
当然,只需使您的方法返回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];
}
您在扩展方法中的代码将始终返回一个整数,因为您使用合并操作符"??"来给出默认(int)值。如果你想让它返回null,只需移除操作符右侧的默认值(int)。
public static int? GetIntFromDB(this DataRow row, string columnName) { return row[columnName] as int?; }