3

我正在使用以下代码(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;
    }
}

并将其与(Variant DataAdapter)进行比较:

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

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

  • 数据读取器 420 毫秒
  • 数据适配器 5613 毫秒

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

  • 数据读取器323845毫秒
  • DataAdapter 204153 ms(多次测试,时间变化不大)

即使更改命令的顺序(数据读取器之前的数据适配器)也没有太大变化(我认为可能有一些预缓存..)。

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

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

4

1 回答 1

2

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

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

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

于 2012-09-05T13:56:04.133 回答