Подтвердить что ты не робот

SqlDataReader vs SqlDataAdapter: какая из них имеет лучшую производительность для возврата 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];
}
4b9b3361

Ответ 1

Разница будет незначительной, поэтому лучше использовать более сжатую версию: 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;
    }
}

Ответ 2

Этот вопрос, а точнее, этот ответ предполагает, что ваш второй пример быстрее. Это, конечно, не исчерпывающий тест, но это интересный тест.

Отражение исходного кода DataTable показывает, что вызов DataTable.Load() фактически создает внутренний подкласс DataAdapter под названием LoadAdapter и вызывает метод Fill() DataAdapter. SqlDataAdapter выполняется ли большая часть его загрузки в том же месте.

Что еще более важно, я бы предпочла второй пример для удобочитаемости. Ни один из примеров не сравняется с быстрым доступом, обеспечиваемым прямым использованием DataReader, поэтому я бы выбрал более чистый код.

Ответ 3

SqlDataReader исторически был значительно быстрее, чем SqlDataAdapter. Усовершенствования, возможно, были сделаны в .NET 4.5, но я сомневаюсь, что он улучшился настолько, чтобы опередить производительность DataReader.

Ответ 4

SqlDataReader будет быстрее, чем SQlDataAdapter, потому что он работает в подключенном состоянии, что означает, что первый результат возвращается из запроса, как только он доступен.

Ответ 5

В дополнение к выбранному решению я хотел бы добавить, что:

Используя DataReader, вам не нужно знать, какой тип DbConnection у вас есть.

Все, что вам нужно, это экземпляр, который реализует IDbConnection, с помощью которого вы можете использовать "connection.CreateCommand", а затем "dbCommand.ExecuteReader", а затем dataTable.Load.

Но когда вы используете DataAdapter, вам нужно знать, какое соединение используется (например, oracle, sqlserver и т.д.).

(Это не относится к стартеру потока, но я приземлился здесь, используя g ** gle, ища эту тему.)