2

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

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

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

注意事项:

  • 我在 Windows 7 64 位上使用 Office 2007 32 位。MySQL 服务器 (5.6) 在 Windows 8 64Bit 上。
  • ODBC 驱动程序安装来自 Oracle 安装 mysql-connector-odbc-5.2.5-win32.msi。在 ODBC 管理器中,驱动程序名称根据代码显示(还有一个 ANSI 驱动程序也不起作用。64 位 ODBC 驱动程序不适用于 32 位办公室安装。
  • 我试过引用 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 那样遍历记录集并访问每条记录?

4

1 回答 1

4

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

诀窍是使光标客户端。所以在Set rst = New ADODB.Recordset.

rst.CursorLocation = adUseClient

作为进一步的说明,根据蒂姆的评论(即SELECT Count(*) FROM tbl_Name)直接从数据库中查询记录数将比MoveLast,RecordCount组合在更大的数据集上更快。

于 2013-05-16T06:20:29.283 回答