ADO.NET - 获取datareader值的最佳做法是什么?

时间:2009-02-13 10:34:23

标签: .net ado

只是想知道获取datareader值的最佳做法是什么。例如:

我一直这样做:

MyValue = Dr("ColumnName")

但是注意到其他人在做:

MyValue = Dr.GetString("ColumnName")

我有兴趣知道第二种方法的好处

5 个答案:

答案 0 :(得分:4)

只有知道列的索引才能使用DbDataReader.GetString(int)方法。使用DbDataReader.GetString(“ColumnName”)是不可能的,因为没有这样的重载。即你有以下两个选择:

 string myValue1 = (string) Dr["ColumnName"];
 string myValue2 = Dr.GetString(columIndex);

第一行内部调用DbDataReader.GetOrdinal(“ColumnName”)。

答案 1 :(得分:3)

我一直在使用一个类似的东西,有一段时间可以很好地完成这个操作的包装器。


     RowHelper helper = new RowHelper(Dr);
     MyValue = helper.IntColumn("ColumnName");

关于这一点的好处是帮助器将返回NULL列的预定义默认值(这是可配置的)。我有所有主要SQL数据类型的方法。

要回答你的问题,第二种方法有一些装箱/拆箱开销,但这可能会浪费你的时间来优化典型的商业应用程序。

答案 2 :(得分:3)

我为此做了几个通用的扩展方法:

public static class DataReaderExtensions
{
    public static T GetValueOrNull<T>(this IDataRecord reader, string fieldName)
        where T : class
    {
        int index = reader.GetOrdinal(fieldName);
        return reader.IsDBNull(index) ? null : (T)reader.GetValue(index);
    }
}

你得到了图片......我的值类型也有GetValueOrDefault

答案 3 :(得分:1)

DataReader返回类型对象,因此您需要将DataReader中的值转换为MyValue的任何类型,如果是int

MyValue = (int)Dr("ColumnName");

MyValue = Convert.ToInt(Dr("ColumnName"));

MyValue = Dr("ColumnName").ToInt();

我不确定性能差异,但我认为可以将其解释为微优化,除非处理非常大的数据集

答案 4 :(得分:0)

使用AutoMapper

var dataReader = ... // Execute a data reader
var views = Mapper.Map<IDataReader, IEnumerable<SomeView>>(_dataReader);