4

では、MS Access データベース テーブルに MySQL クエリの結果を入力する必要があります。それはまったく難しいことではありません。テンプレート .mdb ファイルを一時名にコピーし、odbc 経由で開くプログラムを作成しました。今のところ問題ありません。

Access がバッチ挿入 ( ) をサポートしていないことに気付きましたVALUES (foo, bar), (second, query), (third query)。つまり、行ごとに 1 つのクエリを実行する必要があります (数十万行になる可能性があります)。初期パフォーマンス テストでは、Access への 1 秒あたり約 900 の挿入率が示されています。私たちの最大のデータ セットでは、実行時間が数分になる可能性があります (これで終わりというわけではありませんが、明らかに速ければ速いほど良いのです)。

というわけで、プリペアドステートメントをテストしてみました。しかし、エラーが発生し続けます ( 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);
}

だから私の質問は2つあります。?まず、なぜそのエラーが発生するのかについての考えはありますか (確認しましたが、配列内の数値は、パラメーターマーカーの数と一致するフィールド リストと一致します)。そして第二に、私はこれを気にするべきですか、それともまっすぐな INSERT ステートメントを使用するべきですか? 私が言ったように、時間は重要ではありませんが、可能であれば、その時間をできるだけ短くしたいと思います (繰り返しになりますが、900 オペレーション/秒はすでに高いため、ディスクのスループットによって制限される可能性があります)。 .

ありがとう

4

2 に答える 2

1

PHPは、パラメーター置換後に実行しているINSERTステートメントを表示する方法を提供しますか?VALUESリストのテキスト値を引用符で囲んでいない可能性があると思います。引用符がない場合、Jetデータベースエンジンは「Field1200001」を1つではなく2つの値として解釈します。

また、PHPはわかりませんが、配列の2番目のメンバーを「Field1$」ではなく「Field1$ i」にする必要がありますか?

このステートメントを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 (?, "?", "?", "?", "?", ?)';
于 2010-06-18T16:05:00.330 に答える
1

これを行ごとに行う必要がありますか?すべてのデータを一度に挿入してみませんか?

MS Access と MySQL の間でデータを同期する最良の方法は何ですか?

于 2010-06-18T19:59:57.237 に答える