如何在VBA中配置OLEDB连接字符串读取SQL Server始终加密列?
问题:VBA ADO读取SQL Server Always Encrypted列未解密
Access前端通过ODBC链接表、SSMS查询均能正常读取Always Encrypted列的明文,但使用MSOLEDBSQL19驱动的VBA ADO代码读取时,返回的始终是加密后的乱码值。
解决步骤
1. 必须在连接字符串中启用列加密设置
Always Encrypted需要客户端驱动显式开启解密支持,你的连接字符串缺少关键参数Column Encryption Setting=Enabled,这是导致解密失败的核心原因。
修改后的连接字符串示例:
Provider=MSOLEDBSQL19;SERVER=<ServerName>;DATABASE=<DatabaseName>;Use Encryption for Data=True;Trust Server Certificate=True;Column Encryption Setting=Enabled;
如果使用SQL Server身份验证,完整连接字符串:
Provider=MSOLEDBSQL19;SERVER=<ServerName>;DATABASE=<DatabaseName>;UID=<UserName>;PWD=<Password>;Use Encryption for Data=True;Trust Server Certificate=True;Column Encryption Setting=Enabled;
2. 确认驱动版本与证书权限
- 确保安装的是最新版MSOLEDBSQL19驱动,旧版本对Always Encrypted的客户端解密支持存在缺陷
- 运行VBA的Windows用户必须能访问列主密钥对应的证书:SSMS和ODBC能正常解密说明证书已在当前用户的证书存储中,但需确认VBA运行上下文与两者一致(比如是否以同一用户启动Access)
3. 简化ADO执行逻辑
避免可能干扰解密的复杂命令配置,直接通过Connection对象执行查询:
修改后的VBA代码示例:
Public Function Test(strUserName As String, strPassword As String) Dim objADOConnection As Object Dim rst As Object Dim strSQL As String Dim strSQLConnectionString As String ' 配置带列加密的连接字符串 strSQLConnectionString = "Provider=MSOLEDBSQL19;SERVER=<ServerName>;DATABASE=<DatabaseName>;" _ & "Use Encryption for Data=True;Trust Server Certificate=True;" _ & "Column Encryption Setting=Enabled;" Set objADOConnection = CreateObject("ADODB.Connection") objADOConnection.Open strSQLConnectionString, strUserName, strPassword ' 直接通过连接执行查询 strSQL = "select MedicareNo FROM General.Client where ClientID = 8;" Set rst = objADOConnection.Execute(strSQL) If Not rst.EOF Then Debug.Print rst(0) End If rst.Close objADOConnection.Close Set rst = Nothing Set objADOConnection = Nothing End Function
4. 移除干扰性兼容参数
不要添加DataTypeCompatibility=80,该参数用于兼容旧版Access数据类型,会破坏驱动对Always Encrypted加密列的数据类型映射,导致解密失败。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

