29

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

5 回答 5

28

差异可以忽略不计,因此最好使用更简洁的版本: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;
    }
}
于 2013-02-21T10:24:05.967 回答
8

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

反映源代码可以DataTable看出调用DataTable.Load()实际上是创建了一个内部DataAdapter子类LoadAdapter,调用Fill()DataAdapter. SqlDataAdapter它的大部分装载工作都在同一个地方完成。

更重要的是,为了可读性,我倾向于支持第二个示例。这两个示例都无法与直接使用 . 提供的快速访问相比DataReader,因此我会选择更简洁的代码。

于 2013-02-21T10:29:11.987 回答
5

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

于 2013-02-21T09:59:20.430 回答
0

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

于 2013-02-21T10:06:49.600 回答
0

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

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

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

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

(这与线程启动器无关,但我在寻找这个主题时使用 g**gle 来到这里。)

于 2016-01-26T13:57:12.690 回答