DataTable.Load比IDataAdapter.Fill慢?

时间:2012-09-05 13:34:19

标签: 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;
    }
}

并将其与(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检索项目):

  • DataReader 420 ms
  • DataAdapter 5613 ms

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

  • DataReader 323845 ms
  • DataAdapter 204153 ms (几次测试,次数变化不大)

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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