只是想知道获取datareader值的最佳做法是什么。例如:
我一直这样做:
MyValue = Dr("ColumnName")
但是注意到其他人在做:
MyValue = Dr.GetString("ColumnName")
我有兴趣知道第二种方法的好处
答案 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);