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

时间:2013-02-21 09:51:47

标签: c# performance datatable 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; } }

SqlDataAdapter

使用public DataTable populateUsingDataAdapter(string myQuery) { SqlDataAdapter dap = new SqlDataAdapter(myQuery,cn); DataSet ds = new DataSet(); dap.Fill(ds); return ds.Tables[0]; }

{{1}}

5 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:8)

This question,更具体地说,this answer表明你的第二个例子更快。它当然不是一个详尽的基准,但它是一个有趣的测试。

反映DataTable的源代码表明,调用DataTable.Load()实际上创建了一个名为DataAdapter的内部LoadAdapter子类,并调用Fill()的{​​{1}}方法}}。 DataAdapter使大部分加载工作完全相同。

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

答案 2 :(得分:4)

历史上,{p> SqlDataReader明显快于SqlDataAdapter。 .NET 4.5中可能已经进行了改进,但是我怀疑它已经改进到足以超过DataReader的性能。

答案 3 :(得分:0)

SqlDataReader 将比SQlDataAdapter更快,因为它在连接状态下工作,这意味着第一个结果一旦可用就从查询中返回..

答案 4 :(得分:0)

除了所选的解决方案,我想补充一点:

使用DataReader,您无需知道您拥有哪种类型的DbConnection。

您需要的只是一个实现IDbConnection的实例,您可以使用“connection.CreateCommand”然后使用“dbCommand.ExecuteReader”然后使用dataTable.Load。

但是当你使用DataAdapter时,你需要知道使用了哪个连接(即oracle,sqlserver等)。

(这与线程启动程序无关,但我在寻找此主题时使用g ** gle登陆。)