繁体   English   中英

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

[英]SqlDataReader vs SqlDataAdapter: which one has the better performance for returning a DataTable?

我想知道哪一个具有更好的性能来返回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];
}

差异可以忽略不计,因此使用更简洁的版本可能更好: 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;
    }
}

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

反映DataTable的源代码表明,调用DataTable.Load()实际上创建了一个名为LoadAdapter的内部DataAdapter子类,并调用了DataAdapterFill()方法。 SqlDataAdapter将其大部分加载工作放在完全相同的位置。

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

SqlDataReader历史上比SqlDataAdapter快得多。 可能已经在.NET 4.5中进行了改进,但是我怀疑它已经改进到足以超过DataReader的性能。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM