2013-05-16 107 views
1

我試圖通過使用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一樣訪問每條記錄?

+1

並非所有提供者(而不是所有遊標類型)都支持使用RecordCount。 -1是不支持時的默認值。你應該仍然能夠循環查看記錄(可以顯示你的代碼) –

+0

感謝蒂姆,我開始懷疑是否有這樣的情況。我通常使用'Do While Not rst.EOF'來循環記錄,但是當recordcount不起作用時,我沒有繼續嘗試代碼! (當然它工作)。所以我猜得到recordcount最簡單的方法是在查詢中返回一列,並對從GetRows()返回的內容進行計數? – CuberChase

+1

如果你只想計數,那麼'select count(*)from tableNameHere'會更快。 –

回答

1

蒂姆的評論讓我思考,尋找非MySQL的具體問題後,我發現這個蘇答案:https://stackoverflow.com/a/2032618/1733206

訣竅是使光標客戶端。因此在Set rst = New ADODB.Recordset之後添加以下行。

rst.CursorLocation = adUseClient 

而作爲進一步的說明,查詢記錄從數據庫中按添的評論直接計數(即SELECT Count(*) FROM tbl_Name)會更快了比MoveLastRecordCount組合更大的數據集。

相關問題