Как лучше всего получить одну запись через OleDbConnection?

C#, .Net 2.0: у меня есть класс, который упаковывает одну запись из базы данных, доступ к которой осуществляется через объект OleDbConnection. Это довольно просто, он выполняет "SELECT * FROM table WHERE key = {some value};" а затем предоставляет поля как свойства с несколькими методами для управления данными. Когда я создаю новый экземпляр этого объекта, выполняемый код выглядит так:

        DataSet ds = new DataSet();
        ds.Locale = CultureInfo.InvariantCulture;
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);

        if (cmd.Connection.State != ConnectionState.Open)
        {
            cmd.Connection.Close();
            cmd.Connection.Open();
        }

        da.Fill(ds);

        return ds.Tables[0];

cmd — это объект OleDbCommand, передаваемый методу. Когда я выполняю это, около 95% времени, необходимого для создания объекта, приходится на вызов da.Fill(ds), согласно профилировщику VS 2008.

У меня также есть класс, представляющий набор этих объектов, который реализует IEnumerable, и при повторении этого объекта с использованием foreach каждый отдельный объект записи создается на лету, и эти операторы da.Fill(ds) быстро складываются.

Мой вопрос: это лучший способ получить одну запись? С другой стороны, есть ли более предпочтительный способ реализации объекта коллекции, чтобы итерация не занимала так много времени?

Спасибо


person Community    schedule 27.08.2009    source источник
comment
Спасибо! Я попробовал предложенные решения OleDbDataReader. К сожалению, в моем конкретном сценарии ни одно из решений DataReader не дало заметного улучшения производительности по сравнению с использованием OleDbDataAdapter.Fill().   -  person    schedule 28.08.2009


Ответы (3)


Используйте OleDbDataReader и рассмотрите возможность использования CommandBehavior.SingleRow.

using (OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
    if (reader.Read())
    {
        // Bind your object using the reader.
    }
    else
    {
        // No row matched the query
    }
}

SingleRow предоставляет базовому поставщику OLEDB подсказку, позволяющую оптимизировать процесс обработки результата.

person Brannon    schedule 27.08.2009
comment
К сожалению, в настоящее время я использую Jet, и CommandBehavior.SingleRow, похоже, не имеет никакого значения для моего сценария. Тем не менее, сохраните его для дальнейшего использования. - person ; 28.08.2009

Если вы ожидаете только один результат, вы можете использовать Выполнить скаляр

Он возвращает первый столбец первой строки.

person Thomas Zoechling    schedule 27.08.2009

Вы можете использовать считыватель данных:

using (var connection = new OleDbConnection(connectionString))
{
    connection.Open();

    var command = new OleDbCommand(queryString, connection);
    var reader = command.ExecuteReader();

    var person = new Person();
    if (reader.Read())
    {
        person.Name = reader["Name"].ToString();
        person.Age = Convert.ToInt32(reader["Age"]);
    }

    return person;
}
person apiguy    schedule 27.08.2009