Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: .NET Framework
.NET .NET
Standard
Пакетная обработка в ADO.NET позволяет DataAdapter группировать операции INSERT, UPDATE и DELETE из DataSet или DataTable для отправки на сервер вместо того, чтобы отправлять по одной операции за раз. Сокращение числа циклов обмена данными с сервером обычно приводит к значительному повышению производительности. Пакетное обновление поддерживается поставщиком данных Microsoft SqlClient для SQL Server (Microsoft.Data.SqlClient).
При обновлении базы данных изменениями из DataSet в предыдущих версиях ADO.NET метод Update объекта DataAdapter обновлял базу данных по одной строке за раз. Когда он просматривает строки в указанной таблице DataTable, он проверяет каждую строку DataRow, чтобы выявить, не была ли она изменена. Если строка изменена, он вызывает соответствующую команду UpdateCommand, InsertCommand или DeleteCommand в зависимости от значения свойства RowState для этой строки. Каждое обновление строки требовало сетевого обмена с базой данных.
В поставщике данных Microsoft SqlClient для SQL Server класс SqlDataAdapter предоставляет свойство UpdateBatchSize. При установке для свойства UpdateBatchSize положительного целого значения обновления базы данных посылаются как пакеты указанного размера. Например, при установке UpdateBatchSize в 10 производится группирование 10 отдельных инструкций и передача их как один пакет. Установка UpdateBatchSize в значение 0 приведёт к тому, что SqlDataAdapter будет использовать самый большой размер пакета, который может обработать сервер. Если установить это значение равным 1, пакетные обновления отключаются, так как строки отправляются по одной.
Примечание.
Выполнение очень больших пакетов может снизить производительность. Поэтому необходимо экспериментальным путем найти параметр оптимального размера пакета перед реализацией приложения.
Используйте свойство UpdateBatchSize
Если пакетные обновления включены, значение свойства UpdatedRowSource для UpdateCommand, InsertCommand и DeleteCommand объекта DataAdapter должно быть установлено в None или OutputParameters. При выполнении пакетного обновления значение свойства UpdatedRowSource команды для FirstReturnedRecord или Both недействительно.
Следующая процедура демонстрирует использование свойства UpdateBatchSize. Процедура принимает два аргумента, объект DataSet, который имеет столбцы, представляющие поля ProductCategoryID и Name в таблице Production.ProductCategory, и целое число, представляющее размер пакета (число строк в пакете). Код создает новый объект SqlDataAdapter, устанавливая его свойства UpdateCommand, InsertCommand и DeleteCommand. В коде предполагается, что объект DataSet имеет измененные строки. В нем устанавливается свойство UpdateBatchSize и выполняется обновление.
public static void BatchUpdate(DataTable dataTable, Int32 batchSize)
{
// Assumes GetConnectionString() returns a valid connection string.
string connectionString = GetConnectionString();
// Connect to the AdventureWorks database.
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create a SqlDataAdapter.
SqlDataAdapter adapter = new SqlDataAdapter();
// Set the UPDATE command and parameters.
adapter.UpdateCommand = new SqlCommand(
"UPDATE Production.ProductCategory SET "
+ "Name=@Name WHERE ProductCategoryID=@ProdCatID;",
connection);
adapter.UpdateCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.UpdateCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the INSERT command and parameter.
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);",
connection);
adapter.InsertCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the DELETE command and parameter.
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Production.ProductCategory "
+ "WHERE ProductCategoryID=@ProdCatID;", connection);
adapter.DeleteCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
// Set the batch size.
adapter.UpdateBatchSize = batchSize;
// Execute the update.
adapter.Update(dataTable);
}
}
Обработка событий и ошибок, связанных с пакетным обновлением
DataAdapter имеет два события, связанные с обновлением: RowUpdating и RowUpdated. Дополнительные сведения см. в разделе Обработка событий DataAdapter.
Изменения в поведении событий при работе с пакетными обновлениями
Если пакетное обновление включено, несколько строк обновляются одной операцией базы данных. Поэтому для каждого пакета происходит только одно событие RowUpdated, в то время как событие RowUpdating происходит для каждой обрабатываемой строки. Если пакетная обработка отключена, эти два события срабатывают поочерёдно в соотношении один к одному: для одной строки срабатывают события RowUpdating и RowUpdated, затем для следующей строки — события RowUpdating и RowUpdated, и так продолжается, пока не будут обработаны все строки.
Доступ к обновленным строкам
Если пакетная обработка отключена, доступ к обновляемой строке может быть выполнен при помощи свойства Row класса RowUpdatedEventArgs.
Если пакетная обработка включена для нескольких строк, формируется одно событие RowUpdated. Поэтому значение свойства Row для каждой из строк равно NULL. События RowUpdating по-прежнему вызываются для каждой строки. Метод CopyToRows класса RowUpdatedEventArgs позволяет обращаться к обработанным строкам, копируя ссылки на строки в массив. Если ни одна строка не обрабатывается, CopyToRows вызывает исключение ArgumentNullException. Свойство RowCount используется для возврата числа строк, обработанных перед вызовом метода CopyToRows.
Обработка ошибок данных
Пакетное выполнение оказывает то же влияние, что и выполнение каждой отдельной инструкции. Инструкции выполняются в том порядке, в котором они были добавлены в пакет. Ошибки обрабатываются в пакетном режиме так же, как и когда пакетный режим отключен. Каждая строка обрабатывается отдельно. Только успешно обработанные в базе данных строки будут обновлены в соответствующей строке DataRow таблицы DataTable.
Примечание.
Поставщик данных Microsoft SqlClient для SQL Server и внутренний сервер базы данных определяют, для каких конструкций SQL поддерживается пакетное выполнение. Если неподдерживаемая инструкция подается на выполнение, создается исключение.