代码之家  ›  专栏  ›  技术社区  ›  Palantir

得到情报?使用DbDataReader从数据库

  •  2
  • Palantir  · 技术社区  · 14 年前

    有什么聪明的方法来缩写这种淫秽行为吗?它工作了,但它不可读。。。

    int? myVal = r.IsDBNull(r.GetOrdinal("colName")) ? (int?)null : r.GetInt32(r.GetOrdinal("colName"));
    

    谢谢:)

    3 回复  |  直到 14 年前
        1
  •  6
  •   adrianbanks    14 年前

    您可以将该代码放入 DbDataReader (或者更好的 IDataReader 它实现的接口)。这样,看起来糟糕的代码就隐藏在一个更漂亮的GetNullableInt32()调用后面:

    public static class IDataReaderExtensions
    {
        public static int? GetNullableInt32(this IDataReader r, string columnName)
        {
            int? myVal = r.IsDBNull(r.GetOrdinal(columnName)) 
                            ? (int?) null : 
                            r.GetInt32(r.GetOrdinal(columnName));
            return myVal;
        }
    }
    

    然后,您可以使用:

    IDataReader reader = ...;
    int? value = reader.GetNullableInt32("colName");
    

    正如伊恩指出的,最好打电话 r.GetOrdinal() 只有一次:

    public static class IDataReaderExtensions
    {
        public static int? GetNullableInt32(this IDataReader r, string columnName)
        {
            int ordinal = r.GetOrdinal(columnName);
            int? myVal = r.IsDBNull(ordinal) 
                            ? (int?) null : 
                            r.GetInt32(ordinal);
            return myVal;
        }
    }
    
        2
  •  2
  •   Community CDub    8 年前

    进一步 Adrian's answer ,您可以创建泛型扩展方法以满足所有类型的需要:

    int? myVal = r.GetValue<int?>("colName");
    
    // ...
    
    public static class DataReaderExtensions
    {
        public static T GetValue<T>(this IDataReader dr, string columnName)
        {
            return dr.GetValue<T>(dr.GetOrdinal(columnName));
        }
    
        public static T GetValue<T>(this IDataReader dr, int columnOrdinal)
        {
            // does the column contain null?
            if (dr.IsDBNull(columnOrdinal))
            {
                // is T either a ref type or a nullable value type?
                Type t = typeof(T);
                if (!t.IsValueType || (Nullable.GetUnderlyingType(t) != null))
                {
                    // return null
                    return default(T);
                }
            }
    
            // get the column value, cast it as T and return it
            // this will throw if the value isn't convertible/unboxable to T
            return (T)dr.GetValue(columnOrdinal);
       }
    }
    
        3
  •  0
  •   Neil Barnwell    14 年前

    不是真的。我经常把这段代码放到一个方法中并调用它。这个方法最终可能会出现在一个普通的“helper”类中,或者甚至可能是一个扩展方法(尽管我个人并不喜欢这些方法,因为它们很难被其他人发现)。