处理数据库值的扩展方法

本文关键字:扩展 方法 数据库 处理 | 更新日期: 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?; }