2008-09-24 24 views
3

我正在運行以下PHP代碼以與MS Access數據庫進行交互。PHP和MS Access:SELECT查詢返回的記錄數

$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

MS Access不涉及到這裏,只有Jet數據庫引擎。 – 2008-09-24 21:27:43

回答

1

根據您定義的記錄集的類型,ADODB對返回的記錄數有自己的規則。參見:

MS Knowledge Base article 194973

W3C Schools article

在上面的例子中,PHP COM()對象被用於實例ADODB,通用數據庫訪問的COM接口。根據PHP documentation,生成的對象引用被重載,因此您可以使用與本機ADODB對象相同的屬性/方法。這意味着您需要使用ADODB方法將記錄集類型設置爲能夠提供準確記錄數的記錄集類型(如果必須的話)。正如其他人所提到的,另一種方法是使用第二個查詢來獲取SELECT語句返回的記錄的COUNT()。這很容易,但在特定的環境中可能不合適。

我不是一個ADO大師,所以不能爲您提供確切的命令來設置您的記錄集類型,但從上面引用的文章中,顯然您需要一個靜態或鍵集遊標。在我看來,設置CursorType的正確方法是在打開記錄集的命令中使用參數。 This W3C Schools article on the CursorType property給出了該命令的適當參數。

希望這些信息能幫助原始海報完成他的任務,無論如何。

0

不接入有自己的COUNT運算符嗎?例如:

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

這不是所希望的,因爲它會導致多個SQL查詢 - 一個獲得計數,另一個獲取記錄。 目標是檢索記錄集並檢查它的記錄數以驗證它。 – VarunGupta 2008-09-24 11:23:17

+0

我可以看到的唯一其他選項(您也已經參與)涉及不必要地傳輸大量數據來計算它。觸發一個額外的小查詢似乎更合理。 – Oli 2008-09-24 13:03:23

1

ODBC可能還不知道記錄計數。在這種情況下,可以轉到最後一條記錄,只有這樣recordcount才能反映真實的記錄數。這可能也不是很有效,因爲它會加載查詢中的所有記錄。

正如奧利所說,使用SELECT COUNT(*)會給你結果。我認爲使用2個查詢仍然比使用我的第一個方法更有效率。

0

基本上,Access並不會告訴你整個記錄集,直到它需要爲止(對於大多數用戶體驗來說它的速度更快) - 尤其是對於更大的記錄集。

要獲得準確的計數,您必須遍歷整個記錄集。在VBA中,我通常通過foo.MoveLast和foo.MoveFirst二重奏來做到這一點 - 我不知道PHP的等價物是什麼。這很昂貴,但是因爲無論如何,這聽起來像是要處理整個記錄集,所以我認爲它是可以的。

(注意,如果您在VBA中操作書籤,也需要此相同的遍歷,因爲如果您在將書籤複製回表單之前克隆記錄集並且不遍歷它,記錄集)

+0

這實際上取決於您正在使用的數據接口。如果返回記錄,則DAO記錄集返回的記錄數爲1或更多,如果沒有返回記錄數,則記錄數爲0,但在發出.MoveLast命令之前記錄數不可信。 ADO和ODBC是不同的。 – 2008-09-24 21:22:31

-1

如果您使用動態遊標類型的連接,那麼它實際上可能會改變。在瀏覽記錄頁面時,有人可能會從該數據庫中刪除記錄。爲了避免使用靜態類型的快照光標。我有這書籤,這將解釋得很好。這總是讓我和書籤總是提醒我爲什麼。

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