Если вы хотите придерживаться DataReaders, вы можете сохранить некоторый код, написав метод расширения в IDataReader, то есть что-то вроде этого (не проверено):
public static T GetValue<T>(this IDataReader reader, string field, T defaultValue)
{
int index = reader.GetOrdinal(field);
if (reader.IsDBNull(index)) {
return defaultValue;
} else {
return (T)(reader[name]);
}
}
Это уменьшит ваш заводской код до
myObject.Name = dataReader.GetValue<string>("name", Nothing)
Конечно, возможны бесчисленные варианты этого метода расширения (с или без defaultValue, целевое поле передается как параметр ref, чтобы получить точно такое же поведение, как ваш код и т. Д.).
В противном случае вы можете использовать DataSets вместо DataReaders, где такой метод расширения уже существует.Вы создаете свой DataSet следующим образом (вместо выполнения myCommand.ExecuteReader
):
var dataSet = new DataSet();
var adapter = new SqlDataAdapter();
adapter.SelectCommand = myCommand;
adapter.Fill(dataSet);
var table = dataSet.Tables[0];
Затем вы можете получить доступ к своим данным, используя DataRowExtensions.Field :
myObject.Name = table.Field<string>("name");
myObject.Age = table.Field<int?>("age") ?? 30; // default value if DBNull