通过OleDbConnection获取单个记录的最佳方法是什么?

时间:2009-08-27 05:24:35

标签: c# .net oledb

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对象。根据VS 2008分析器,当我执行此操作时,创建对象所需的时间大约是在da.Fill(ds)调用中的95%。

我还有一个类,它表示实现IEnumerable的这些对象的集合,当使用foreach迭代该对象时,每个单个记录对象都是动态创建的,而那些da.Fill(ds)语句会快速加起来。 / p>

我的问题是,这是获取单条记录的最佳方式吗?或者,是否有更优选的方法来实现集合对象,因此迭代它不需要这么长时间?

由于

3 个答案:

答案 0 :(得分:10)

使用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提供程序的提示,允许它优化处理结果的方式。

答案 1 :(得分:2)

如果您只期待一个结果, 你可以使用ExecuteScalar

它返回第一行的第一列。

答案 2 :(得分:1)

您可以使用数据阅读器:

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;
}