'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) 那么...
我有一个程序应该从 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) 那么...