将应用程序从 MDAC 更新到 SQL Server Native Client

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

重要

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中删除SQL Server Native Client(通常缩写为 SNAC)。 不建议在新应用程序开发工作中使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 请在此后切换为使用新版 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新版的 Microsoft OLE DB Driver for SQL Server。 对于作为 SQL Server 数据库引擎组件(版本 2012 到 2019)随附的 SQLNCLI,请参阅此支持生命周期特例

SQL Server Native Client 和 Microsoft 数据访问组件(MDAC)之间存在许多差异;从 Windows Vista 开始,数据访问组件现在称为 Windows 数据访问组件或 Windows DAC。 尽管两者都提供对 SQL Server 数据库的本机数据访问,但 SQL Server Native Client 专为公开 SQL Server 2005(9.x)的新功能而设计,同时保持与早期版本的向后兼容性。

本主题中的信息有助于将 MDAC(或 Windows DAC)应用程序更新为与 SQL Server 2005(9.x)中包含的 SQL Server Native Client 版本保持最新状态。 若要帮助你使此应用程序与 SQL Server 中随附的 SQL Server Native Client 版本保持最新状态,请参阅 从 SQL Server 2005 Native Client 更新应用程序。

注意

SQL Server Native Client 已从 SQL Server 2022(16.x)中删除。

此外,尽管 MDAC 包含用于使用 OLE DB、ODBC 和 ActiveX 数据对象(ADO)的组件,但 SQL Server Native Client 仅实现 OLE DB 和 ODBC(尽管 ADO 可以访问 SQL Server Native Client 的功能)。

SQL Server Native Client 和 MDAC 在其他方面有所不同:

  • 使用 ADO 访问 SQL Server Native Client 提供程序的用户可能会发现筛选功能可能比访问 SQL OLE DB 提供程序时少。

  • 如果 ADO 应用程序使用 SQL Server Native Client 并尝试更新计算列,将报告错误。 对于 MDAC,此更新已接受,但被忽略。

  • SQL Server Native Client 是单个独立动态链接库 (DLL) 文件。 公开的接口已经保持为最低限度,这样既是为了减轻分发工作,也是为了降低安全风险。

  • 仅支持 OLE DB 和 ODBC 接口。

  • SQL Server Native Client OLE DB 访问接口和 ODBC 驱动程序名称不同于与 MDAC 一起使用的名称。

  • 使用 SQL Server Native Client 时,MDAC 组件提供的用户可访问功能。 这包括但不限于以下功能:连接池、ADO 支持以及客户端游标支持。 使用其中任何一项功能时,SQL Server Native Client 仅提供数据库连接。 MDAC 可提供诸如跟踪、管理控件和性能计数器等功能。

  • 应用程序可以将 OLE DB 核心服务与 SQL Server Native Client 配合使用,但如果使用 OLE DB 游标引擎,它们应使用数据类型兼容性选项来避免可能出现的任何潜在问题,因为游标引擎不知道新的 SQL Server 2005 (9.x) 数据类型。

  • SQL Server Native Client 支持访问以前的 SQL Server 数据库。

  • SQL Server Native Client 不包含 XML 集成。 SQL Server Native Client 支持 标准版LECT ...FOR XML 查询,但不支持任何其他 XML 功能。 但是,SQL Server Native Client 确实支持 SQL Server 2005(9.x)中引入的 xml 数据类型。

  • SQL Server Native Client 仅支持使用连接字符串属性配置客户端网络库。 如果需要更完整的网络库配置,您必须使用 SQL Server 配置管理器。

  • SQL Server Native Client 与odbcbcp.dll不兼容。 若要使用 SQL Server Native Client,必须重新生成使用 ODBC 和 bcp API 的应用程序以与 sqlncli11.lib 链接。

  • MICROSOFT OLE DB PROVIDER for ODBC 不支持 SQL Server Native Client(MSDASQL)。 如果将 MDAC SQLODBC 驱动程序与 MSDASQL 或 MDAC SQLODBC 驱动程序与 ADO 配合使用,请使用 SQL Server Native Client 中的 OLE DB。

  • MDAC 连接字符串允许将布尔值 (true ) 用于 Trusted_Connection 关键字。 SQL Server Native Client 连接字符串必须使用“是”或“否”。

  • 警告和错误已发生小的改动。 服务器返回的警告和错误现在在传递给 SQL Server Native Client 时保留相同的严重性。 如果要依赖于捕获特定的警告和错误,则应当确保已经全面测试了应用程序。

  • SQL Server Native Client 的错误检查比 MDAC 更严格,这意味着某些不符合 ODBC 和 OLE DB 规范的应用程序的行为可能有所不同。 例如,SQLOLEDB 提供程序没有强制执行参数名称必须以“@”开头的规则,但 SQL Server Native Client OLE DB 访问接口必须以“@”开头。

  • SQL Server Native Client 在连接失败时的行为与 MDAC 不同。 例如,MDAC 返回失败的连接的缓存属性值,而 SQL Server Native Client 向调用应用程序报告错误。

  • SQL Server Native Client 不生成 Visual Studio 分析器事件,而是生成 Windows 跟踪事件。

  • SQL Server Native Client 不能与 perfmon 一起使用。 Perfmon 是一种 Windows 工具,它仅可与使用 Windows 附带的 MDAC SQLODBC 驱动程序的 DSN 一起使用。

  • 当 SQL Server Native Client 连接到 SQL Server 2005 (9.x) 及更高版本时,服务器错误 16947 将作为SQL_ERROR返回。 定位更新无法更新行或定位删除无法删除行时,会出现此错误。 当 MDAC 连接到任何版本的 SQL Server 时,服务器错误 16947 会作为警告 (SQL_SUCCESS_WITH_INFO) 返回。

  • SQL Server Native Client 实现 IDBDataSource管理员 接口,该接口是以前未实现的可选 OLE DB 接口,但仅实现此可选接口的 CreateDataSource 方法。 在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

  • SQL Server Native Client OLE DB 访问接口在 TABLES 中返回同义词,TABLE_INFO架构行集,TABLE_TYPE设置为 SYNONYM。

  • 数据类型 varchar(max)、nvarchar(max)、varbinary(max)xmludt 或其他大型对象类型的返回值不能返回到低于 SQL Server 2005(9.x)的客户端版本。 如果要将这些类型用作返回值,则必须使用 SQL Server Native Client。

  • MDAC 允许在手动事务和隐式事务开始时执行以下语句,但 SQL Server Native Client 不执行。 这些语句必须以自动提交模式执行。

    • 所有全文操作(索引和目录 DDL)

    • 所有数据库操作(创建数据库、更改数据库以及删除数据库)

    • 重新配置

    • 关机

    • 终止

    • 备份

  • MDAC 应用程序连接到 SQL Server 时,SQL Server 2005 (9.x) 中引入的数据类型将显示为与 SQL Server 2000 (8.x) 兼容的数据类型,如下表所示。

    SQL Server 2005 类型 SQL Server 2000 类型
    varchar(max) text
    nvarchar(max) ntext
    varbinary(max) 图像
    udt varbinary
    xml ntext

    此类型映射会影响为列元数据返回的值。 例如,文本列的最大大小为 2,147,483,647,但 SQL Server Native Client ODBC 将 varchar(max) 列的最大大小报告为 SQL_SS_LENGTH_UNLIMITED,SQL Server Native Client OLE DB 将 varchar(max) 列的最大大小报告为 2,147,483,647 或 -1,具体取决于平台。

  • SQL Server Native Client 允许在连接字符串中存在歧义(例如,某些关键字 (keyword)可以多次指定一次,并且出于向后兼容性的原因,可能会允许冲突关键字 (keyword)解析。 SQL Server Native Client 的未来版本可能无法在连接字符串中含糊不清。 修改应用程序以使用 SQL Server Native Client 消除对连接字符串歧义的任何依赖关系时,这是一个很好的做法。

  • 如果使用 ODBC 或 OLE DB 调用启动事务,则 SQL Server Native Client 和 MDAC 的行为存在差异;事务将立即开始于 SQL Server Native Client,但事务将在使用 MDAC 进行第一次数据库访问后开始。 这可能会影响存储过程和批处理的行为,因为 SQL Server 要求不管是在批处理或存储过程执行结束后还是在该批处理或存储过程启动时 @@TRANCOUNT 均应相同。

  • 使用 SQL Server Native Client,ITransactionLocal::BeginTransaction 将导致立即启动事务。 如果使用 MDAC,则事务会延迟,直到应用程序已执行要求事务处于隐式事务模式的语句后才启动。 有关详细信息,请参阅 SET IMPLICIT_TRANSACTIONS (Transact-SQL)

  • 在 System.Data.Odbc 中使用 SQL Server Native Client 驱动程序访问公开新的 SQL Server 特定数据类型或功能的 SQL Server 服务器计算机时,可能会遇到错误。 System.Data.Odbc 提供通用 ODBC 实现,随后不会公开供应商特定的功能或扩展。 (SQL Server Native Client 驱动程序已更新为本机支持最新的 SQL Server 功能。若要解决此问题,可以还原 MDAC,或迁移到 System.Data.SqlClient。

SQL Server Native Client 和 MDAC 都支持使用行版本控制进行读取提交的事务隔离,但只有 SQL Server Native Client 支持快照事务隔离。 (就编程而言,使用行版本控制的已提交读事务隔离等同于已提交读事务。)

另请参阅

使用 SQL Server Native Client 生成应用程序