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

时间:2015-02-25 20:33:38

标签: excel excel-vba adodb recordset 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

运行时,Excel会返回错误"类型不匹配"并突出显示.RecordCount的{​​{1}}(示例中的最后一个for循环)。我已经安装了Windows支持文章983246推荐的修补程序,至少在我理解的情况下。我将它安装到C:目录并重新启动我的机器,但它仍然无效。

编辑1:只是想澄清我之前使用的是ADO 2.5 NOT ADO 6.1

TL; DR:如何修复For varTempInt = 1 To varRecordset.RecordCount"类型不匹配"运行Excel 2010的64位计算机上出错?

6 个答案:

答案 0 :(得分:4)

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

我在办公室16上开发了一些宏,但是在以前的版本上做UAT时,它失败了,一个快速简单的解决办法就是抛出RecordCount

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

答案 1 :(得分:3)

感谢大家的快速回复,但是,我不知何故设法使用ADO 6.1代替ADO 2.5。看来,使用更新版本的ActiveX数据库对象可以解决这个问题。

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

答案 2 :(得分: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属性可能与您正在使用的任何ODBC驱动程序的64位版本相同,因为它几乎在每个ODBC驱动程序中都有。

答案 3 :(得分:0)

只需检查Excel的版本。 ADO在64位时运行良好32位和出牙问题。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

IF intNumRecs> CInt(DBreports.RecordCount)然后...