Несколько операторов вставки в одном ODBC ExecuteNonQuery (C #) - PullRequest
5 голосов
/ 10 ноября 2010

Я вставляю несколько строк в БД и соединяю их вместе, чтобы повысить производительность. Я получаю ODBCException, сообщая, что мой синтаксис SQL неверен. Но когда я пытаюсь сделать это в клиенте командной строки mysql, он работает просто отлично .. Я выполнил упрощенный тест, чтобы описать процесс.

Клиент командной строки:


mysql> create table test (`id` int, `name` text);
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO test(id, name) VALUES ('1', 'Foo');INSERT INTO test(id, name) VALUES ('2', 'bar');
Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

mysql>

После этого я запустил этот код на той же БД:


comm.CommandText = "INSERT INTO test(id, name) VALUES ('1', 'Foo');INSERT INTO test(id, name) VALUES ('2', 'bar');";
comm.ExecuteNonQuery();

, которая дает мне следующую ошибку:


+       base    {"ERROR [42000] [MySQL][ODBC 5.1 Driver][mysqld-5.1.51-community]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO test(id, name) VALUES ('2', 'bar')' at line 1"} System.Data.Common.DbException {System.Data.Odbc.OdbcException}

Ответы [ 3 ]

12 голосов
/ 15 марта 2013

Пакетная обработка фактически поддерживается драйвером MySQL ODBC v5 +, вам просто нужно нажать кнопку «Подробности» на панели управления ODBC (если используется Windows) и установить флажок «Разрешить несколько операторов».

В качестве альтернативы использует OPTIONS = 67108864 в строке подключения odbc.

Больше информации здесь: http://dev.mysql.com/doc/refman/5.0/en/connector-odbc-configuration-connection-parameters.html

4 голосов
/ 10 ноября 2010

Да, ODBC НЕ поддерживает пакетную обработку. (РЕДАКТИРОВАТЬ: см. Ответ @ Jean-Do для более актуального решения.)

Но есть и другой вариант:

  1. Используйте MySQL .NET Connector вместо ODBC.
  2. Затем используйте альтернативный оператор INSERT для MySQL: INSERT INTO test(id, name) VALUES ('1', 'Foo'), ('2', 'bar');.
1 голос
/ 10 ноября 2010

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

На самом деле мне никогда не удавалось использовать пакетирование ни с одним управляемым провайдером.

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