PHP和MS Access:SELECT查询返回的记录数

时间:2020-03-06 14:39:17  来源:igfitidea点击:

我正在运行以下" 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())。这满足了需求,但效率低下,因为它将首先将所有记录复制到数组中。

解决方案

Access没有自己的COUNT运算符吗?例如:

$rs_select = $odbc_con -> execute ("SELECT COUNT(*) FROM Main");

ODBC可能还不知道记录数。在这种情况下,可以转到最后一条记录,直到那时,recordcount才会反映真实的记录数。这也可能不是很有效,因为它将加载查询中的所有记录。

正如Oli所说,使用SELECT COUNT(*)会得到结果。我认为使用2个查询仍然比使用我的第一种方法更有效。

基本上,Access不会向我们显示整个记录集,除非需要(特别是对于较大的记录集)(对于大多数用户而言,这样更快)。

为了获得准确的计数,我们必须遍历整个记录集。在VBA中,我通常使用foo.MoveLast和foo.MoveFirst的二重奏来执行此操作,我不知道什么是php等效项。这很昂贵,但是由于听起来我们无论如何都要处理整个记录集,所以我认为这还可以。

(附带说明,如果要在VBA中操作书签,则同样的遍历也是必要的,因为如果克隆记录集并且在将书签复制回表单的记录集之前不遍历它,则会得到一些狂野的结果)

ADODB对于要返回的记录数有自己的规则,具体取决于我们定义的记录集的类型。看:

MS知识库文章194973

W3C学校文章

在上面的示例中,PHP COM()对象用于实例化ADODB,ADODB是用于通用数据库访问的COM接口。根据PHP文档,产生的对象引用已重载,因此我们可以使用与本机ADODB对象相同的属性/方法。这意味着我们需要使用ADODB方法将记录集类型设置为一种将提供准确记录计数的记录集类型(如果必须的话)。正如其他人提到的那样,替代方法是使用第二个查询来获取SELECT语句返回的记录的COUNT()。这比较容易,但是在特定环境中可能不合适。

我不是ADO专家,因此无法为我们提供用于设置记录集类型的确切命令,但是从上面引用的文章中可以明显地看出,我们需要静态或者键集游标。在我看来,设置CursorType的正确方法是在打开记录集的命令中使用参数。 W3C Schools上有关CursorType属性的文章为该命令提供了适当的参数。

希望这些信息可以帮助原始发布者以某种方式完成他的任务。

如果我们使用的是动态游标类型的连接,则它实际上可能会更改。当我们浏览记录页面时,可能有人会从该数据库中删除记录。为避免这种情况,请使用静态种类的快照游标。我有此书签,这将很好地解释它。这总是吸引我,书签总是提醒我为什么。

http://support.microsoft.com/kb/194973