2010-06-18 5 views
3

Итак, мне нужно заполнить таблицу базы данных 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 операций/сек уже высоки). .

Благодаря

ответ

1

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

What is the best way to synchronize data between MS Access and MySQL?

+0

Woah! Вы можете сделать это? Теперь мой MySQL-запрос довольно сложный. Должен ли я написать это в синтаксисе Access? Или я пишу его в синтаксисе MySQL, но выполняю его через Access? Я определенно не хочу делать это по строкам (если нужно, отлично), но запрос, который генерирует результаты, имеет от 2 до 8 объединений и переменную величину предложения where (и group by) trickery ... Даже по-прежнему это выглядит как интересный маршрут ... – ircmaxell

+0

Вы должны иметь возможность выполнить сквозной запрос в Access или использовать ADO и строку подключения MySQL, и в этом случае вы можете обратиться к Access с IN , Я не уверен, с чего вы хотите начать, поэтому немного сложнее дать более подробную информацию. – Fionnuala

+0

Я поиграю с этим немного в понедельник, и если у меня возникнут проблемы, отправьте новый вопрос ... Спасибо! – ircmaxell

1

ли 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 (?, "?", "?", "?", "?", ?)'; 
+0

Не то, чтобы я нашел. Поскольку он пишет в локальный файл, я не могу даже прокрутить его (что я знаю) ... – ircmaxell

+0

Да, это работает очень хорошо ... – ircmaxell

+0

В этом случае я подозреваю, что проблемы с инструкциями INSERT передаются в Jet без цитируемые текстовые значения. К сожалению, я не понял, как исправить это из PHP. – HansUp

Смежные вопросы