c# - DataTable.Load 比 IDataAdapter.Fill 慢?

标签 c# oledb datareader dataadapter

<分区>

我正在使用以下代码(Variant DataReader):

public DataTable dtFromDataReader(list<String> lstStrings)
{

    OleDBConn_.Open();
    using (OleDbCommand cmd = new OleDbCommand())
    {

        DataTable dt = new DataTable();
        OleDbDataReader reader = null;
        cmd.Connection = OleDBConn_;
        cmd.CommandText = "SELECT * from TableX where SUID=?";

        foreach (String aString in lstStrings)
        {
            cmd.Parameters.AddWithValue("?", aNode.SUID);
            reader = cmd.ExecuteReader();

            if (reader != null)
                dt.Load(reader);
            cmd.Parameters.Clear();
        }
        return dt;
    }
}

并将其与(变体数据适配器)进行比较:

public DataTable dtFromDataAdapter(list<String> lstStrings)
{
    dt = new DataTable();

    foreach (string aString in lstStrings)
    {
        sOledb_statement = String.Concat("SELECT * FROM TableX where SUID='", aString, "'");
        OleDbDataAdapter oleDbAdapter;
        using (oleDbAdapter = new OleDbDataAdapter(sOledb_statement, OleDBConn_))
        {
            GetOleDbRows = oleDbAdapter.Fill(dt);
        }
    }
}

当我连接到离线数据库 (microsoft access) 时,我的阅读时间是(~1.5k 检索到的项目):

  • DataReader 420 毫秒
  • 数据适配器 5613 毫秒

从 oracle 服务器读取时(~30k 检索项目):

  • DataReader 323845 毫秒
  • 数据适配器 204153 毫秒 (几次测试,时间变化不大)

即使更改命令的顺序(dataadapter 在 datareader 之前)也没有太大变化(我认为可能有一些预缓存......)。

我认为 DataTable.Load 应该比 DataAdapter.Fill 快一些?

而且我仍然相信,即使我看到了结果,它应该更快。我在哪里浪费时间? (没有未处理的异常..)

最佳答案

您的比较并不是真正的 Adapter 与 DataReader 以及您设置代码的方式。您实际上是在比较 Adapter.Fill 与 DataTable.Load 方法。

DataReader 通常在每条记录的基础上更快,因为您将一次遍历一条记录,并且可以在读取每条记录时做出相应的 react 。

由于您在这两个实例中都返回了一个 DataTable,因此 Adapter.Fill 方法可能是最佳选择。它的设计就是为了做到这一点。

关于c# - DataTable.Load 比 IDataAdapter.Fill 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12282708/

相关文章:

c# - 当我打开 Release模式时,捆绑在 MVC5 中不起作用

c# - Entity Framework - 如何在多个应用程序之间共享一些表

c# - 如何将 DataReader 映射到类属性并保持性能?

ms-access - Microsoft.ACE.OLEDB.12.0 Provider 无法再在 Windows 8 下打开 .mdb

c++ - 比较 OLEDB 和 Ado.Net 的性能

c# - 使用 C# 查询 MySQL 的更有效方法是什么?

c# - "DataReader already open"有问题

c# - Unity - 拦截 WCF 服务类?

c# - 当(当前)只有一个实现它的类时,您是否应该创建一个接口(interface)?

c# - 从 MySQL 到 MS Access 的 1GB 数据