Я построил обертку вокруг NpgSQL для кучи методов, которые я обычно использую в DAL моих проектов. Два из них, я обычно использую для заполнения DTO прямо из DataReader. Обычно в методе fill helper я создам DTO и перебираю свойства, сопоставляющие данные Datareader с соответствующим свойством. Метод заполнения генерируется большую часть времени.NpgSQLdataReader GetOrdinal исключение бросания .. любым способом?
Поскольку я допускаю, что многие свойства являются нулевыми или используют значения по умолчанию DTO, я использовал метод, чтобы проверить, действительны ли данные dataReader для свойства перед заполнением prperty. Так что я буду иметь IsValidString («FIELDNAME») и DRGetString («FIELDNAME») методы, например так:
public bool IsValidString(string fieldName)
{
if (data.GetOrdinal(fieldName) != -1
&& !data.IsDBNull(data.GetOrdinal(fieldName)))
return true;
else
return false;
}
public string DRGetString(string fieldName)
{
return data.GetString(data.GetOrdinal(fieldName));
}
Мой метод заливки delagated к тому, что метод выполняется запрос и выглядит следующим образом:
public static object FillObject(DataParse<PostgreSQLDBDataParse> dataParser)
{
TipoFase obj = new TipoFase();
if (dataParser.IsValidInt32("T_TipoFase"))
obj.T_TipoFase = dataParser.DRGetInt32("T_TipoFase");
if (dataParser.IsValidString("NM_TipoFase"))
obj.NM_TipoFase = dataParser.DRGetString("NM_TipoFase");
//...rest of the properties .. this is usually autogenerated by a T4 template
return obj;
}
Это работало отлично и dandy в NpgSQL pre 2.02. , Когда был вызван метод GetOrdinal, и если это поле не было в файле dataReader, я бы просто получил -1. Легко вернуть false в IsValidString() и просто перейти к следующему свойству. Эффект, полученный от проверки несуществующих полей, практически не учитывался.
К сожалению, изменения в NpgSQL заставляют GetOrdinal вызывать исключение, когда поле не существует. У меня есть простой способ обхода, в котором я обертываю код в try/catch и ложь в catch. Но я чувствую удар в производительности, особенно когда я иду в режим отладки. Заполнение длинного списка занимает несколько минут.
Предположительно, NpgSQL имеет параметр, который можно добавить к строке соединения (совместимость) для поддержки обратной компоновки для этого метода, но у меня никогда не было этого, чтобы работать правильно (я всегда получаю исключение из-за сформированного mal строка подключения). Во всяком случае, я ищу предложения для улучшения обходных решений. Любой лучший способ заполнить объект из datareader или даже каким-то образом решить проблему с исключением?