1

DataSet で非同期 DB 接続メソッドを実装する必要があるため、最初に SqlDataReader を使用して DataSet を埋めようとしました。しかし、それには時間がかかりすぎます。

コードは次のとおりです。

DataTable.Load の使用

DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(conString)
{
    SqlCommand cmd = new Sqlcommand(query, conn);
    conn.Open();
    SqlDataReader reader = cmd.ExecuteReader();

    while (!reader.IsClosed)
    {
        DataTable dt = new DataTable();
        dt.BeginLoadData();
        //////////////////////////////////////
        dt.Load(reader);     // takes too much
        //////////////////////////////////////
        dt.EndLoadData();
        ds.Tables.Add(dt);
    }
}

SqlDataAdapter.Fill の使用

DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(conString))
{
    ...
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = cmd;
    adapter.Fill(ds);
}

これら2つの方法はまったく同じことを行うと思います。しかし、DB で 2400 行を読み取る場合、最初の方法は平均で 20 ミリ秒かかり、それ以外の場合は 2 番目の方法はわずか 7 ミリ秒しかかかりません。

見逃したものはありますか、それともコードが間違っていますか?

4

2 に答える 2

1

使用することをお勧めしますSqlDataAdapter::Fill(DataSet)

DataSet ds = new DataSet();
ds.Clear();
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
于 2013-09-27T00:45:38.123 に答える
0

これを試して:

SqlDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();           
dt.Load(reader);             
ds.Tables.Add(dt);
于 2013-07-10T05:51:04.257 に答える