使用MSOLEDBSQL19与TLS1.3时,ASP-ADODB无法执行SQL Server CRUD操作
问题场景
在Classic ASP页面中通过ADODB搭配MSOLEDBSQL19驱动连接SQL Server 2022,SQL Server端已启用Force encryption=Yes:
- 当连接字符串配置
Use Encryption for data=optional时,以TLS 1.2协议连接,所有CRUD操作均正常执行。 - 改为
Use Encryption for data=Strict以启用TLS 1.3后,仅SELECT查询能正常运行,执行UPDATE操作时出现两类错误:- 未指定锁类型:ADODB.Recordset错误
800a0cb3,提示「记录集不支持更新」 - 指定锁类型(
rs.Open传入参数2,3,1):Microsoft OLE DB Driver 19错误80004005,提示「TDS协议流异常」
- 未指定锁类型:ADODB.Recordset错误
- 尝试改用
Encrypt=strict参数时,连接仍强制使用TLS 1.2协议,无法触发TLS 1.3。
环境信息:
- SQL Server 2022(含EXPRESS与Developer版本)
- MSOLEDBSQL驱动版本19.3.2
- 客户端与服务器均为Windows Server 2022
- 基于Classic ASP + ADODB实现数据库连接
解决方案
1. 升级MSOLEDBSQL驱动至最新稳定版
当前使用的19.3.2版本存在TLS 1.3环境下ADODB更新操作的兼容性BUG,官方在19.10.0及以上版本中已修复TDS协议流异常及Recordset更新限制问题,建议直接升级到最新版本。
2. 修正连接字符串参数配置
MSOLEDBSQL驱动需使用Use Encryption for Data=Strict参数才能触发TLS 1.3,同时需添加TrustServerCertificate=No避免驱动 fallback 到TLS 1.2,完整连接字符串示例:
Dim connStr connStr = "Provider=MSOLEDBSQL19;Server=你的服务器地址;Database=目标数据库;Uid=登录账号;Pwd=登录密码;Use Encryption for Data=Strict;TrustServerCertificate=No"
注意:
Encrypt=strict是ODBC驱动的专属参数,不适用于MSOLEDBSQL驱动,请勿混用。
3. 替换Recordset更新方式为ADODB.Command参数化执行
绕过Recordset在TLS 1.3下的锁类型兼容性问题,改用ADODB.Command执行参数化UPDATE语句,示例代码:
Dim conn, cmd Set conn = Server.CreateObject("ADODB.Connection") conn.Open connStr Set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = conn ' 替换为你的UPDATE语句,使用?作为参数占位符 cmd.CommandText = "UPDATE 示例表 SET 字段1=? WHERE 主键字段=?" ' 添加参数:参数名、类型、方向、长度、值 cmd.Parameters.Append cmd.CreateParameter("newValue", adVarChar, adParamInput, 50, "更新后的值") cmd.Parameters.Append cmd.CreateParameter("id", adInt, adParamInput, , 1001) ' 执行更新 cmd.Execute ' 资源释放 conn.Close Set cmd = Nothing Set conn = Nothing
4. 验证TLS 1.3连接状态
通过SQL Server系统视图确认当前连接使用的TLS版本,执行以下SQL语句:
SELECT session_id, encrypt_option, protocol_version FROM sys.dm_exec_connections WHERE session_id = @@SPID;
其中
protocol_version值为0x0304即代表使用TLS 1.3协议。
5. 确认Windows Server 2022的TLS 1.3配置
确保系统未通过组策略或注册表禁用TLS 1.3:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3 - 确认
Client和Server子项中的Enabled值为1,DisabledByDefault值为0
内容的提问来源于stack exchange,提问作者Mangesh Auti
相关产品推荐
相关产品推荐

