ADODB.Recordset出现“类型不匹配”错误

10

我有一个程序,应该从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 返回一个“类型不匹配”的错误,并突出显示 For varTempInt = 1 To varRecordset.RecordCount(样例中的最后一个 for 循环)中的.RecordCount。我已经根据 Windows 支持文章 983246 推荐的方法安装了补丁程序,至少在我理解的范围内。我将其安装到 C: 目录并重新启动了我的机器,但仍然无法正常工作。
注:我之前使用的是 ADO 2.5 而不是 ADO 6.1。
简而言之,我应该如何在运行 Excel 2010 的 64 位机器上修复 RecordSet.RecordCount 的“类型不匹配”错误?

你的 varConnection 使用哪种类型的光标?我认为你需要使用 adOpenKeyset 或者 adOpenStatic 才能在 ADO 中得到准确的 .RecordCount。默认的 adOpenForwardOnly 对于此目的是不足够的。 - user4039065
@Jeeped,我一直在使用adUseClient(3)。我在互联网上看到过它,但如果adOpenKeyset或adOpenStatic更好的话,我愿意尝试一下。 - jaysoncopes
6个回答

17

这个问题实际上是由早期版本的Excel中的一个错误导致的。有一个热修复补丁可以解决问题。 热修复补丁

我在Office 16上开发了一些宏,但当我在旧版本上进行用户验收测试时失败了,一个快速简单的解决方法是将RecordCount强制转换。

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

谢谢,升级到 Office 32 => 64 后,我的 Excel、Word 和 Access 中的 VBA 代码问题已经解决了,因为需要安装 Visio...... 实际上,我认为这应该标记为答案。 - Marcelo Scofano Diniz
我已经有一段时间没有看过这个了,但我很高兴它能帮到你。干杯! - dfresh22

6
谢谢你们的快速回复,不过我已经想到使用ADO 6.1而不是ADO 2.5了。显然,使用更新版本的ActiveX数据库对象就解决了问题。供以后参考,如果您要升级到ADO 6.0,则ConnectionString值将相同,但必须使用; Password=>而不是; PWD=>。

2
救了我的一命。干杯!从2.8升级到6.1使我能够正确地将名为RecordCount的Long变量分配给rs.RecordCount属性。 - Jay Killeen

3

我将其从 as Long 更改为 as LongLong,然后我的VBA开始工作了。不需要热修复...


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

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


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的recordcount属性在64位版本的ODBC驱动中可能是垃圾,就像几乎所有的ODBC驱动程序一样。

谢谢您的快速回复!我不喜欢必须绕过ADO 2.5的怪癖,但如果ADO 6.0行不通,这绝对是一个有效的选择(我刚刚测试了它)。 - jaysoncopes

0

只需检查Excel的版本。ADO在32位上运行良好,在64位上可能会出现一些问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接