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 Data や Connect Retry Count など、ここに示すスペース入りのキーワード名を使用する IDataInitialize::GetDataSource 用の接続文字列を構築します。
IDBInitialize::Initialize ADOは同じ設定に対して異なる名称を使い、例えば Encrypt や ConnectRetryCountなどがあります。
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 |
|
コマンド |
コマンド実行が構築されている ICommand インターフェースとコマンドオブジェクトモデルです。 |
|
コマンド構文 |
ODBC SQL、ISO、Transact-SQL の文法の組み合わせは、ドライバがコマンドテキストで受け入れるものです。 |
|
コマンドパラメータ |
コマンドテキストにパラメータを設定し、それぞれのドライバがサポートするタイプを割り当てます。 |
|
複数のアクティブ結果セット(MARS)の利用 |
1 つの接続で、複数の保留中の結果セットを開いたままにする。 |
|
非同期操作の実行 |
呼び出し元スレッドをブロックせずに操作を開始し、ポーリングするか、完了を待ちます。 |
|
クエリ通知の扱い方 |
クエリの結果がサーバー上で変更された際に通知を受け取るために登録してください。 |
|
処理結果のハウツー記事 |
ストアドプロシージャや関数を実行し、リターンコード、出力パラメータ、行を読み取る作業例。 |
行セットとカーソルを使用する
| Article |
Description |
|
行セット |
行セットのインターフェースと、取得される行セットの種類を決定するプロパティ。 |
|
行を取得中 |
IRowsetを使って行を順番にフェッチし、列の値を読み、行を解放します。 |
|
行セット内でのデータ更新 |
IRowsetChangeまたは IRowsetUpdate に変更可能な行セットを取得し、そのロックを制御するようリクエストします。 |
|
Bookmarks |
順番に再取得する代わりに、行位置を保存して後でその位置に戻れます。 |
|
行セットと SQL Server のカーソル |
ドライバーがデフォルトの結果セットを使用する場合と、代わりにサーバーカーソルを開く場合。 |
一括コピー
テーブル値パラメーター
大規模およびバイナリデータの扱い
テーブル、インデックス、ストアドプロシージャの管理
| Article |
Description |
|
表と索引 |
ITableDefinitionやIIndexDefinitionを通じてテーブルやインデックスを作成、変更、削除できます。 |
|
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 年に 非推奨が解除され、再リリースされました。
Reference
関連コンテンツ