Как выполнить пакетное обновление в Sql через C # код - PullRequest
12 голосов
/ 24 февраля 2010

Я хочу обновить несколько строк, как показано ниже

update mytable set s_id = {0} where id = {1}

(Здесь s_id оценивается на основе сложной логики).
По соображениям производительности обновления должны выполняться пакетами.Есть ли способ пакетного обновления операторов и выполнить пакет с помощью одного оператора выполнения?Я знаю, что в JAVA мы можем сделать это через JDBC.Есть ли подобный способ в C #?

Заранее спасибо

Ответы [ 4 ]

21 голосов
/ 24 февраля 2010

Да, вы можете использовать SqlDataAdapter .

SqlDataAdapter имеет InsertCommand и UpdateCommand , которые позволяют вам указать SQLCommand для использования для вставки новых строк в базу данных и SqlCommand для обновления строк в базе данных соответственно.

Затем вы можете передать DataTable методу Update адаптера данных, и он объединит операторы на сервере - для строк в DataTable, которые являются новыми строками, он выполнит команду INSERT, для измененных строк он выполняет команду UPDATE.

Вы можете определить размер пакета, используя свойство UpdateBatchSize .

Этот подход позволяет вам работать с большими объемами данных и позволяет красиво обрабатывать ошибки по-разному, т. Е. Если ошибка встречается с конкретным обновлением, вы можете сказать ему, что НЕ выдает исключение, а продолжает с остальными обновлениями, установив свойство ContinueUpdateOnError .

10 голосов
/ 24 февраля 2010

Да, вы можете создать простую текстовую команду SQL (параметризованную для безопасности), например:

SqlCommand command = new SqlCommand();
// Set connection, etc.
for(int i=0; i< items.length; i++) {
    command.CommandText += string.Format("update mytable set s_id=@s_id{0} where id = @id{0};", i);
    command.Parameters.Add("@s_id" + i, items[i].SId);
    command.Parameters.Add("@id" + i, items[i].Id);
}
command.ExecuteNonQuery();
2 голосов
/ 24 февраля 2010

Используйте StringBuilder (System.Text.StringBuilder) для построения вашего Sql, например:

StringBuilder sql = new StringBuilder();
int batchSize = 10;
int currentBatchCount = 0;
SqlCommand cmd = null; // The SqlCommand object to use for executing the sql.
for(int i = 0; i < numberOfUpdatesToMake; i++)
{
  int sid = 0; // Set the s_id here
  int id = 0; // Set id here
  sql.AppendFormat("update mytable set s_id = {0} where id = {1}; ", sid, id);

  currentBatchCount++;
  if (currentBatchCount >= batchSize)
  {
    cmd.CommandText = sql.ToString();
    cmd.ExecuteNonQuery();
    sql = new StringBuilder();
    currentBatchCount = 0;
  }
}
0 голосов
/ 24 февраля 2010

Создайте набор этих обновлений (с заполненным идентификатором), разделите их точкой с запятой в одной строке, установите полученную строку в свойстве CommandText SqlCommand, затем вызовите ExecuteNonQuery ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...