使用 Microsoft.Data.SqlClient 的 ADO.NET 架构

ADO.NET 是内置于 .NET 的数据访问模型。 Microsoft。Data.SqlClient 实现了该模型,适用于兼容 SQL Server 的数据库,并增加了 SQL Server 特定的功能。

Microsoft.Data.SqlClient 着陆页提供了驱动程序功能图和生产基线。 本文解释了驱动程序如何融入ADO.NET。

ADO.NET 抽象与 SqlClient 类型

ADO.NET 在命名空间中定义了提供者无关的抽象System.Data.Common。 Microsoft。Data.SqlClient 提供具体的实现。

ADO.NET 抽象 SqlClient 类型 Purpose
DbConnection SqlConnection 打开与某个数据库的逻辑连接。
DbCommand SqlCommand 执行SQL文本或存储过程。
DbParameter SqlParameter 发送一个与命令文本分开的输入值。
DbDataReader SqlDataReader 从服务器流式传输结果行。
DbTransaction SqlTransaction 将一组命令组合成一个原子事务。
DbDataAdapter SqlDataAdapter 填充并更新已断开连接的 DataSetDataTable 对象。
DbBatch SqlBatch 在支持的目标框架上,将多个命令作为一个批次发送。

当库需要支持多个数据库提供者时,针对ADO.NET抽象进行编程。 当应用针对SQL Server并需要提供者特定功能时,可以使用SqlClient类型。

连接数据访问

连接访问在命令运行和应用程序读取结果时保持连接可用性。

常见的请求如下:

  1. 通过连接字符串创建一个SqlConnection
  2. 打开连接。
  3. 创建一个 SqlCommand 并添加 SqlParameter 值。
  4. 执行命令。
  5. 处理标量值、受影响行计数,或 SqlDataReader
  6. 丢弃读卡器、命令和连接。

对大多数 Web API、服务、Worker 和命令行应用程序使用连接式访问。 SqlDataReader 以流式方式处理行数据,通常比将整个结果加载到 DataSet 中占用更少的内存。

对于每个工作单元,创建并释放 SqlConnection 是常见的模式。 连接池机制会复用底层的物理连接。 不要在应用程序的整个生命周期内始终保持单个全局连接处于打开状态。

断开数据访问

SqlDataAdapter在 SQL Server 与内存DataSetDataTable内存储器之间传输数据。 应用程序可以在读取或更改内存数据时关闭连接,然后重新连接以提交更新。

在以下情况下,请使用脱机访问:

  • 数据绑定至 DataSetDataTable
  • 内存关系与约束。
  • 离线编辑后会进行对账。
  • 与基于DataAdapters构建的现有应用程序兼容。

对于新的面向请求服务,建议从 SqlCommandSqlDataReader 开始,除非你需要分离的对象模型。

SQL Server 特定功能

Microsoft.Data.SqlClient 添加了不属于独立于提供程序的 ADO.NET 约定的 API 和连接行为:

  • Microsoft Entra 身份验证和访问令牌回调函数。
  • TDS 8.0 严格加密和 SQL Server 证书选项。
  • 总是加密且安全的飞地。
  • SqlBulkCopy 用于高吞吐量数据加载。
  • 表值参数。
  • SQL Server 数据类型,包括 JSON 和矢量类型。
  • 可配置重试逻辑。
  • SQL Server 诊断、统计和计数器。
  • 可用性组和故障转移连接选项。

使用这些功能会使该代码绑定到 Microsoft.Data.SqlClient。 如果应用的其他部分必须保持提供者独立,则将特定提供者代码保留在数据访问边界后。

对象生命周期与并发

及时丢弃连接、命令、读取器、事务和批量复制对象。 当类型实现 IAsyncDisposable时,与异步代码一起使用await using

SqlConnectionSqlCommandSqlDataReaderSqlTransaction不支持多个线程并发使用。 为每个并发操作分配各自独立的连接,并利用连接池。 多激活结果集(MARS)允许连接上有多个活跃结果集,但并不保证 SqlClient 对象是线程安全的。

包与命名空间

安装 Microsoft.Data.SqlClient NuGet 包并导入 Microsoft.Data.SqlClient 命名空间。 驱动程序独立于 .NET 发布,因此其功能、发布和支持计划与 .NET 运行时不同。

System.Data.SqlClient 是较早的服务提供商。 新开发请使用 Microsoft.Data.SqlClient。 对于现有应用程序,请参阅从 System.Data.SqlClient 迁移到 Microsoft.Data.SqlClient