好的,所以我需要使用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次操作/秒很高)。
由于
答案 0 :(得分: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 (?, "?", "?", "?", "?", ?)';
答案 1 :(得分:1)
你需要逐行吗?为什么不一次插入所有数据?
What is the best way to synchronize data between MS Access and MySQL?