SQL Server Express LocalDB ヘッダーとバージョン情報

適用対象:SQL Server

SQL Server Express LocalDB インスタンス API に個別のヘッダー ファイルはありません。LocalDB 関数のシグネチャとエラー コードは、Microsoft OLE DB Driver for SQL Server ヘッダー ファイル (msoledbsql.h) で定義されています。 LocalDB インスタンス API を使用するには、プロジェクトに msoledbsql.h ヘッダー ファイルを含める必要があります。 このドキュメントは最近更新され、SQL Server Native Client ヘッダー ファイル (sqlncli.h) を参照しなくなりました。

LocalDB のバージョン管理

LocalDB インストールでは、主要な SQL Server バージョンごとの単一のバイナリ セットを使用します。 これらの LocalDB バージョンは維持され、個別にパッチが適用されます。 つまり、ユーザーはどの LocalDB ベースライン リリース (主要な SQL Server バージョン) を使用するのかを指定する必要があるということです。 バージョンは、.NET Framework System.Version クラスによって定義された標準バージョン形式で指定されます。

major.minor[.build[.revision]]

バージョン文字列の最初の 2 つの数値 (メジャーマイナー) は必須です。 バージョン文字列 (ビルドリビジョン) の最後の 2 つの数値は省略可能であり、ユーザーが削除した場合、既定値は 0 です。つまり、ユーザーが LocalDB バージョン番号として "12.2" のみを指定した場合、ユーザーが "12.2.0.0" を指定したかのように扱われます。

LocalDB インストールのバージョンは、SQL Server インスタンス レジストリ キーの下のレジストリ キーでMSSQLServer\CurrentVersion定義されます。次に例を示します。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL13E.LOCALDB\ MSSQLServer\CurrentVersion: "CurrentVersion"="12.0.2531.0"  

同じ 1 台のワークステーション上で複数の LocalDB バージョンが同時にサポートされます。 ただし、ユーザー コードは常にローカル コンピューターで利用可能な最新の SQLUserInstance DLL を使用して LocalDB インスタンスに接続します。

SQLUserInstance DLL の検索

SQLUserInstance DLL を見つけるために、クライアント プロバイダーは次のレジストリ キーを使用します。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions]  

このキーの下に、キーのリストがあります。このコンピューターにインストールされている LocalDB のバージョンごとに 1 つのキーがあります。 これらの各キーには、メジャー バージョン形式<の LocalDB バージョン番号を使用して名前が付けられます><minor-version> (たとえば、SQL Server 2014 (12.x) のキーは 13.0 という名前です)。 各バージョン キーの下に、InstanceAPIPath の名前と値のペアが 1 つあります。このペアは、そのバージョンでインストールされた SQLUserInstance.dll ファイルの絶対パスを定義します。 次の例は、LocalDB バージョン 11.0 と 13.0 がインストールされているコンピューターのレジストリ エントリを示しています。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions\13.0]  
"InstanceAPIPath"="C:\\Program Files\\Microsoft SQL Server\\130\\LocalDB\\Binn\\SqlUserInstance.dll"  
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions\13.0]  
"InstanceAPIPath"="C:\\Program Files\\Microsoft SQL Server\\130\\LocalDB\\Binn\\SqlUserInstance.dll"   

クライアント プロバイダーは、インストールされているすべてのバージョンの中で最新バージョンを検索し、関連付けられているInstanceAPIPath値から SQLUserInstance DLL ファイルを読み込む必要があります。

64 ビット版 Windows 上の WOW64 モード

LocalDB の 64 ビット インストールには、追加のレジストリ キー セットがあるため、Windows-32-on-Windows-64 (WOW64) モードで実行される 32 ビット版アプリケーションで LocalDB を使用することができます。 具体的には、64 ビット版 Windows では、LocalDB MSI が次のレジストリ キーを作成します。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wow6432Node\Microsoft SQL Server Local DB\Installed Versions\13.0]  
"InstanceAPIPath"="C:\\Program Files (x86)\\Microsoft SQL Server\\130\\LocalDB\\Binn\\SqlUserInstance.dll"  
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wow6432Node\Microsoft SQL Server Local DB\Installed Versions\13.0]  
"InstanceAPIPath"="C:\\Program Files (x86)\\Microsoft SQL Server\\130\\LocalDB\\Binn\\SqlUserInstance.dll"   
  

キーをInstalled Versions読み取る 64 ビット プログラムでは、SQLUserInstance DLL の 64 ビット バージョンを指す値が表示されますが、32 ビット プログラム (WOW64 モードの 64 ビット Windows で実行) はハイブの下Wow6432Nodeにあるキーに自動的にInstalled Versionsリダイレクトされます。 このキーには、 SQLUserInstance DLL の 32 ビット バージョンを指す値が含まれています。

LOCALDB_DEFINE_PROXY_FUNCTIONS の使用

LocalDB インスタンス API は、 sqlUserInstance DLL の検出と読み込みを自動化する LOCALDB_DEFINE_PROXY_FUNCTIONS という名前の定数を定義します。

この定数によって有効化されるコードのセクションにより、各 LocalDB API のプロキシが実装されます。 プロキシ実装では、共通の関数を使用して、インストールされている最新の SqlUserInstance DLL 内のエントリ ポイントにバインドし、要求を転送します。

プロキシ関数は、定数LOCALDB_DEFINE_PROXY_FUNCTIONSが msoledbsql.h ファイルを含む前にユーザー コードで定義されている場合にのみ有効になります。 この定数は、すべての API エントリ ポイントの外部関数名を定義するので、1 つのソース モジュール (.cpp ファイル) だけに定義する必要があります。 この定数により、各 LocalDB API のプロキシが実装されます。

次のコード例では、ネイティブの C++ コードのマクロを使用する方法を示します。

// Define the LOCALDB_DEFINE_PROXY_FUNCTIONS constant to enable the LocalDB proxy functions   
// The #define has to take place BEFORE the API header file (msoledbsql.h) is included  
#define LOCALDB_DEFINE_PROXY_FUNCTIONS  
#include <msoledbsql.h>  
...  
HRESULT hr = S_OK;  
  
// Create LocalDB instance by calling the create API proxy function included by macro  
if (FAILED(hr = LocalDBCreateInstance( L"12.0", L"name", 0)))  
{  
...  
}  
...