ODBC 是以 C 和 C++ for SQL Server 编写的用于应用程序的主要本机数据访问 API。 适用于 SQL Server 的 Microsoft ODBC 驱动程序可连接到 SQL Server、Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics 和 Microsoft Fabric 中的 SQL 数据库。 关于每个驱动版本支持的数据库版本,请参见 SQL版本兼容性。
其他可以使用 ODBC 的语言包括 COBOL、Perl、PHP 和 Python。 ODBC 广泛应用于数据集成场景,Microsoft PHP for SQL Server 驱动基于该驱动程序构建。
sqlcmd 和 bcp 实用工具可与该驱动程序配合使用,但需要单独安装:在 Linux 和 macOS 上安装 mssql-tools18 包,在 Windows 上安装 Microsoft Command Line Utilities。 使用 sqlcmd 运行 Transact-SQL(T-SQL)语句、系统过程和脚本文件。 使用 bcp 在 SQL Server 实例和数据文件之间批量复制数据,无论双向。
选择起点
- 要安装驱动,请进入 Windows 的系统需求、安装和驱动文件,或者在 Linux 上安装 ODBC 驱动,在 macOS 上安装 ODBC 驱动,然后安装 unixODBC 驱动管理器。
- 要写第一个应用,先去 Connect to 用 C++ 查询数据库,然后用 DSN 和 连接字符串 关键字及属性来查找 连接字符串 选项。 如果编译器找不到头文件,或者构建无法完成链接,请转到 使用 ODBC 驱动开发 C 和 C++ 应用程序。
- 要通过无密码认证连接Azure SQL,请访问使用ODBC驱动的Microsoft Entra ID。
- 要让现有应用对暂时性故障具备韧性,请访问 连接韧性 和 高可用性与灾难恢复。
- 要从版本17升级,请查看 主要版本差异 和 连接加密故障排除。
- 要诊断连接或查询问题,请访问连接加密故障排除和已知问题(Linux和macOS)。
Azure SQL的生产基线
将此代码片段用作面向生产Azure SQL连接的起点。 它从应用配置加载服务器名称和数据库名称,使用托管身份认证,确保连接字符串中不出现秘密信息,并支持表式数据流(TDS)8.0加密及完整证书验证。 它会为每次登录尝试设置超时时间,并在发生暂时性故障时采用指数退避和抖动进行重试。
本文中的 C++ 摘要省略了 include、handle allocation 和日志辅助工具以简化。
std::wstring BuildConnectionString(const wchar_t* server, const wchar_t* database) {
std::wstring cs = L"Driver={ODBC Driver 18 for SQL Server}";
cs += L";Server=tcp:"; cs += server; cs += L",1433";
cs += L";Database="; cs += database;
cs += L";Authentication=ActiveDirectoryMsi"; // managed identity, no stored secret
cs += L";Encrypt=strict"; // TDS 8.0 with certificate validation
cs += L";ConnectRetryCount=3"; // idle connection resiliency, not initial connect
cs += L";ConnectRetryInterval=10";
return cs;
}
// Transient fault codes documented for Azure SQL, plus the resource governance
// codes. Network termination and timeout errors (64, 233, 258, 10053, 10054,
// 10060) are retried a bounded number of times, which is the documented
// guidance for them. 258 is the code the driver reports for a connect timeout.
// 10053 and 10054 can also mean the encryption handshake failed rather than a
// plain network reset, so read the error text before assuming a network fault.
bool IsTransient(SQLINTEGER nativeError) {
switch (nativeError) {
case 615: case 926: case 4060: case 4221:
case 10928: case 10929: case 10936:
case 40197: case 40501: case 40613:
case 42108: case 42109:
case 49918: case 49919: case 49920:
case 40020: case 40143: case 40166: case 40540: // failover subcodes
case 64: case 233: case 258:
case 10053: case 10054: case 10060:
return true;
default:
return false;
}
}
// Retries only errors that a new connection can clear, with exponential backoff
// plus jitter so that concurrent clients don't retry in lockstep.
SQLRETURN ConnectWithRetry(SQLHDBC hDbc, const std::wstring& connectionString, int maxAttempts) {
SQLRETURN rc = SQL_ERROR;
for (int attempt = 1; attempt <= maxAttempts; ++attempt) {
// Set the per-attempt connect timeout through the connection attribute.
// This works on every driver version, so the sample doesn't depend on
// which connection string keywords a given release accepts.
SQLSetConnectAttrW(hDbc, SQL_ATTR_LOGIN_TIMEOUT,
reinterpret_cast<SQLPOINTER>(static_cast<SQLLEN>(30)), 0);
rc = SQLDriverConnectW(hDbc, nullptr,
const_cast<SQLWCHAR*>(reinterpret_cast<const SQLWCHAR*>(connectionString.c_str())),
SQL_NTS, nullptr, 0, nullptr, SQL_DRIVER_NOPROMPT);
if (SQL_SUCCEEDED(rc)) {
Log("INFO", "connected on attempt %d/%d", attempt, maxAttempts);
return rc;
}
// Walks the diagnostic records and returns the first record that carries
// a real SQL Server error number. Microsoft Entra failures report several
// driver-specific records first, whose native error is 0.
SQLINTEGER native = LogDiagnostics(SQL_HANDLE_DBC, hDbc, "connect");
if (attempt == maxAttempts || !IsTransient(native)) return rc;
// Cap the backoff at 64 seconds. This also keeps the shift in range
// when a caller passes a large maxAttempts.
int shift = (attempt - 1 < 6) ? attempt - 1 : 6;
DWORD delayMs = (1UL << shift) * 1000UL + (DWORD)(GetTickCount64() % 500);
Log("WARN", "retrying in %lu ms (attempt %d/%d)", delayMs, attempt + 1, maxAttempts);
Sleep(delayMs);
}
return rc;
}
ConnectRetryCount 并 ConnectRetryInterval 启用 空闲连接弹性,透明地恢复空闲时断开的连接。 它们不会重试初始连接,这也是为什么这个片段还实现了应用层的重试。 两者都留着。
ODBC通过报告诊断结果 SQLGetDiagRec ,而非仅返回代码,因此在重试前应对故障进行分类。 认证或配置错误会立即失败,而不是消耗全部重试预算。
有关此配置的每个部分的详细信息,请参阅:
有关 Azure SQL 瞬态错误的目录,请参阅瞬态故障错误代码。
主要功能
- 跨平台:Windows、Linux 和 macOS 使用相同的 API。
- Microsoft Entra ID认证:无密码连接,支持托管身份、服务主体、交互式和集成流程。
- 严格加密:TDS 8.0连接,18版及以后版本支持完整的证书验证。
- 始终加密:用于敏感列的客户端加密,并支持自定义密钥存储提供程序。
- 连接弹性:对空闲时断开的连接进行透明恢复。
-
高可用性:支持与
MultiSubnetFailover配合使用的可用性组侦听器。 - 数据分类:分类列的敏感元数据。
- 向量数据类型:原生支持 vector 类型。
- 分布式事务:通过 Microsoft 分布式事务处理协调器(MSDTC)支持 XA 事务。
- 配套工具: sqlcmd 和 bcp,分别安装。
开始
| 文章 | Description |
|---|---|
| 下载 SQL Server 的 ODBC 驱动程序 | 为所有支持的驱动版本提供安装程序和包下载,适用于三个平台。 |
| 使用 ODBC 驱动开发 C 和 C++ 应用程序 | 包含哪些头部、顺序、链接哪些库,以及如何在异步执行和线程之间选择。 |
| 用C++连接并查询数据库 | 一个完整的C++示例,连接、运行查询并读取结果,这样你可以从头到尾确认你的设置。 |
| 支持生命周期 | 哪些驱动程序版本仍受支持,以及各版本停止支持的日期。 |
| 主版本差异 | 从版本 17 升级到版本 18 会导致哪些问题,先从默认加密设置的更改说起。 |
安装驱动程序
| 文章 | Description |
|---|---|
| 系统需求、安装及驱动程序文件(Windows) | 受支持的 Windows 版本、用于静默部署的安装程序命令行,以及每个驱动程序文件在磁盘上的存放位置。 |
| 系统需求(Linux 和 macOS) | 每个驱动程序版本支持哪些 Linux 发行版和 macOS 版本,以及与哪些 SQL Server 版本兼容。 |
| 在Linux上安装ODBC驱动 | Alpine、Debian、Red Hat、SUSE、Ubuntu 和 Azure Linux 的包管理器步骤,以及离线安装和驱动文件位置。 |
| 在macOS上安装ODBC驱动 | macOS 上 Homebrew tap 和 formula 的操作步骤,包括如何安装 18、17 或 13.1 版本。 |
| 安装UnixODBC驱动管理器(Linux和macOS) | 安装或升级 unixODBC,这是在 Linux 和 macOS 上加载 ODBC 驱动的驱动管理器。 |
配置和连接
| 文章 | Description |
|---|---|
| DSN 和连接字符串关键字和属性 | 连接字符串关键字、DSN 条目和 SQLSetConnectAttr 属性的完整目录,以及每一项各自的可接受值。 |
| 连接字符串关键词和数据源名称(Linux和macOS) | 如何在 Linux 和 macOS 上使用 odbc.ini 和 odbcinst.ini 定义 DSN,以及这些平台特有的 TLS 和 TCP 保活设置。 |
| ODBC 数据源管理员 DSN(Windows) | Windows DSN 向导各页面上的每个选项,当通过用户界面而非连接字符串来配置数据源时适用。 |
| 驱动程序识别连接池(Windows) | 哪些连接字符串关键字和属性会将连接放入其各自独立的连接池中,哪些会在重置时需要额外一次往返。 |
认证与安全
| 文章 | Description |
|---|---|
| 使用Microsoft Entra ID搭配ODBC驱动 | 每个 Authentication 关键字值(从托管标识和服务主体到交互式和集成式),以及每一种所需的设置。 |
| 使用Always Encrypted搭配ODBC驱动 | 加密客户端进程中的敏感列,使明文永远无法到达服务器,同时包含驱动程序的 API 摘要及其文档中的限制。 |
| 数据分类 | 阅读服务器在机密列上附加的敏感性标签,以便你的应用程序能够执行自己的数据保护策略。 |
| 使用集成认证(Linux和macOS) | 配置Kerberos,让Linux或macOS客户端可以用Windows凭证连接,而不是SQL Server登录。 |
高可用性和复原能力
| 文章 | Description |
|---|---|
| 连接复原能力 | 介绍当服务器在连接空闲时断开连接后,ConnectRetryCount和ConnectRetryInterval如何恢复连接,以及在无法恢复时驱动程序返回的IMCxx错误。 |
| 高可用性和灾难恢复 | 通过可用性组监听器进行连接,并使用 MultiSubnetFailover,这样故障切换就不会因子网超时而停滞。 |
| 使用透明网络IP解析 | 遗留的 TransparentNetworkIPResolution 回退机制如何对跨多个 IP 地址的连接尝试进行排序,以及为何 MultiSubnetFailover 会取而代之。 |
处理数据
| 文章 | Description |
|---|---|
| 矢量数据类型 | 绑定、发送和获取 vector 类型,包括其原生 C 表示和批量复制支持。 |
| 将 DTC 与 XA 事务配合使用 | 通过Windows、Linux或macOS上的Microsoft 分布式事务处理协调器,将SQL Server纳入分布式事务。 |
| 编程指南(Linux和macOS) | 驱动在Linux和macOS上支持哪些功能,哪些不支持,以及字符集和OpenSSL处理与Windows有何不同。 |
诊断和故障排除
| 文章 | Description |
|---|---|
| 连接加密故障排除 | 修复版本18因默认加密而出现的证书和加密错误。 |
| 数据访问追踪(Linux 和 macOS) | 开启驾驶员追踪,并在需要查看应用实际调用时捕获日志文件。 |
| 已知问题(Linux和macOS) | 已确认缺陷及其变通方法。 在提交支持案件前请先查看这里。 |
| 常见问题解答(Linux和macOS) | 对Linux和macOS上关于驱动最常见的问题的简短回答。 |
发布说明与修复错误
| 文章 | Description |
|---|---|
| Windows 发布说明 | 每个 Windows 驱动版本中的新功能、行为变更和修复。 |
| Linux和macOS版本的发布说明 | 每个Linux和macOS驱动版本都会新增新功能、行为变更和修复。 |
| SQL Server 工具的发布说明 | 对 SQL cmd 和 bcp 工具的更改,这些工具在 Linux 和 macOS 上是单独安装的,与驱动分离。 |
Reference
| 文章 | Description |
|---|---|
| Windows 上的 ODBC 驱动 | 按版本汇总该驱动程序在 Windows 上支持的内容,以及 Windows 特定文章的索引。 |
| Windows 上 ODBC 驱动的功能 | 哪个版本引入了每个 Windows 功能,以及随之而来的行为变化。 |
请求功能
要请求功能,请通过SQL Server反馈提交想法。
相关内容
- ODBC 程序员参考手册:该驱动程序实现的 ODBC API 规范,记录在独立于驱动程序文档的单独文档中。
- SQL Server 原生客户端功能:驱动程序行为仅在本地客户端内容中记录。 这些文章适用于 SQL Server 的 ODBC 驱动,除非描述 OLE DB。
- BCP 工具:批量复制工具,单独安装于驱动程序之外。
- SQLcmd 工具:命令行查询工具,独立安装于驱动程序之外。
- 驱动功能支持矩阵
- SQL Server 驱动程序博客