MySQL Recordset不应该返回值

时间:2013-05-16 04:49:56

标签: mysql vba adodb recordset

我正在尝试使用ADODB从MySQL通过VBA(在Excel中)检索记录集。我可以通过网络成功连接到MySQL数据库,甚至可以使用ADOX返回表的列表,但是当我尝试返回记录集时,recordcount为-1​​并且它是空的。

当我在MySQL Workbench中输入相同的SQL语句时,结果将按预期返回。

我已成功使用ADO连接到Access数据库,现在想将该数据库移动到MySQL并遇到此问题。

需要注意的事项:

  • 我在Windows 7 64Bit上使用Office 2007 32位。 MySQL服务器(5.6)在Windows 8 64Bit上。
  • ODBC驱动程序安装来自Oracle install mysql-connector-odbc-5.2.5-win32.msi。在ODBC管理器中,驱动程序名称按代码显示(还有一个ANSI驱动程序,它也不起作用.64Bit ODBC驱动程序不能与32位办公室安装一起使用。
  • 我尝试过引用Microsoft ActiveX Data Objects 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 个答案:

答案 0 :(得分:3)

蒂姆的评论让我思考,在搜索非MySQL特定问题后,我发现了这个答案:https://stackoverflow.com/a/2032618/1733206

诀窍是使游标客户端。因此,请在Set rst = New ADODB.Recordset之后添加以下行。

rst.CursorLocation = adUseClient

另外需要注意的是,根据Tim的评论(即SELECT Count(*) FROM tbl_Name)直接从数据库中查询记录数将比MoveLastRecordCount组合更快地覆盖大型数据集。