Пакетные вставки и ошибка подготовленного запроса - PullRequest
3 голосов
/ 18 июня 2010

Хорошо, поэтому мне нужно заполнить таблицу базы данных MS Access результатами из запроса MySQL.Это совсем не сложно.У меня есть программа, написанная туда, где она копирует файл .mdb шаблона во временное имя и открывает его через odbc.Пока проблем нет.

Я заметил, что Access не поддерживает пакетную вставку (VALUES (foo, bar), (second, query), (third query)).Так что это означает, что мне нужно выполнить один запрос на строку (потенциально это сотни тысяч строк).Начальные тесты производительности показывают скорость около 900 вставок в секунду в Access.С нашими самыми большими наборами данных это может означать время выполнения минут (что не конец света, но, очевидно, чем быстрее, тем лучше).

Итак, я попытался протестировать подготовленный оператор.Но я продолжаю получать сообщение об ошибке (Warning: odbc_execute() [function.odbc-execute]: SQL error: [Microsoft][ODBC Microsoft Access Driver]COUNT field incorrect , SQL state 07001 in SQLExecute in D:\....php on line 30).

Вот код, который я использую (строка 30 odbc_execute):

$sql = 'INSERT INTO table 
    ([field0], [field1], [field2], [field3], [field4], [field5]) 
    VALUES (?, ?, ?, ?, ?, ?)';
$stmt = odbc_prepare($conn, $sql);
for ($i = 200001; $i < 300001; $i++) {
    $a = array($i, "Field1 $", "Field2 $i", "Field3 $i", "Field4 $i", $i);
    odbc_execute($stmt, $a);
}

Так что мой вопрос в два раза.Во-первых, есть ли идея, почему я получаю эту ошибку (я проверил, и число в массиве соответствует списку полей, который соответствует числу маркеров параметра ?)?И во-вторых, я должен даже беспокоиться об этом или просто использовать прямые операторы INSERT?Как я уже сказал, время не критично, но если это возможно, я бы хотел, чтобы это время было как можно ниже (опять же, я могу быть ограничен пропускной способностью диска, так как 900 операций в секунду уже высоки) ...

Спасибо

Ответы [ 2 ]

1 голос
/ 18 июня 2010

Вам нужно делать этот ряд за строкой?Почему бы не вставить все данные сразу?

Каков наилучший способ синхронизации данных между MS Access и MySQL?

1 голос
/ 18 июня 2010

Предоставляет ли PHP способ просмотра оператора INSERT, который вы выполняете после замены параметра?Я думаю, что вы не можете получать кавычки вокруг текстовых значений в вашем списке VALUES.Без кавычек ядро ​​базы данных Jet будет интерпретировать 'Field1 200001' как два значения вместо одного.

Кроме того, я не знаю PHP, но должен ли второй член вашего массива быть "Field1 $ i""Field1 $"?

Можете ли вы выполнить этот оператор из PHP?И это работает?

INSERT INTO table 
    ([field0], [field1], [field2], [field3], [field4], [field5]) 
VALUES (
    200001,
    'Field1 200001',
    'Field2 200001',
    'Field3 200001',
    'Field4 200001',
    200001);

Как насчет этого?

$sql = 'INSERT INTO table 
    ([field0], [field1], [field2], [field3], [field4], [field5]) 
    VALUES (?, "?", "?", "?", "?", ?)';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...