簡體   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