SqlDataReader vs SqlDataAdapter:哪一个具有更好的返回DataTable的性能?

Sat*_*ngh 25 c# datatable performance sqldatareader sqldataadapter

我想知道哪一个具有更好的返回性能DataTable.SqlDataReader我在这里使用DataTable.Load(dr)

使用SqlDataReader:

public static DataTable populateUsingDataReader(string myQuery)
{
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(constring))
    {
        SqlCommand cmd = new SqlCommand(myQuery, con);
        con.Open();
        SqlDataReader dr = null;
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        if (dr.HasRows)
        {
            dt.Load(dr);
        }
        return dt;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用SqlDataAdapter:

public DataTable populateUsingDataAdapter(string myQuery)
{
    SqlDataAdapter dap = new SqlDataAdapter(myQuery,cn);
    DataSet ds = new DataSet();
    dap.Fill(ds);
    return ds.Tables[0];
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 23

差异可以忽略不计,因此使用更简洁的版本可能更好:SqlDataAdapter.Fill.

SqlDataReader.Fill在内部创建一个内部类LoadAdapter(派生自内DataAdapter),并调用其Fill方法:性能将非常相似SqlDataAdapter.Fill(DataTable).

参数的初始化/验证会有一些小的差异,但随着行数的增加,这将变得越来越不重要.

另请注意,您的第二个样本应该修改为与第一个样本相当:

public DataTable populateUsingDataAdapter(string myQuery)
{
    using (SqlConnection con = new SqlConnection(constring))
    {
        SqlDataAdapter dap = new SqlDataAdapter(myQuery,con);
        DataTable dt = new DataTable();
        dap.Fill(dt);
        return dt;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • sqlDataReader 和 sqlDataAdapter 之间的区别真的可以忽略不计吗?您有任何显示差异的基准吗?正如下面指出的,这个回复[fastest-way-to-read-data-from-a-dbdatareader](http://stackoverflow.com/questions/5758526/what-is-the-fastest-way-to-read- data-from-a-dbdatareader/14860927#14860927) 可能包含基准。另外,这篇关于 [DataAdapter 和 DataReader](https://msdn.microsoft.com/library/ms254931%28v=vs.110%29.aspx) 的 msdn 文章可能有用。 (2认同)

Tim*_*ora 8

这个问题,更具体地说,这个答案表明你的第二个例子更快.它当然不是一个详尽的基准,但它是一个有趣的测试.

反映show的源代码DataTable,调用DataTable.Load()实际上创建了一个内部DataAdapter子类调用LoadAdapter并调用Fill()方法DataAdapter.SqlDataAdapter它的大部分装载工作在完全相同的地方.

更重要的是,我倾向于赞成第二个例子的可读性.这两个例子都没有比较直接使用的快速访问DataReader,所以我会选择更干净的代码.


Rob*_*ein 5

SqlDataReader从历史上看,速度明显快于SqlDataAdapter. .NET 4.5 可能有所改进,但我怀疑它的改进是否足以超过 DataReader 的性能。

  • 不对。从“SqlDataReader”“直接”处理数据可能比将整个结果集加载到“DataTable”中更快。但这是在比较苹果和橙子。两者在填充“DataTable”方面具有相似的性能。 (3认同)
  • 你是对的。我假设使用 Reader 来填充自定义类。不填充“DataTable”。如果结果必须是“DataTable”,那么无论使用适配器还是读取器,性能都将同样糟糕。 (3认同)