我試圖通過使用ADODB的VBA(在Excel中)從MySQL檢索記錄集。我可以通過網絡成功連接到MySQL數據庫,甚至可以使用ADOX返回表的列表,但是當我嘗試返回一個記錄集時,記錄數是-1,它是空的。MySQL Recordset不應該返回值它應該
當我在MySQL Workbench中輸入相同的SQL語句時,結果按預期返回。
我一直使用ADO成功連接到Access數據庫,現在想將該數據庫移動到MySQL並且遇到此問題。
注意事項:
- 我使用的是64位Windows 7 32位Office 2007。 MySQL服務器(5.6)在Windows 8 64Bit上。
- ODBC驅動程序安裝來自Oracle安裝mysql-connector-odbc-5.2.5-win32.msi。在ODBC管理器中,根據代碼顯示驅動程序名稱(也有一個ANSI驅動程序,它也不起作用)。64位ODBC驅動程序不適用於32位Office安裝。
- 我試過了引用Microsoft ActiveX數據對象2.8和6.1
這是我使用的代碼:。
Sub TestMySQL()
Dim cnn As ADODB.Connection, rst As ADODB.Recordset
'Set up the connection
Set cnn = New ADODB.Connection
cnn.Open "DRIVER={MySQL ODBC 5.2 Unicode Driver};" & _
"SERVER=192.168.99.5;" & _
"PORT=3307;" & _
"DATABASE=MySQLDatabase;" & _
"USER=username;" & _
"PASSWORD=password;" & _
"OPTION=3;"
'Set up the recordset
Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM tbl_Test", cnn, adOpenDynamic, adLockReadOnly
'Check the recordcount
rst.MoveLast
rst.MoveFirst
If rst.RecordCount > 0 Then MsgBox "Success!"
Cleanup:
On Error Resume Next
If rst.State = adStateOpen Then rst.Close: Set rst = Nothing
If cnn.State = adStateOpen Then cnn.Close: Set cnn = Nothing
End Sub
並記錄在案,該代碼使用上述連接成功返回數據庫中的所有表
Sub DisplayDBTables(cnn As Object)
Dim ct As Object: Set ct = CreateObject("adox.Catalog")
Dim tb As Object: Set tb = CreateObject("adox.Table")
Set ct.ActiveConnection = cnn
For Each tb In ct.Tables
If tb.Type = "TABLE" Then Debug.Print tb.Name
Next tb
Set ct = Nothing: Set tb = Nothing
End Sub
任何人都可以提供一個線索,爲什麼我不能返回一個記錄集?因此使用rst.GetRows()
方法將結果返回給數組。所以我想現在我的問題是爲什麼我不能循環訪問記錄集並像通常使用ADODB一樣訪問每條記錄?
並非所有提供者(而不是所有遊標類型)都支持使用RecordCount。 -1是不支持時的默認值。你應該仍然能夠循環查看記錄(可以顯示你的代碼) –
感謝蒂姆,我開始懷疑是否有這樣的情況。我通常使用'Do While Not rst.EOF'來循環記錄,但是當recordcount不起作用時,我沒有繼續嘗試代碼! (當然它工作)。所以我猜得到recordcount最簡單的方法是在查詢中返回一列,並對從GetRows()返回的內容進行計數? – CuberChase
如果你只想計數,那麼'select count(*)from tableNameHere'會更快。 –