我正在运行以下PHP
代码与MS Access数据库进行交互。
$odbc_con = new COM("ADODB.Connection");
$constr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . $db_path . ";";
$odbc_con -> open($constr);
$rs_select = $odbc_con -> execute ("SELECT * FROM Main");
虽然查询返回非零记录,但使用($rs_select -> RecordCount)
给出-1。
(a)可能是什么原因? (b)有出路吗?
我也尝试过使用count($rs_select -> GetRows())
。这满足了需求,但看起来效率低,因为它将涉及首先将所有记录复制到数组中。
答案 0 :(得分:1)
ODBC可能还不知道记录计数。在这种情况下,可以转到最后一条记录,然后记录计数才会反映真实的记录数。这可能也不会非常有效,因为它将从查询中加载所有记录。
正如Oli所说,使用SELECT COUNT(*)
会给你结果。我认为使用2个查询仍然比使用我的第一个方法更有效。
答案 1 :(得分:1)
根据您定义的记录集类型,ADODB对返回的记录数有自己的规则。参见:
MS Knowledge Base article 194973
在上面的示例中,PHP COM()对象用于实例化ADODB,这是一个用于通用数据库访问的COM接口。根据{{3}},生成的对象引用是重载的,因此您可以使用与本机ADODB对象相同的属性/方法。这意味着您需要使用ADODB方法将记录集类型设置为能够提供准确记录计数的记录集(如果必须的话)。正如其他人所提到的,替代方法是使用第二个查询来获取SELECT语句返回的记录的COUNT()。这更容易,但在特定环境中可能不合适。
我不是ADO大师,因此无法为您提供设置记录集类型的确切命令,但从上面引用的文章中可以看出,您需要一个静态或键集游标。在我看来,设置CursorType的正确方法是在打开记录集的命令中使用参数。 PHP documentation为该命令提供了适当的参数。
希望这些信息可以帮助原始海报以某种方式完成他的任务。
答案 2 :(得分:0)
Access是否有自己的COUNT运算符?例如:
$rs_select = $odbc_con -> execute ("SELECT COUNT(*) FROM Main");
答案 3 :(得分:0)
基本上,Access不会在需要之前向您展示整个记录集(无论如何,它对于大部分用户体验来说都更快) - 尤其是对于更大的记录集。
要获得准确的计数,您必须遍历整个记录集。在VBA中,我通常使用foo.MoveLast和foo.MoveFirst - 我不知道php等价物是什么。这很贵,但是因为听起来你还是会处理整个记录集,我想这没关系。
(旁注,如果您在VBA中操作书签,同样的遍历也是必要的,因为如果克隆记录集并且在将书签复制回表单的记录集之前不进行遍历,则可能会得到一些疯狂的结果)
答案 4 :(得分:-1)
如果您正在使用动态游标类型的连接,那么它实际上可能会更改。当您浏览记录页时,有人可能会从该数据库中删除记录。要避免,请使用静态类型的快照光标。我有这个书签,这将很好地解释它。这总是让我和书签总是提醒我为什么。