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

Posted

技术标签:

【中文标题】通过 OleDbConnection 获取单个记录的最佳方法是啥?【英文标题】:What is the best way to fetch a single record via an OleDbConnection?通过 OleDbConnection 获取单个记录的最佳方法是什么? 【发布时间】:2009-08-27 05:24:35 【问题描述】:

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

我还有一个类,它表示实现 IEnumerable 的这些对象的集合,当使用 foreach 迭代该对象时,每个单独的记录对象都是动态创建的,并且这些 da.Fill(ds) 语句很快就会累加。

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

谢谢

【问题讨论】:

谢谢!我尝试了建议的 OleDbDataReader 解决方案。不幸的是,在我的特定场景中,没有一个 DataReader 解决方案比使用 OleDbDataAdapter.Fill() 有明显的性能改进。 【参考方案1】:

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

【讨论】:

不幸的是,我目前正在使用 Jet,而 CommandBehavior.SingleRow 似乎对我的方案没有任何影响。不过,将其归档以备将来参考。【参考方案2】:

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

它返回第一行的第一列。

【讨论】:

【参考方案3】:

您可以使用数据阅读器:

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;

【讨论】:

以上是关于通过 OleDbConnection 获取单个记录的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OLEDBConnection 将新记录插入到带有 Visual Basic 的表中

如何获取我们无法通过 Zoho Creator 中的单个 API 调用获取的剩余记录?

将 OleDbConnection 刷新到 Access DB - 最佳实践

.xlsx 的 OleDbConnection.GetOleDbSchemaTable 无法识别隐藏的工作表

JSON.net 直接从 oledbconnection 序列化

JSON.net 直接从 oledbconnection 序列化