Microsoft OLE DB ドライバー for SQL Server

OLE DB ドライバーのダウンロード

Microsoft OLE DB Driver for SQL ServerはOLE DBの一部であるスタンドアロンのデータアクセスアプリケーションプログラミングインターフェース(API)です。 C および C++ アプリケーションを、Azure SQL Database、Microsoft Fabric の SQL データベース、Azure SQL Managed Instance、およびサポートされているバージョンの SQL Server に含まれる Microsoft SQL データベース エンジン に接続できるようにします。 Microsoftは2018年にバージョン18として初めてリリースし、SQL Server 2019(15.x)に含めました。

MSOLEDBSQL19 が現在のドライバーです。 通常、SQL Server Native Client(SNAC)との後方互換性があり、SNAC と、Windows Data Access Components(Windows DAC、旧称 Microsoft Data Access Components(MDAC))が提供する SQL Server OLE DB プロバイダーの両方を上回る機能を提供します。

出発点を選択する

Azure SQLの運用ベースライン

このスニペットは、運用環境向けのAzure SQL接続の開始点として使用します。 アプリケーション設定からサーバー名とデータベース名を読み込み、管理型IDで認証して接続文字列に秘密が現れないようにし、完全な証明書検証付きTabular Data Stream(TDS)8.0暗号化を有効にします。 試行ごとに接続タイムアウトを設定し、一時的な障害が発生した場合は、指数バックオフとジッターを用いて再試行します。

この記事のC++スニペットでは、簡潔にするためにinclude、COM初期化、ログヘルパーを省略しています。

std::wstring BuildConnectionString(const wchar_t* server, const wchar_t* database) {
    std::wstring cs = L"Provider=MSOLEDBSQL19";
    cs += L";Data Source=tcp:"; cs += server; cs += L",1433";
    cs += L";Initial Catalog="; cs += database;
    cs += L";Authentication=ActiveDirectoryMSI";   // managed identity, no stored secret
    cs += L";Use Encryption for Data=Strict";      // TDS 8.0 with certificate validation
    cs += L";Connect Timeout=30";                  // per-attempt connect timeout, in seconds
    cs += L";Connect Retry Count=3";               // idle connection resiliency, not initial connect
    cs += L";Connect Retry Interval=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(LONG 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.
HRESULT ConnectWithRetry(IDataInitialize* pDataInit, const std::wstring& connectionString,
                         int maxAttempts, IDBInitialize** ppDbInit) {
    HRESULT hr = E_FAIL;
    *ppDbInit = nullptr;
    for (int attempt = 1; attempt <= maxAttempts; ++attempt) {
        IDBInitialize* pDbInit = nullptr;
        hr = pDataInit->GetDataSource(nullptr, CLSCTX_INPROC_SERVER, connectionString.c_str(),
                                      IID_IDBInitialize, reinterpret_cast<IUnknown**>(&pDbInit));
        if (SUCCEEDED(hr) && SUCCEEDED(hr = pDbInit->Initialize())) {
            Log("INFO", "connected on attempt %d/%d", attempt, maxAttempts);
            *ppDbInit = pDbInit;
            return S_OK;
        }

        // Walks IErrorRecords and returns the first record that carries a real
        // SQL Server error number. Transport and timeout failures report a
        // generic wrapper record first, whose native error is 0. Errors the
        // server returns carry the number on the first record.
        LONG native = LogProviderErrors("connect", hr);
        if (pDbInit) pDbInit->Release();
        if (attempt == maxAttempts || !IsTransient(native)) return hr;

        // 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 hr;
}

Connect Retry Count Connect Retry Intervalまた、アイドル接続のレジリエンシーを有効にし、アイドル中に切断された接続を透過的に復元します。 彼らは最初の接続を再試行しないため、このスニペットはアプリケーションレベルの再試行も実装しています。 両方持っておけ。

このスニペットは、Use Encryption for DataConnect Retry Count など、ここに示すスペース入りのキーワード名を使用する IDataInitialize::GetDataSource 用の接続文字列を構築します。 IDBInitialize::Initialize ADOは同じ設定に対して異なる名称を使い、例えば EncryptConnectRetryCountなどがあります。

GetDataSource 誤った集合から名前をエラーなしで受け入れ、設定は決して効果を発揮しません。 その場合、接続ではドライバーのデフォルト設定が使用されるため、接続の安全性が低下することがあります。 Encrypt=Strictこの経路では、Mandatory では暗号化が MSOLEDBSQL19 の設定のままになるため、接続では TDS 8.0 は使用されず、平文の事前ログイン時に暗号化がネゴシエートされ、MSOLEDBSQL では暗号化が完全にオフのままになります。 すべてのケースがフェイルオープンになるわけではありません。誤って設定された TrustServerCertificate も同様に破棄されるため、プロパティは既定値の false のままとなり、証明書の検証は有効のままです。

ミスの発見をエラーに頼らないでください。 ZzzNotAKeywordのように、どの集合にも属さない名前は記録Invalid 接続文字列 attributeを生みますが、間違った集合の名前は何も生成しません。 設定が有効かどうかを確認するために、接続前にプロパティを読み返して IDBProperties::GetProperties してください。 各APIに対応するキーワードセットについては、「OLE DB Driver for SQL Server で接続文字列 keywordsの使用」を参照してください。

OLE DBは HRESULT だけでなくエラーオブジェクトを通じて診断を報告するため、再試行前に故障を分類します。 認証や設定エラーが即座に失敗し、再試行予算を全消費することはありません。

この構成の各部分の詳細については、以下を参照してください。

Azure SQLの一時的エラーのカタログについては、一時的故障エラーコードを参照してください。

主要な機能

  • Microsoft Entra ID認証:パスワードレス接続で、管理されたアイデンティティ、サービスプリンシパル、インタラクティブ、統合フローが利用できます。
  • 厳密暗号化:TDS 8.0接続で完全な証明書検証が可能で、バージョン19.2.0以降のTLS 1.3が適用されます。
  • アイドル接続の回復力:アイドル中に切断された接続の透明な復旧。
  • 複数のアクティブ結果セット(MARS):1つの接続に複数の保留中のリクエストがある場合。
  • バルクコピー:バルクコピーインターフェースを通じた高スループットの挿入。
  • テーブル値パラメータ:サーバーに単一のパラメータとして渡される結果セット全体。
  • 常時オンの可用性グループ:迅速なフェイルオーバーのための MultiSubnetFailover リスナーサポート。
  • UTF-8およびUTF-16のサポート:両方のエンコーディングで文字データ。
  • データ分類:分類された列の感度メタデータ。
  • 非同期操作:非ブロッキングデータソースおよび行セット操作。

概要

Article Description
OLE DBドライバーの使用時期 他のSQL ServerドライバーよりOLE DB Driver for SQL Serverを選ぶべきタイミング。
ダウンロード サポートされているすべてのドライバーバージョンのインストーラーダウンロード。
システム要件 サポートされるオペレーティングシステム、SQL Serverのバージョン、そしてまずインストールすべき前提条件。
建築用途 ヘッダーやライブラリファイル、インストールレイアウト、MDACからのアップグレード時の変更点などです。
アプリケーションの作成 アプリケーションが従う呼び出しシーケンスは、接続からコマンド実行、結果の読み取りまでです。
サポート ライフサイクル どのドライバーバージョンがサポートされているか、そしてそれぞれがいつサポートを終了するかを教えてください。

構成と接続

Article Description
接続文字列キーワード ドライバーが受け入れるすべての接続文字列キーワードとその受理値。
データソースオブジェクト 接続を構築するデータソースとセッションオブジェクトを作成・初期化します。
ドライバーでADOを使う MARSやクエリ通知、ADOのXML型などのReachドライバー機能も利用できます。
高可用性とディザスター リカバリー 可用性グループのリスナーとフェイルオーバー動作を制御するキーワードを通じて接続します。
アイドル状態の接続回復性 アイドル状態中に切断された接続を自動的に復旧します。
LocalDBのサポート ローカル開発とテストのためにLocalDBインスタンスに接続してください。

認証とセキュリティ

Article Description
Microsoft Entra ID を使用する ドライバーがサポートするMicrosoft Entra認証モードは、管理型アイデンティティやインタラクティブモードを含みます。
暗号化と証明書の検証 EncryptとTrustServerCertificateを設定し、サーバー証明書の検証方法を制御します。
プログラムによるパスワード変更 期限切れのパスワードを処理し、アプリケーションを離れずに新しいパスワードを設定しましょう。
クライアント接続におけるサービスプリンシパル名(SPN)サポート 接続にサービスプリンシパル名を設定し、Kerberosの相互認証が成功します。
データ分類の使用 SQL Serverが機密カラムで返すセンシティビュリティラベルを読みます。

実行コマンドと処理結果

Article Description
コマンド コマンド実行が構築されている ICommand インターフェースとコマンドオブジェクトモデルです。
コマンド構文 ODBC SQL、ISO、Transact-SQL の文法の組み合わせは、ドライバがコマンドテキストで受け入れるものです。
コマンドパラメータ コマンドテキストにパラメータを設定し、それぞれのドライバがサポートするタイプを割り当てます。
複数のアクティブ結果セット(MARS)の利用 1 つの接続で、複数の保留中の結果セットを開いたままにする。
非同期操作の実行 呼び出し元スレッドをブロックせずに操作を開始し、ポーリングするか、完了を待ちます。
クエリ通知の扱い方 クエリの結果がサーバー上で変更された際に通知を受け取るために登録してください。
処理結果のハウツー記事 ストアドプロシージャや関数を実行し、リターンコード、出力パラメータ、行を読み取る作業例。

行セットとカーソルを使用する

Article Description
行セット 行セットのインターフェースと、取得される行セットの種類を決定するプロパティ。
行を取得中 IRowsetを使って行を順番にフェッチし、列の値を読み、行を解放します。
行セット内でのデータ更新 IRowsetChangeまたは IRowsetUpdate に変更可能な行セットを取得し、そのロックを制御するようリクエストします。
Bookmarks 順番に再取得する代わりに、行位置を保存して後でその位置に戻れます。
行セットと SQL Server のカーソル ドライバーがデフォルトの結果セットを使用する場合と、代わりにサーバーカーソルを開く場合。

一括コピー

Article Description
一括コピー操作の実行 データファイルやプログラム変数を通じて、大量の行をテーブルに出入りさせることができます。
IRowsetFastLoadを使ってデータを一括コピー IRowsetFastLoadインターフェースでSQL Serverテーブルにデータを一括コピーします。
IRowsetFastLoadとISequentialStreamを使ってBLOBデータを送信します IRowsetFastLoadを使って、行ごとに異なる長さのBLOBデータをSQL Serverにストリーミングします。

テーブル値パラメーター

Article Description
テーブル値パラメータの概要 テーブル値パラメータが1つのパラメータで複数行のデータをどのようにサーバーに渡すか。
テーブル値パラメータ参照 パラメータの行セット作成とパラメータタイプの発見。
テーブル値パラメータへのデータの挿入 テーブル値のパラメータ行を提供するためのプッシュモデルとプルモデル。
テーブル値パラメータの使用 テーブル値パラメータを作成し、その行をストアドプロシージャに渡します。

大規模およびバイナリデータの扱い

Article Description
BLOBとOLEオブジェクト BLOB列を ISequentialStreamを通るストリームとして読み書きします。
大規模なデータの取得 大きな列の値は、1つのバインドされたバッファで取得するのではなく、チャンク単位で取得します。
大規模データの設定 コンシューマーストレージオブジェクトからサーバーに大きな列の値を送ります。
ファイルストリームのサポート SQL Serverやファイルシステムを通じて読み取れる大きなバイナリ値を保存してください。
FILESTREAMのハウツー記事 ストリーミングインターフェースでFILESTREAM列を読み書きする作業例。

テーブル、インデックス、ストアドプロシージャの管理

Article Description
表と索引 ITableDefinitionIIndexDefinitionを通じてテーブルやインデックスを作成、変更、削除できます。
SQL Serverテーブルの作成 列を定義し、 ITableDefinition::CreateTable を呼び出してテーブルを作成します。
SQL Serverインデックスの作成 既存のテーブルに新しいインデックスを定義します。 IIndexDefinition::CreateIndex
ストアド プロシージャ ODBC CALL構文またはRPCでストアドプロシージャを呼び出し、そのリターンコードと出力パラメータを読み込みます。

データの種類

Article Description
データ型の概要 パラメータと列をバインドしたときにSQL ServerのタイプがOLE DBのタイプにどのようにマッピングされるか。
行セットとパラメータにおけるデータ型マッピング 行セットの列およびコマンド パラメーターの完全な型マッピング テーブル。
大きな値型の利用 varchar(max)、nvarchar(max)、varbinary(max) 型をバインドします。
XMLデータ型の使用 XML文書や断片をXML列に保存・取得します。
ユーザー定義型の使用 CLRのユーザー定義型をバインドし、ドライバは型メタデータを含むバイナリ値として公開します。
スパース列のサポート ヌル値を格納するために最適化されたスパースカラムのドライバサポート。
UTF-8 のサポート UTF-8サーバーコレーションとUTF-8クライアントエンコーディングを扱います。
UTF-16サポート クライアントバッファを埋める際、ドライバーがどのようにサロゲートペアを処理するか。
日時の改善 date、time、datetime2、datetimeoffsetの種類と、それらが許可する変換をバインドします。

Transactions

Article Description
取引概要 ローカルトランザクションサポート、そして分散トランザクションのためのMicrosoft 分散トランザクション コーディネーター。
分離レベル セッションのアイソレーションレベルと、各レベルで許される並行性を設定します。
スナップショット分離の作業 行バージョン管理を使って、書き込みをブロックせずに読み込みの並行性を上げましょう。
分散トランザクションのサポート ITransactionJoin::JoinTransactionとの分散トランザクションでセッションを登録します。

診断とトラブルシューティング

Article Description
エラー ドライバーがどのように故障を報告し、どのインターフェースが詳細を伝えているか。
エラー情報の取得 エラーインターフェースを歩いてメッセージテキスト、SQLSTATE、ネイティブエラー番号を読み取ります。
拡張イベント ログの診断情報へのアクセス ドライバートレースをオンにして、その結果得られた拡張イベントログを読みます。
既知の問題 現在のドライバーにおける未解決の問題(存在する場合は回避策あり)。
リリースノート 各ドライバーリリースで何が変わったのか、まずは最新版から。

現在のドライバーに移行する

SQL Server向けのMicrosoft OLE DBプロバイダーには3つの世代があります。 新規および既存のアプリケーションには MSOLEDBSQL19 を使い、既存の接続文字列を変換してください。 OLE DB プロバイダーは 2018 年に 非推奨が解除され、再リリースされました。

Generation プロバイダー文字列 地位
Microsoft OLE DB Driver for SQL Server (本記事) MSOLEDBSQL19MSOLEDBSQL Supported. MSOLEDBSQL19 現在のドライバーであり、新規開発に使われるものです。
SQL Server ネイティブクライアント(SNAC) SQLNCLI11SQLNCLI SQL Server 2022およびSQL Server Management Studio 19から削除されました。 新規開発にはおすすめできません。
Microsoft OLE DB Provider for SQL Server SQLOLEDB Windows Data Access Components に含まれます。 現在はメンテナンスされていません。 新規開発にはおすすめできません。
Article Description
MSOLEDBSQL のメジャー バージョン間の違い OLE DB Driver 19 とバージョン 18 の間の破壊的変更(暗号化の既定値、プロパティ型の変更、移行手順を含む)
MDACからの申請書の更新 古いOLE DB Provider for SQL Serverと現在のドライバーで何が変わったのか、またアップデート前に何を確認すべきか。
SQL Server 2005 Native Client からのアプリケーションの更新 SQL Server 2005(9.x)のSQL Server Native Client以降の、OLE DB Driver for SQL Serverの重大な変更点。

Reference

Article Description
OLE DB Driver for SQL Server の機能 ドライバー固有の特徴の索引と、それぞれがどこで文書化されているか。
OLE DBプログラミング ドライバが公開するCOMのAPIモデルと、TDSを介してSQL Serverとどのように通信するかを説明しています。
OLE DBハウツー記事 OLE DBのハウツー記事の索引(タスク別にまとめられています)。
OLE DBインターフェース このドライバでは、OLE DBのインターフェースおよびプロバイダ固有の動作を示すメソッドがあります。
スキーマ行セットのサポート リンクされたサーバーから返されるメタデータを含む、プロバイダー固有のスキーマの行セットの動作。
さらなる情報の探し方 仕様、サンプル、コミュニティリソースはこのドキュメントセット以外のもの。