如何解决VB6.0中"3670: Cursor is not valid"错误
问题分析与解决
核心问题
你的代码触发"3670: Cursor is not valid"错误,主要源于两个关键问题:
- SQL语法隐患:原代码拼接SQL时,
Sql= Sql & "where id=10"缺少空格,会导致Table1与where连写为Table1where,引发语法错误——虽然你提到去掉临时表语句后正常,但这是潜在的语法风险。 - 多语句批处理的游标冲突:你将创建临时表的DDL操作与查询临时表的语句合并在同一个SQL字符串中执行,而
OpenRecordset仅适用于处理单查询语句的结果集,混合非查询操作会导致游标无法正确初始化。
解决步骤
1. 拆分SQL执行流程
将创建临时表和查询操作分开执行,先完成临时表创建,再进行查询:
Dim p_C As ADODB.Connection Dim p_R1 As ADODB.Recordset Dim Sql As String ' 第一步:执行创建临时表的SQL(修正空格问题) Sql = "SELECT d_start, d_finish, name FROM Table1 " & _ "WHERE id=10 INTO #tempTable" p_C.Execute Sql ' 执行DDL操作,无需返回记录集 ' 第二步:查询临时表 Sql = "SELECT * FROM #tempTable" Set p_R1 = p_C.OpenRecordset(Sql, dbOpenSnapshot) If Not p_R1.EOF Then ' 执行你的业务逻辑 End If ' 释放资源 p_R1.Close Set p_R1 = Nothing
2. 调整游标位置(可选)
如果仍报错,检查连接对象的CursorLocation属性,根据数据库类型设置合适的游标位置:
p_C.CursorLocation = adUseServer ' 或 adUseClient,按需调整
原理说明
- 临时表的作用域绑定当前数据库连接,拆分执行能确保临时表完全创建后再查询,避免时序冲突。
OpenRecordset设计用于处理单查询结果,混合DDL与查询语句会导致游标无法识别有效结果集,进而触发"Cursor is not valid"错误。
内容的提问来源于stack exchange,提问作者Kristina Tamaro
相关产品推荐
相关产品推荐

