Лучшие практики для обхода различий в БД с помощью IDataReader - PullRequest
2 голосов
/ 25 июня 2009

У меня есть простой объект значений, который я заполняю данными из IDataReader (может быть результатом запроса к базе данных Oracle или MS SQL). Фабричный метод для этого объекта выглядит примерно так:

internal static SomeClass CreateFromDataReader(IDataReader data)
{
    string message = data.GetString(0);
    short id = data.GetInt16(1);
    DateTime dateStamp = data.GetDateTime(2);
    return new SomeClass(message, id, dateStamp);
}

Затем я столкнулся с проблемой, связанной с различием в типе данных, который базы данных Oracle и MS SQL используют для этого конкретного столбца: в Oracle этот тип данных является числом, а для MS SQL используется тип данных smallint.

Теперь, хотя я мог бы «исправить» эту проблему, сделав что-то вроде следующего:

short id = Convert.ToInt16(data.GetValue(1));

есть ли лучший или более элегантный способ сделать это?

Ответы [ 2 ]

1 голос
/ 25 июня 2009

Я не знаю, как ОРМ справляются с таким сценарием.

Однако вы должны использовать тип, который может вместить оба (все) случая для такого поля.
Я посмотрел на эту таблицу и кажется, что десятичный - это подходящий тип данных .net, который вы можете использовать.

0 голосов
/ 12 ноября 2012

Ваша идея верна. Возможно, даже короче:

short id = Convert.ToInt16(data[1]); //8 characters less

Или сделать метод расширения.

public static short ToShort(this IDataReader r, int index)
{
    return Convert.ToInt16(r[index]);
}

Теперь вы можете:

short id = data.ToShort(1); //18 characters less

:)

...