想知道獲取數據讀取器值的最佳做法是什麼。例如:ADO.NET - 獲取datareader值的最佳做法是什麼?
我一直在做這樣的:
MyValue = Dr("ColumnName")
但是已經注意到其他人在做:
MyValue = Dr.GetString("ColumnName")
我intested知道第二個方法
想知道獲取數據讀取器值的最佳做法是什麼。例如:ADO.NET - 獲取datareader值的最佳做法是什麼?
我一直在做這樣的:
MyValue = Dr("ColumnName")
但是已經注意到其他人在做:
MyValue = Dr.GetString("ColumnName")
我intested知道第二個方法
我一直在使用一個類似的東西一段時間,很好地做這個技巧的包裝。
RowHelper helper = new RowHelper(Dr);
MyValue = helper.IntColumn("ColumnName");
這樣做的好處是幫助器將返回NULL列的預定義默認值(這是可配置的)。我有適用於所有主要SQL數據類型的方法。
要回答你的問題,第二種方法具有一定的裝箱/拆箱的開銷,但它很可能是你的時間來優化這對於一個典型的業務應用程序的浪費。如果您知道列的索引
的DataReader的典型應用該類超支返回類型對象,因此您需要將值從DataReader轉換爲任何類型的MyValue,例如int
MyValue = (int)Dr("ColumnName");
或
MyValue = Convert.ToInt(Dr("ColumnName"));
或
MyValue = Dr("ColumnName").ToInt();
我不知道的性能差異,但我認爲這可能被理解爲微觀優化,除非工作非常大的數據集
的DbDataReader.GetString(int)方法只能使用。使用DbDataReader.GetString(「ColumnName」)是不可能的,因爲沒有這樣的重載。即您有以下兩種選擇:
string myValue1 = (string) Dr["ColumnName"];
string myValue2 = Dr.GetString(columIndex);
第一行內部調用DbDataReader.GetOrdinal(「ColumnName」)。
我爲一對夫婦的通用擴展方法:
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
值類型。
使用AutoMapper:
var dataReader = ... // Execute a data reader
var views = Mapper.Map<IDataReader, IEnumerable<SomeView>>(_dataReader);
這聽起來像一個很好的幫手。它是否在內部使用Dr.Get(String/Int/etc。)方法或它是否執行轉換? – cjk 2009-02-13 12:48:04