DataTable.Load() занимает слишком много времени по сравнению с SqlDataAdapter.Fill()

Мне нужно реализовать асинхронный метод подключения БД к DataSet, поэтому сначала я попытался использовать 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);
}

Я думаю, что эти два метода делают одно и то же. Но при чтении 2400 строк в БД первый метод занимает в среднем 20 мс, в противном случае второй - всего 7 мс.

Я что-то пропустил или код неверный?


person Lee Tae-young    schedule 10.07.2013    source источник


Ответы (2)


Я рекомендую вам использовать SqlDataAdapter::Fill(DataSet):

DataSet ds = new DataSet();
ds.Clear();
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(ds);
DataTable dt = ds.Tables[0];
person songsuyong    schedule 27.09.2013

Попробуй это:

SqlDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();           
dt.Load(reader);             
ds.Tables.Add(dt);
person Rajeev Kumar    schedule 10.07.2013
comment
Код должен быть похож на приведенный выше, потому что результат ExecuteReader() может иметь несколько таблиц. Во всяком случае, я пробовал, как и вы, но результат тот же. dt.Load() занимает намного больше времени, чем adapter.Fill(). - person Lee Tae-young; 10.07.2013