Отправить несколько команд на один SQLConnection - PullRequest
2 голосов
/ 14 июля 2011

Я задаю вопрос, связанный с Выполнение нескольких команд SQL в одном цикле , но не совсем так, потому что у меня эта проблема в гораздо большем масштабе:

У меня есть входной файл со многими различными командами SQL (ExecuteNonQuery), которые мне нужно обработать с помощью приложения .net. Пример:

INSERT INTO USERS (name, password) VALUES (@name, @pw); @name="abc"; @pw="def";
DELETE FROM USERS WHERE name=@name; @name="ghi";
INSERT INTO USERS (name, password) VALUES (@name, @pw); @name="mno"; @pw="pqr";

У всех команд есть параметры, поэтому я хотел бы, чтобы механизм параметров предоставлял .net. Но мое приложение должно прочитать эти заявления и выполнить их в течение приемлемого промежутка времени. В одном файле может быть несколько тысяч операторов.

Моей первой мыслью было использование SQLCommand с параметрами, так как это действительно был бы способ сделать это правильно (параметры экранированы .net), но я не могу позволить себе ждать 50 мсек для завершения каждой команды (сетевое взаимодействие с БД сервер, ...). Мне нужен способ цепочки команд.

Моя вторая мысль состояла в том, чтобы выйти и вставить параметры самостоятельно, чтобы я мог объединить несколько команд в одну SQLCommand:

INSERT INTO USERS (name, password) VALUES ('abc', 'def'); DELETE FROM USERS WHERE name=@name; @name='ghi'; INSERT INTO USERS (name, password) VALUES ('mno', 'pqr');

Однако я чувствую себя неловко с этим решением, потому что я не люблю экранировать ввод самостоятельно, если для этого есть предопределенные функции.

Что бы вы сделали? Спасибо за ваши ответы, Крис

Ответы [ 2 ]

0 голосов
/ 16 июля 2011

Если предположить, что все данные введены правильно, я бы сделал следующее:

  • Разобрать имена и значения параметров
  • Перезаписать имена параметров, чтобы они были уникальными для всех запросов (т. Е. Чтобы вы могли выполнить два запроса с параметром @name в одном пакете)
  • Сгруппируйте несколько запросов в один пакет и запустите пакеты внутри транзакции

Причина, по которой вы (вероятно) не сможете выполнить все это в одном пакете, заключается в том, что в одном пакете есть ограничение на 2100 параметров (по крайней мере, когда я делал то же самое с SQL Server) ); в зависимости от производительности, которую вы получите, вы можете настроить предел разделения партии. 250-500 работали лучше всего для моей рабочей нагрузки; YMMV.

Одна вещь, которую я бы не сделал , это многопоточность. Если ввод произвольный, программа не знает, важен ли порядок операций; следовательно, вы не можете начать разделять запросы для одновременного выполнения.

Честно говоря, пока вы можете каким-то образом получать запросы к серверу, вы, вероятно, в хорошей форме. Только с «несколькими тысячами» утверждений весь процесс не займет много времени. (Заявление, которое я написал, должно было сделать это с несколькими миллионами заявлений.)

0 голосов
/ 16 июля 2011

Интересная дилемма .. Я бы предложил любой из них:

  1. Есть контроль над сервером SQL? создать хранимую процедуру, которая загружает файл и выполняет работу
  2. Используйте sqlcommand, но затем кэшируйте параметры и введите только команды для чтения (удаление, вставка и т. Д.) И значения из каждой строки для выполнения. Примеры кэширования параметров здесь , здесь и здесь .
  3. Использовать несколько потоков. Родительский поток для чтения строк и отправки их в другие потоки: один для вставки, другой для удаления или столько, сколько необходимо. Посмотрите на Задачи
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...