Каков наилучший способ получить одну запись через OleDbConnection? - PullRequest
1 голос
/ 27 августа 2009

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) быстро складываются.

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

Спасибо

Ответы [ 3 ]

10 голосов
/ 27 августа 2009

Используйте 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, который позволяет ему оптимизировать обработку результата.

2 голосов
/ 27 августа 2009

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

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

1 голос
/ 27 августа 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;
}
...