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

ASP迁移至新SQL Server后,ADO Recordset执行rs.Update报COUNT字段错误

问题解决思路

核心问题分析

错误80004005的直接原因是游标类型与锁定类型不兼容:你使用了adOpenForwardOnly(仅向前游标),这种游标默认是只读模式,无法配合adLockOptimistic(乐观锁定)执行更新操作。旧服务器可能对这种不兼容配置有宽松处理,新SQL Server环境严格遵循了ADO规范。

具体修复步骤

1. 调整游标与锁定类型

将游标类型改为可滚动的adOpenKeyset,确保支持更新操作:

rs.CursorType = adOpenKeyset  ' 替换原adOpenForwardOnly
rs.LockType = adLockOptimistic

2. 优化查询语句(可选但推荐)

避免使用select *,明确指定需要的字段(至少包含主键和要更新的NP字段),减少不必要的数据传输,也避免因表结构变更导致的隐式问题:

sql = "SELECT MainKey, NP FROM tblMain WHERE MainKey = " & keyID

3. 移除不必要的Requery

rs.Update之后已经完成数据更新,不需要再执行rs.Requery,直接关闭记录集即可:

' 移除 rs.Requery 这一行
rs.Close

4. 检查ODBC驱动兼容性(可选)

新服务器如果使用的是较新版本的SQL Server,建议将连接字符串中的驱动改为SQL Server Native Client 11.0(根据SQL Server版本调整),提升兼容性:

session("dsn_name") = "driver={SQL Server Native Client 11.0};server=server1;database=DB1;User ID=User1; Password=pw;"

完整修复后的代码示例

<%
session("dsn_name") = "driver={SQL Server};server=server1;database=DB1;User ID=User1; Password=pw;"
DIM updateNPI, keyID, oldNP, newNP
    updateNPI = ""
    keyID = "371"
    oldNP = ""
    newNP = "2324"
    set systemConn = server.CreateObject ("adodb.connection")
    systemConn.ConnectionString = session("dsn_name")
    systemConn.Open
    set rs = server.CreateObject ("ADODB.recordset")
    rs.CursorLocation = adUseServer
    rs.CursorType = adOpenKeyset  ' 修改游标类型
    rs.LockType = adLockOptimistic
    
    sql = "SELECT MainKey, NP FROM tblMain WHERE MainKey = " & keyID  ' 明确字段
    
    rs.Open sql,systemconn
    oldNP = rs("NP")
    
    rs("NP") = TRIM(newNP)
    rs.Update
            
    rs.Close
    set rs = nothing
    systemConn.Close
    set systemConn = nothing
%>

内容的提问来源于stack exchange,提问作者BrettKB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:37:50