【问题标题】:MySQL Recordset Not Returning Values When it ShouldMySQL 记录集不应该返回值
【发布时间】:2013-05-16 04:49:56
【问题描述】:

我正在尝试使用 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 那样遍历记录集并访问每条记录?

【问题讨论】:

  • 并非所有提供者(也不是所有游标类型)都支持使用 RecordCount。 -1 是不支持时的默认值。不过,您仍然应该能够遍历记录(您可以显示那部分的代码吗?)
  • 谢谢蒂姆,我开始怀疑是否是这种情况。我通常使用Do While Not rst.EOF 之类的东西来循环记录,但是当记录计数不起作用时,我没有继续尝试代码! (它当然有效)。所以我想获取记录计数的最简单方法是在查询中返回单个列并计算从GetRows()返回的内容?
  • 如果你只想要计数,那么select count(*) from tableNameHere 会更快。
  • 不错的提示,但我找到了解决方案!我会发布一个答案。

标签: mysql vba adodb recordset


【解决方案1】:

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

诀窍是让光标客户端。所以在Set rst = New ADODB.Recordset之后添加以下行。

rst.CursorLocation = adUseClient

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-26
    • 2015-01-20
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多