c# - 从 IDataReader 获取值的 Null 安全方法

标签 c# extension-methods dbnull idatareader

(LocalVariable)ABC.string(Name) = (IDataReader)dataReader.GetString(0);

name 值来自数据库。

如果此 namenull,那么在读取它时会抛出异常吗?

我在这里手动做一些 if 条件。我不想编写手动条件来检查我的所有变量。

我现在正在做这样的事情..

String abc = dataReader.GetValue(0);
if (abc == null)
   //assigning null
else
   //assigning abc value

我们可以为此编写扩展方法吗?

最佳答案

这里有几个扩展方法,可以很好地解决您对从数据读取器检索强类型值的所有疑虑。如果值为 DbNull,则返回类型的默认值。如果 string 是一个类,将返回一个 null。如果该字段是 int,则将返回 0。此外,如果您期望 int?,比如来自可为 null 的 int 字段,将返回 null

Kumar 案例的具体用法:

string abc = datareader.GetValueOrDefault<string>(0);

一般用法

var name = GetValueOrDefault<string>(reader, "Name");

var name = reader.GetValueOrDefault<string>("Name");

var name = reader.GetValueOrDefault<string>(0);

扩展

public static class NullSafeGetter
{
   public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName)
   {
       int ordinal = row.GetOrdinal(fieldName);
       return row.GetValueOrDefault<T>(ordinal);
   }

   public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal)
   {
       return (T)(row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal));
   }
}

来自 http://skysanders.net/subtext/archive/2010/03/02/generic-nullsafe-idatarecord-field-getter.aspx

关于c# - 从 IDataReader 获取值的 Null 安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2609875/

相关文章:

c# - 继承:为什么改变一个对象的类型被认为是糟糕的设计?

扩展方法中的 C# out 参数

c# - 我应该如何调用重载的扩展方法?

c# - 我的第一个扩展方法,它能写得更好吗?

c# - Null 参数不适用于 Access 和 OLE

c# - 为什么签名程序集加载缓慢?

c# - 如何将带有多个条件(带有 LIKE)的 SQL SELECT INNER JOIN 查询写入 LINQ to SQL

c# - 对象不能从 DBNull 转换为构造函数中的其他类型

c# - 将 null 分配给 SqlParameter

c# - 如何使用 DataContractJsonSerializer 反序列化字典?