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
相关产品推荐
相关产品推荐

