为 SQL 服务器从 sqloledb 切换到 odbc 驱动程序 13

Switching from sqloledb to odbc driver 13 for SQL Server

我想使用 SQL Server 2016 SP1 中介绍的 Always Encrypted 功能。为此,我需要使用新的 ODBC Driver 13.1 for SQL Server 而不是当前的 sqloledb

它似乎破坏了我的应用程序,例如,当返回 XML 时。 Here,据说:

In order to take advantage of new features introduced in SQL Server 2005 such as multiple active result sets (MARS), query notifications, user-defined types (UDTs), or the new xml data type, existing applications that use ActiveX Data Objects (ADO) should use the SQL Server Native Client OLE DB provider as their data access provider.

所以,这意味着我需要重写代码,其中使用了 XML

我知道,Microsoft undeprecated 已弃用 sqloledb 驱动程序,但其 2018 年 3 月推出的第一个版本将不支持 Always Encrypted - 所以,我不想等待。

经典 ADO 没有 SQL 服务器 XML 类型的概念。旧版 SQLOLEDB 提供程序和旧版 SQL 服务器 ODBC 驱动程序 return 为 XML 键入 adLongVarWChar (203),因此它是客户端的字符串。

较新的 SQL 服务器本机客户端 OLE DB 提供程序 return 为 XML 键入 141 到 ADO,但没有匹配的 ADO DataTypeEnum (https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/datatypeenum)。当为 ADO 兼容性指定 DataTypeCompatibility=80 连接字符串关键字时,提供程序将 return XML 数据作为 adLongVarWChar。

遗憾的是,ODBC 驱动程序没有等效的 DataTypeCompatibility 连接字符串关键字。较新的 ODBC 驱动程序 return XML 数据作为 ADO 类型 adLongVarBinary (205) 当通过 MSDASQL 提供程序访问时,经典 ADO 用于 ODBC 驱动程序。因此 XML 需要在 SQL 查询中转换为 to/from nvarchar(MAX) 或在客户端转换 adLongVarBinary 值。

我不能说尚未发布的 SQL 服务器的 Microsoft OLE DB 驱动程序是否会通过支持 DataTypeCompatibility 关键字来缓解这种情况,但我希望它能像 Native Client 一样。希望我们很快就会知道更多细节。我怀疑 ADO 是否会得到加强以原生支持较新的 SQL 类型,因为它在过去 15 年中几乎没有被触及过,但我以前错了。

我不会使用ODBC驱动;它有许多 "wontfix" 错误。

您应该使用当前支持的 MSOLEDB 驱动程序:Microsoft OLE DB Driver for SQL Server

并且您必须在 ConnectionString 中包含:

DataTypeCompatibility=80

原因丹说。