4

好的,所以我需要使用 MySQL 查询的结果填充 MS Access 数据库表。这一点都不难。我已将程序写入将模板 .mdb 文件复制到临时名称并通过 odbc 打开它的位置。到目前为止没有问题。

我注意到 Access 不支持批量插入 ( VALUES (foo, bar), (second, query), (third query))。所以这意味着我需要每行执行一个查询(可能有数十万行)。初始性能测试显示 Access 的插入速率约为 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);
}

所以我的问题是两个方面。首先,是否知道为什么会出现该错误(我已经检查过,数组中的数字与与参数?标记数量匹配的字段列表匹配)?其次,我应该为此烦恼还是只使用直接的 INSERT 语句?就像我说的,时间并不重要,但如果可能的话,我希望尽可能缩短时间(再说一次,我可能会受到磁盘吞吐量的限制,因为 900 次操作/秒已经很高了).. .

谢谢

4

2 回答 2

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 (?, "?", "?", "?", "?", ?)';
于 2010-06-18T16:05:00.330 回答
1

您需要逐行执行此操作吗?为什么不一次插入所有数据?

在 MS Access 和 MySQL 之间同步数据的最佳方式是什么?

于 2010-06-18T19:59:57.237 回答