ADODB.Recordset上的“类型不匹配”错误

jay*_*pes 2 excel vba adodb recordset excel-vba

我有一个程序应该从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
Run Code Online (Sandbox Code Playgroud)

当运行时,Excel返回错误“类型不匹配”和亮点.RecordCountFor varTempInt = 1 To varRecordset.RecordCount(最后一个for循环的样品中)。我已安装Windows支持文章983246建议的修补程序,至少据我所知。我将其安装到C:目录并重新启动了计算机,但仍然无法正常工作。

编辑1:只是想澄清一下,我以前使用的是ADO 2.5 NOT ADO 6.1

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

dfr*_*h22 7

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

我在office 16上开发了一些宏,但是当我在以前的版本上执行UAT时,它失败了,对此的快速简便解决方案只是强制转换RecordCount

rst = SomeRecordset
dim rstCount as Long
rstCount = CLng(rst.RecordCount)
Run Code Online (Sandbox Code Playgroud)


jay*_*pes 6

感谢你们的快速回复,但是,我不知何故设法得到了使用 ADO 6.1 而不是 ADO 2.5 的想法。看起来使用更新版本的 ActiveX 数据库对象就成功了,呵呵。

为了便于将来参考,如果您要升级到 ADO 6.0,则 ConnectionString 值将相同,User ID=<USR>; Password=<PSWD>除非您必须使用USR=<USR>;PWD=<PWD>

  • 救了我的培根。干杯! 从 2.8 升级到 6.1 让我能够正确地将一个名为 `RecordCount` 的 Long 变量分配给 `rs.RecordCount` 属性 (2认同)

JNe*_*ill 1

我没有遇到过这个确切的问题,但我发现recordcountADODB 记录集上的属性时好时坏。最好的选择是重写循环,如下所示:

recordset.movefirst 
While Not recordset.eof
    <your stuff with your record>
    recordset.movenext
Loop
Run Code Online (Sandbox Code Playgroud)

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

If recordset.BOF and recordset.EOF THEN
     <Something is wrong there are no records>
End If
Run Code Online (Sandbox Code Playgroud)

我的猜测是,ADODB recordcount 属性对于您正在使用的任何 ODBC 驱动程序的 64 位版本来说可能都是垃圾,因为它几乎在每个 ODBC 驱动程序中都是如此。