微軟 SQL Server 的 ODBC 驅動程式

下載 ODBC 驅動程式

ODBC 是以 C 及 C++ 撰寫之 SQL Server 應用程式的主要原生資料存取 API。 Microsoft ODBC 的 SQL Server 驅動程式可連接 SQL Server、Azure SQL Database、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 實例與資料檔案之間批量複製資料,無論雙向皆然。

選擇你的起點

Azure SQL 的生產環境基準

請使用此片段作為生產導向 Azure SQL 連線的起點。 它從應用程式設定載入伺服器名稱與資料庫名稱,並以管理身份驗證,確保 連接字串 中不出現秘密,並啟用 Tabular Data Stream(TDS)8.0 加密及完整憑證驗證。 它會設定每次登入嘗試的逾時時間,並以指數退避和隨機抖動機制重試暫時性錯誤。

本文中的 C++ 摘要為簡潔起見,省略了 include、handle allocation 和 log helper。

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 認證:無密碼連線,包含管理身份、服務主體、互動式及整合流程。
  • 嚴格加密:在第 18 版及更新版本中,TDS 8.0 連線會採用完整的憑證驗證。
  • 始終加密:用戶端加密以處理敏感欄位,並支援自訂金鑰儲存提供者。
  • 連線復原能力:可透明地重新建立在閒置時中斷的連線。
  • 高可用性:可用性群組監聽器支援。MultiSubnetFailover
  • 資料分類:分類欄位的敏感性元資料。
  • 向量資料型別:原生支援 向量 型別。
  • 分散式交易:透過 Microsoft Distributed Transaction Coordinator(MSDTC)支援 XA 交易。
  • 配套工具: sqlcmd 和 bcp,分別安裝。

開始

文章 說明
下載 SQL Server 的 ODBC 驅動程式 每個支援驅動版本的安裝程式和套件下載,涵蓋三個平台。
使用 ODBC 驅動程式開發 C 與 C++ 應用程式 要包含哪些標頭、順序、連結哪些函式庫,以及如何在非同步執行與執行緒之間選擇。
使用 C++ 連接並查詢資料庫 完整的 C++ 範例,能連接、執行查詢並讀取結果,讓你能從頭到尾確認你的設定。
支援生命週期 哪些驅動程式版本仍受支援,以及每個版本的停止支援日期。
主要版本差異 從版本 17 移轉到版本 18 時,哪些地方會失效,先從預設加密設定的變更談起。

安裝驅動程式

文章 說明
系統需求、安裝與驅動程式檔案(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 驅動程式。

設定和連線

文章 說明
DSN 與連接字串關鍵字與屬性 完整的 連接字串 關鍵字、DSN 條目與SQLSetConnectAttr屬性目錄,並附有各項可接受的值。
連線字串關鍵字與資料來源名稱(Linux 與 macOS) 如何透過 odbc.ini 和 odbcinst.ini 在 Linux 與 macOS 上定義 DSN,以及這些平台特有的 TLS 和 TCP keep-alive 設定。
ODBC 資料來源管理員 DSN(Windows) 當您透過使用者介面而非連線字串來設定資料來源時,Windows DSN 精靈頁面中的各個選項。
驅動程式感知連線池(Windows) 哪些 連接字串 關鍵字和屬性會將連線放入獨立的池中,哪些則需要額外往返重置。

認證與安全

文章 說明
使用 Microsoft Entra ID 搭配 ODBC 驅動程式 每個 Authentication 關鍵字值,從管理身份、服務主體到互動式與整合式,並附有各自所需的設定。
搭配 ODBC 驅動程式使用 Always Encrypted 加密用戶端程序中的敏感欄位,確保明文無法傳送到伺服器,並附上驅動程式的 API 摘要及其文件中的限制。
資料分類 閱讀伺服器附在機密欄位上的敏感性標籤,讓您的應用程式能執行自己的資料保護政策。
使用整合驗證(Linux 和 macOS) 設定 Kerberos,讓 Linux 或 macOS 用戶端能用 Windows 憑證連線,而非 SQL Server 登入。

高可用性與韌性

文章 說明
連線韌性 ConnectRetryCount 和 ConnectRetryInterval 如何在伺服器於連線閒置時中斷連線後恢復連線,以及在無法恢復時驅動程式會傳回的 IMCxx 錯誤。
高可用性與災難復原 透過可用性群組監聽器連接,並使用 MultiSubnetFailover 故障轉移,避免在子網路逾時卡頓。
使用透明網路 IP 解析 舊有的 TransparentNetworkIPResolution 後援機制如何在多個 IP 位址之間安排連線嘗試的順序,以及為什麼 MultiSubnetFailover 會取而代之。

處理資料

文章 說明
Vector 資料類型 綁定、傳送及擷取 vector 型別,包括其原生 C 表示法及大量複製支援。
用 XA 交易來處理 DTC 透過 Windows、Linux 或 macOS 上的 Microsoft Distributed Transaction Coordinator,將 SQL Server 登錄到分散式交易中。
程式設計指引(Linux 與 macOS) 驅動程式在 Linux 和 macOS 上支援哪些功能,哪些功能沒有?以及字元集和 OpenSSL 處理與 Windows 有何不同。

診斷和疑難解答

文章 說明
連線加密故障排除 修正版本 18 因預設加密而出現的憑證與加密錯誤。
資料存取追蹤(Linux 與 macOS) 開啟驅動追蹤,並在需要查看應用程式實際呼叫時擷取日誌檔。
已知問題(Linux 與 macOS) 已確認缺陷及其解決方法。 在提出支援案件前,請先確認這裡。
常見問題(Linux 與 macOS) 針對 Linux 和 macOS 上驅動程式最常被問到的問題,提供簡短回答。

發行說明與錯誤修正

文章 說明
Windows 版本的發行說明 每個 Windows 驅動版本中的新功能、行為變更與修正。
Linux 與 macOS 版本的發行說明 每個 Linux 和 macOS 驅動版本中都有新功能、行為變更與修正。
SQL Server 工具的發行說明 修改了 sqlcmd 和 bcp 工具,這些工具在 Linux 和 macOS 上是獨立安裝於驅動程式之外的。

Reference

文章 說明
Windows 上的 ODBC 驅動程式 針對驅動程式在 Windows 上支援的版本逐版本摘要,以及 Windows 專屬文章的索引。
Windows 上 ODBC 驅動程式的功能 哪個版本引入了每個 Windows 功能,以及隨之而來的行為變更。

提出功能要求

若要請求功能,請透過 SQL Server 回饋提交想法。