2009-02-13 2 views
4

Просто интересно, что лучше всего подходит для получения значений datareader. Например:ADO.NET - Какова наилучшая практика для получения значений datareader?

Я делал это:

MyValue = Dr("ColumnName") 

Но заметили другие люди делают:

MyValue = Dr.GetString("ColumnName") 

Я intested знать ПРЕИМУЩЕСТВА 2-го метода

ответ

3

Я использую обертку, которая делает подобную вещь некоторое время, что делает трюк красиво.

 

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

Хорошая вещь об этом помощник будет возвращать предопределенные значения по умолчанию для NULL столбцов (это настраивается). У меня есть методы для всех основных типов данных SQL.

Чтобы ответить на ваш вопрос, у второго метода есть некоторые накладные расходы на бокс/unboxing, но, вероятно, это будет пустой тратой времени, чтобы оптимизировать это для типичного бизнес-приложения.

+0

Это звучит как хороший помощник. Использует ли он внутренние методы Dr.Get (String/Int/etc.) Или делает ли это кастинг? – cjk

+0

Первоначально я использовал дженерики и кастовал, но это было слишком грязно, не слишком хорошо работало с такими вещами, как sql BIT. Итак, теперь это строка Get String, Int. Если вам нужен код, я был бы рад отправить его вам. –

1

DataReader возвращает объект типа type, поэтому вам нужно отличать значение от DataReader до любого типа MyValue в случае int

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

или

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

или

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

Я не уверен, разницы в производительности, но я думаю, что может быть истолковано как микро-оптимизации, если работать на очень больших объемов данных не устанавливает

4

Метод DbDataReader.GetString (int) может использоваться только в том случае, если вы знаете индекс столбца. Использование DbDataReader.GetString ("ColumnName") невозможно, так как такой перегрузки нет. То есть у вас есть два варианта:

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

Первая строка внутри называет DbDataReader.GetOrdinal ("ColumnName").

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 для типов значений.

0

Использование AutoMapper:

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