English 中文(简体)
PHP和MS Access:SELECT查询返回的记录数
原标题:
  • 时间:2008-09-24 11:04:46
  •  标签:

我正在运行以下<code>PHP</code>代码来与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) What can be the reason? (b) Is there any way out?

我还尝试过使用count($rs_select->;GetRows())。这满足了需求,但看起来效率很低,因为它将首先将所有记录复制到阵列中。

最佳回答

根据您定义的记录集类型,ADODB有自己的规则来确定返回的记录数。请参阅:

MS知识库文章194973

W3C学校文章

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

我不是ADO大师,所以无法为您提供设置记录集类型的确切命令,但从上面引用的文章中可以清楚地看出,您需要一个静态或键集游标。在我看来,设置CursorType的正确方法是在打开记录集的命令中使用参数这篇W3C学校关于CursorType属性的文章为该命令提供了适当的参数。

希望这些信息能以某种方式帮助最初的海报完成他的任务。

问题回答

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

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

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

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

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

为了获得准确的计数,您必须遍历整个记录集。在VBA中,我通常使用foo.MoveLast和foo.MoveFirst这两个函数来实现这一点——我不知道php的等价物是什么。这很贵,但听起来你无论如何都要处理整个唱片集,我想这还可以。

(需要注意的是,如果您在VBA中操作书签,这种遍历也是必要的,因为如果您克隆记录集,并且在将书签复制回表单的记录集之前不遍历它,则可能会得到一些不确定的结果)

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

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





相关问题
热门标签