'Type Mismatch' ADODB.Recordset 错误

'Type Mismatch' Error on ADODB.Recordset

我有一个程序应该从 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 returns 错误 "Type Mismatch" 并突出显示 For varTempInt = 1 To varRecordset.RecordCount.RecordCount(示例中的最后一个 for 循环).我已经安装了 Windows 支持文章 983246 推荐的修补程序,至少据我所知是这样。我安装到C:目录下,重启了机器,还是不行

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

TL;DR:如何修复 64 位计算机 运行ning Excel 2010 上的 RecordSet.RecordCount "Type Mismatch" 错误?

我没有遇到过这个确切的问题,但我发现 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 6.1 而不是 ADO 2.5。看来使用更新版本的 ActiveX 数据库对象可以解决问题,呃。

为了将来参考,如果您要升级到 ADO 6.0,ConnectionString 值将保持不变,除非您必须使用 User ID=<USR>; Password=<PSWD> 而不是 USR=<USR>;PWD=<PWD>

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

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

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

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

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

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

IF intNumRecs > CInt(DBreports.RecordCount) 那么...