命名Microsoft.Data.SqlClient空间包含支持的 .NET 数据提供者,用于兼容 SQL Server 的数据库。 它最初是从 System.Data.SqlClient 分支而来的,同时保留了人们熟悉的 ADO.NET 编程模型,并且能够独立于 .NET 运行时发布新的 SQL Server 功能。
请使用 Microsoft.Data.SqlClient 进行新开发。
安装并导入命名空间
添加NuGet包:
dotnet add package Microsoft.Data.SqlClient
导入命名空间:
using Microsoft.Data.SqlClient;
大多数应用使用 SqlConnection、 SqlCommand、 SqlParameter、 SqlDataReader和 SqlTransaction。 完整的公开表面,请参见 Microsoft.Data.SqlClient API 参考。
与ADO.NET的关系
ADO.NET 是内置于 .NET 的数据访问模型。 它在 System.Data.Common 命名空间中定义了与提供程序无关的抽象,而 Microsoft.Data.SqlClient 提供了具体实现。
| ADO.NET 抽象 | SqlClient 类型 | Purpose |
|---|---|---|
| DbConnection | SqlConnection | 打开与某个数据库的逻辑连接。 |
| DbCommand | SqlCommand | 执行 Transact-SQL(T-SQL)文本或存储过程。 |
| DbParameter | SqlParameter | 发送一个与命令文本分开的输入值。 |
| DbDataReader | SqlDataReader | 从服务器流式传输结果行。 |
| DbTransaction | SqlTransaction | 将命令分组到一个事务中,作为一个整体提交或回滚。 |
| DbDataAdapter | SqlDataAdapter | 填充并更新已断开连接的 DataSet 和 DataTable 对象。 |
| DbBatch | SqlBatch | 在支持的目标框架上,将多个命令作为一个批次发送。 |
Microsoft.Data.SqlClient 还提供针对 SQL Server 的专用 API,例如:
SqlBulkCopySqlConnectionStringBuilderSqlConfigurableRetryFactorySqlDependency- SQL Server 专用的认证、加密和数据类型支持
当库需要支持多个数据库提供者时,针对ADO.NET抽象进行编程。 当应用以 SQL Server 为目标并需要提供程序特定功能时,可以使用 SqlClient 类型,如 Microsoft Entra 身份验证、Always Encrypted、批量复制、表值参数或可配置的重试逻辑。 如果应用的其他部分必须保持提供者独立,则将特定提供者代码保留在数据访问边界后。
已连接和已断开访问
连接式访问 在命令运行期间以及应用程序读取其结果时保持连接开启。 典型请求通常遵循以下顺序:
- 从一个连接字符串创建一个
SqlConnection,然后打开它。 - 创建一个
SqlCommand并添加SqlParameter值。 - 执行命令。
- 处理标量值、受影响行计数或
SqlDataReader。 - 丢弃读卡器、命令和连接。
对大多数 Web API、服务、Worker 和命令行应用程序使用连接式访问。
SqlDataReader 以流式方式处理行数据,通常比将整个结果加载到 DataSet 中占用更少的内存。
已断开访问使用 SqlDataAdapter 将数据复制到内存中的 DataSet 或 DataTable。 应用程序可以在读取或更改内存数据时关闭连接,然后重新连接以提交更新。 将其用于数据绑定、内存关系和约束、稍后协调的离线编辑,或用于围绕 DataAdapters 构建的现有应用程序。 对于新的请求导向服务,请从SqlDataReader和SqlCommand开始。
对象生命周期与并发
为每个工作单元打开并释放一个 SqlConnection。 连接池会重用底层的物理连接,所以不要在应用生命周期内保持一个全局连接开放。 及时丢弃连接、命令、读取器、事务和批量复制对象。 在异步代码中,对于在目标框架上实现 SqlConnection 的类型,使用 IAsyncDisposable,例如 .NET 上的 SqlDataReader 和 using;而对于仅实现 await using 的类型,则使用普通的 IDisposable,例如 SqlBulkCopy。
SqlConnection、SqlCommand、SqlDataReader和SqlTransaction不支持多个线程并发使用。 为每个并发操作分配各自独立的连接,并利用连接池。 多激活结果集(MARS)允许连接上有多个活跃结果集,但并不保证 SqlClient 对象是线程安全的。
与System.Data.SqlClient的关系
System.Data.SqlClient是较早的供应商,提供 .NET 框架和更早的 .NET 版本。
Microsoft.Data.SqlClient 它使用许多相同的类型名称,但包、命名空间、默认值、功能和支持策略不同。
不要在新的申请代码中提及两个提供者。 来自这两个包的同名类型不能互换使用。 例如,一个 System.Data.SqlClient.SqlConnection 不能传递给需要 Microsoft.Data.SqlClient.SqlConnection 的地方。
迁移通常从添加 Microsoft.Data.SqlClient 包和更改命名空间引用开始,但你还必须审查连接加密、参数、配置、传递依赖和运行时行为。 在部署之前,请先按照 从 System.Data.SqlClient 迁移到 Microsoft.Data.SqlClient 进行操作。
版本兼容性
驱动程序包版本独立于应用程序的 .NET 版本和数据库引擎版本。 请查看这三部作品:
| 组件 | 需要验证的内容 |
|---|---|
| Microsoft.Data.SqlClient | 发布行是支持的,包含你的应用所用的功能。 |
| .NET 或 .NET 框架 | 该应用程序的目标运行时由该驱动版本支持。 |
| 兼容SQL Server的数据库 | 驱动版本支持数据库版本,服务器支持任何请求的协议功能,如TDS 8.0。 |
关于当前矩阵,请参见 SqlClient 驱动支持生命周期。
版本特定的更改
驱动程序发布可以添加API、移动可选依赖,并更改安全默认。 每次进行次要更新或重大更新前,都要检查更改。
示例包括:
- 4.0版本默认改
Encrypt为true。 - 5.0 版本引入了用于 TDS 8.0 的
SqlConnectionEncryptOption和Encrypt=Strict。 - 5.2版本引入
SqlBatch于支持的现代.NET目标上。 - 7.0版本将驱动程序提供的Microsoft Entra认证迁移到了
Microsoft.Data.SqlClient.Extensions.Azure。
请参阅 Microsoft.Data.SqlClient 中的新增功能,了解发布说明链接和升级摘要。
相关的命名空间和包
部分功能使用主命名空间外的类型或可选包。
| 命名空间或包 | Purpose |
|---|---|
Microsoft.Data.SqlClient.Server |
SqlDataRecord 和 SqlMetaData 的 SqlClient 实现。 |
Microsoft.Data.SqlTypes |
SqlClient 专有类型,例如 SqlFileStream、SqlJson 和 SqlVector<T>。 |
Microsoft.Data.SqlClient.Diagnostics |
强类型的诊断事件负载。 |
Microsoft.Data.SqlClient.Extensions.Azure |
适用于 7.0 及更高版本的由驱动程序提供的 Microsoft Entra 身份验证 |
Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider |
Azure 密钥保管库 与 Always Encrypted 集成。 |
不要仅凭命名空间推断包的需求。 请参照专题文章以及针对所使用驱动程序版本的 NuGet 包依赖信息。