【问题标题】:'Type Mismatch' Error on ADODB.RecordsetADODB.Recordset 上的“类型不匹配”错误
【发布时间】:2015-04-28 00:53:45
【问题描述】:

我有一个程序应该从 SQL 数据库中读取数据并返回给 Excel。它在 32 位机器上按预期工作,但由于我转移到 64 位工作环境,该程序无法运行。这是我的代码示例(返回的第一个错误):

Private Sub SearchBox_Change()
ResultBox.Clear

Call CompileQuery

'If the query is empty
If SearchBox.Value = "" Then
    NumShowingLabel = "Showing 0 of 0 Results"
    ResultBox.Clear
    GoTo noSearch
End If

'Open a new query with varQuery
With varRecordset
    .ActiveConnection = varConnection
    .Open varQuery
End With

'Set NumShowingLabel
If varRecordset.RecordCount > varMaxResults Then
    NumShowingLabel = "Showing 60 of " & varRecordset.RecordCount & " Results"
Else
    NumShowingLabel = "Showing " & varRecordset.RecordCount & " of " & varRecordset.RecordCount & " Results"
End If

'As long as there is a record, move to the first one
If Not varRecordset.RecordCount = 0 Then varRecordset.MoveFirst

'Add each record to ResultBox
If varRecordset.RecordCount > varMaxResults Then
    For varTempInt = 1 To varMaxResults
        ResultBox.AddItem varRecordset.Fields("FileName").Value
        varRecordset.MoveNext
    Next
Else
    For varTempInt = 1 To varRecordset.RecordCount
        ResultBox.AddItem varRecordset.Fields("FileName").Value
        varRecordset.MoveNext
    Next
End If

'Release varRecordSet
varRecordset.Close

noSearch:

End Sub

运行时,Excel 返回错误“类型不匹配”并突出显示 .RecordCountFor varTempInt = 1 To varRecordset.RecordCount(示例中的最后一个 for 循环)。我已经安装了 Windows 支持文章 983246 推荐的修补程序,至少据我所知。我把它安装到了C:目录,然后重启了我的机器,但是还是不行。

编辑 1:只是想澄清一下我之前使用的是 ADO 2.5 而不是 ADO 6.1

TL;DR:如何在运行 Excel 2010 的 64 位计算机上修复 RecordSet.RecordCount“类型不匹配”错误?

【问题讨论】:

  • 您的varConnection 使用什么类型的光标?我相信您需要adOpenKeysetadOpenStatic 才能通过ADO 获得准确的.RecordCount。默认的adOpenForwardOnly 不足以实现此目的。
  • @Jeeped 我一直在使用 adUseClient (3)。我在互联网的某个地方看到过,但如果 adOpenKeyset 或 adOpenStatic 会更好,我愿意尝试。

标签: excel adodb recordset vba


【解决方案1】:

我没有遇到这个确切的问题,但我发现 ADODB 记录集上的 recordcount 属性被命中或未命中。你最好的办法是重写循环,如:

recordset.movefirst 
While Not recordset.eof
    <your stuff with your record>
    recordset.movenext
Loop

此外,要测试您的记录集中是否有记录,您可以使用:

If recordset.BOF and recordset.EOF THEN
     <Something is wrong there are no records>
End If

我的猜测是,ADODB 记录计数属性可能与您使用的任何 ODBC 驱动程序的 64 位版本一样糟糕,因为它几乎用于每个 ODBC 驱动程序。

【讨论】:

  • 感谢您的快速回复!我不喜欢我必须解决 ADO 2.5 的特性这一事实,但如果 ADO 6.0 不起作用,这绝对是一个有效的选择(我刚刚测试过)。
【解决方案2】:

感谢你们的快速回复,但是,不知何故,我设法获得了使用 ADO 6.1 而不是 ADO 2.5 的想法。看来,使用更新版本的 ActiveX 数据库对象可以解决问题,呵呵。

为了将来参考,如果您要升级到 ADO 6.0,ConnectionString 值将是相同的,除非您必须使用 User ID=&lt;USR&gt;; Password=&lt;PSWD&gt; 而不是 USR=&lt;USR&gt;;PWD=&lt;PWD&gt;

【讨论】:

  • 救了我的培根。干杯!从 2.8 升级到 6.1 使我能够正确地将名为 RecordCount 的 Long 变量分配给 rs.RecordCount 属性
【解决方案3】:

此问题实际上是由早期 excel 中的错误引起的。那里有一个修补程序。 HotFix

我在 office 16 上开发了一些宏,但是当我在以前的版本上执行 UAT 时,它失败了,一个快速简单的解决方案就是简单地转换 RecordCount

rst = SomeRecordset
dim rstCount as Long
rstCount = CLng(rst.RecordCount)

【讨论】:

  • 谢谢,由于 Visio 不得不升级 Office 32 => 64 后,修复了 Excel & Word & Access 中的我的 VBA 代码...确实,我认为这应该被标记为答案。跨度>
  • 自从我看了这个已经有一段时间了,但我很高兴它能够帮助你。干杯
【解决方案4】:

只需检查 Excel 的版本。 ADO 在 32 位上运行良好,在 64 位上运行良好。

【讨论】:

    【解决方案5】:

    我把它从 只要 到 作为龙龙 然后我的 VBA 开始工作。无需修补程序...

    【讨论】:

      【解决方案6】:

      由于相同类型的比较,我们遇到了这个错误,并且使用了与 dfresh22 和 Jonson Tsai 相同的答案。谢谢各位!
      对我们来说唯一的区别是错误发生在 64 位 Office 上,我们仍然有几个用户在 32 位 Office 上,因此更容易转换为较小的 32 位变量,而不是转换为较大的 64 位多变的。由于我们与 RecordCount 比较的变量将始终小于 100(并且绝对始终小于 32K),因此我只能在 64 位版本中从 Long 转换为 Integer,而 32 位代码只会从 Integer 转换为 Integer:

      IF intNumRecs > CInt(DBreports.RecordCount) THEN...

      【讨论】:

        猜你喜欢
        • 2017-04-14
        • 1970-01-01
        • 2013-01-16
        • 2014-02-05
        • 2018-06-08
        • 1970-01-01
        • 2012-02-16
        • 2012-02-25
        相关资源
        最近更新 更多