读取直通查询结果时出现类型不匹配错误,求原因及解决方法
类型不匹配错误的原因及解决方法
错误根源是对象模型不兼容:你声明的rs是ADODB.Recordset,但CurrentDb.OpenRecordset返回的是DAO.Recordset,二者属于不同的数据访问对象模型,无法直接赋值,因此触发类型不匹配错误。
解决方法
方案1:改用DAO记录集(最简单)
如果代码不需要ADODB的特殊特性,直接切换到DAO模型即可:
Private Function GetActivityStates() Dim strSQL As String Dim rs As DAO.Recordset ' 修改为DAO.Recordset Dim intPauseState As Integer CreatePassThruQuery "WOActivityStates", "exec spGetActivityStates '" & strWO & "' " Set rs = CurrentDb.OpenRecordset("WOActivityStates") ' 现在类型匹配 Do While Not rs.EOF 'code... rs.MoveNext Loop ExitLabel: ' 清理资源 If Not rs Is Nothing Then If rs.State = dbOpenRecordset Then rs.Close Set rs = Nothing End If Exit Function ErrLabel: ErrHandler Err.Number, Err.Description Resume ExitLabel End Function
方案2:继续使用ADODB记录集
如果必须保留ADODB模型,需要通过ADODB连接来打开记录集,而非依赖CurrentDb:
Private Function GetActivityStates() Dim con As New ADODB.Connection Dim rs As New ADODB.Recordset Dim intPauseState As Integer Dim qdf As DAO.QueryDef CreatePassThruQuery "WOActivityStates", "exec spGetActivityStates '" & strWO & "' " ' 获取直通查询的连接配置 Set qdf = CurrentDb.QueryDefs("WOActivityStates") ' 建立ADODB连接并执行查询 con.ConnectionString = qdf.Connect con.Open Set rs = con.Execute(qdf.SQL) Do While Not rs.EOF 'code... rs.MoveNext Loop ExitLabel: ' 清理资源 If Not rs Is Nothing Then If rs.State = adStateOpen Then rs.Close Set rs = Nothing End If If Not con Is Nothing Then If con.State = adStateOpen Then con.Close Set con = Nothing End If Set qdf = Nothing Exit Function ErrLabel: ErrHandler Err.Number, Err.Description Resume ExitLabel End Function
额外提示
直接拼接字符串"exec spGetActivityStates '" & strWO & "' "存在SQL注入风险,建议改用参数化查询:
- 针对直通查询,可创建带参数的查询定义;
- 针对ADODB,使用
ADODB.Command对象传递参数,避免字符串拼接。
内容的提问来源于stack exchange,提问作者TheMortiestMorty
相关产品推荐
相关产品推荐

