与 SqlDataAdapter.Fill() 相比,DataTable.Load() 花费了太多时间

Posted

技术标签:

【中文标题】与 SqlDataAdapter.Fill() 相比,DataTable.Load() 花费了太多时间【英文标题】:DataTable.Load() is taking too much time compared to SqlDataAdapter.Fill() 【发布时间】:2013-07-10 05:48:39 【问题描述】:

我必须用DataSet实现一个异步DB连接方法,所以我首先尝试使用SqlDataReader来填充DataSet。但这需要太多时间。

代码如下:

使用 DataTable.Load

DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(conString)

    SqlCommand cmd = new Sqlcommand(query, conn);
    conn.Open();
    SqlDataReader reader = cmd.ExecuteReader();

    while (!reader.IsClosed)
    
        DataTable dt = new DataTable();
        dt.BeginLoadData();
        //////////////////////////////////////
        dt.Load(reader);     // takes too much
        //////////////////////////////////////
        dt.EndLoadData();
        ds.Tables.Add(dt);
    

使用 SqlDataAdapter.Fill

DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(conString))

    ...
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = cmd;
    adapter.Fill(ds);

我认为这两种方法的作用完全相同。但是当读取数据库中的 2400 行时,第一种方法平均需要 20 毫秒,否则第二种方法只需 7 毫秒。

是我遗漏了什么还是代码有误?

【问题讨论】:

【参考方案1】:

我推荐你使用SqlDataAdapter::Fill(DataSet):

DataSet ds = new DataSet();
ds.Clear();
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(ds);
DataTable dt = ds.Tables[0];

【讨论】:

【参考方案2】:

试试这个:

SqlDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();           
dt.Load(reader);             
ds.Tables.Add(dt);

【讨论】:

代码必须和上面一样,因为ExecuteReader()的结果可能有多个表。无论如何,我像你一样尝试过,但结果是一样的.. dt.Load() 比adapter.Fill() 花费的时间长得多。

以上是关于与 SqlDataAdapter.Fill() 相比,DataTable.Load() 花费了太多时间的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataAdapter.Fill() 溢出异常

SqlDataAdapter.Fill(DataGridView.DataSource) 复制所有行

SqlClient.SqlDataAdapter.Fill(DataSet) 结果如果不选择查询

SqlDataAdapter.Fill 方法慢

SqlDataAdapter.Fill 方法慢

SqlDataAdapter#Fill:`SelectCommand.connection` 属性尚未初始化