Самый быстрый способ выполнить хранимую процедуру в C #, требующий наименьшего количества кода - PullRequest
0 голосов
/ 06 апреля 2011

Я собираюсь получить результаты в коллекции сущностей.Мне не просто нужен объект IDataReader.Так что выше следует ответить, учитывая, что у меня нет большого количества параметров и SP возвращает много столбцов данных.

Пожалуйста, укажите причины.

Некоторые из них могут быть

  1. Перетащите в конструктор DBML и затем вызовите его с помощью linq для sql.Это очень хорошо.Но это также генерирует много кода для DBML.Проще лучше.

  2. Получение IDataReader с помощью ExecuteReader, а затем передача IDataReader на фабрику для создания его объекта.Хорошо и просто.Но требует много кодирования.Ниже требуется для каждого возвращаемого столбца.

int nameIndex = dataReader.GetOrdinal("Name");
if (!dataReader.IsDBNull(nameIndex)){
   myObject.Name = dataReader.GetString(nameIndex);
}

Есть ли какой-нибудь другой более простой вариант для этого?

ОБНОВЛЕНИЕ Ответ @ Heinzi упрощает процесс обработки результатов.Есть ли лучший способ обработки большого количества параметров?

1 Ответ

3 голосов
/ 06 апреля 2011

Если вы хотите придерживаться 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
...