3

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

4

5 回答 5

1

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

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

于 2008-09-24T11:32:53.773 回答
1

根据您定义的记录集类型,ADODB 对返回的记录计数有自己的规则。看:

MS 知识库文章 194973

W3C 学校文章

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

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

希望这些信息能以一种或另一种方式帮助原始发帖人完成他的任务。

于 2008-09-24T21:43:40.777 回答
0

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

$rs_select = $odbc_con -> execute ("SELECT COUNT(*) FROM Main");
于 2008-09-24T11:14:25.050 回答
0

基本上,Access 在需要之前不会向您显示整个记录集(无论如何,对于大部分用户体验来说,这种方式更快) - 特别是对于较大的记录集。

要获得准确的计数,您必须遍历整个记录集。在 VBA 中,我通常使用 foo.MoveLast 和 foo.MoveFirst 的二重奏来做到这一点——我不知道 php 的等价物是什么。它很贵,但听起来你无论如何都要处理整个记录集,我想这没关系。

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

于 2008-09-24T18:21:29.047 回答
-1

如果您使用的是动态游标类型的连接,那么它实际上可能会发生变化。当您浏览记录页面时,有人可能会从该数据库中删除记录。为避免这种情况,请使用静态类型的快照游标。我有这个书签,它会很好地解释它。这总是让我着迷,书签总是提醒我为什么。

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

于 2008-09-25T16:26:10.923 回答