You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:02:30