次の方法で共有


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

Applies to: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 versioning

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

<major>.<minor>[.<build>[.<revision>]]

バージョン文字列の最初の 2 つの数値 (<major><minor>) は必須です。 バージョン文字列の最後の 2 つの数値 (<build><revision>) は省略可能であり、ユーザーが省略した場合は既定値は 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 つずつ、キーの一覧があります。 これらの各キーには、 <major-version>形式の LocalDB バージョン番号で名前が付けられます。 <minor-version> (たとえば、SQL Server 2014 (12.x) のキーの名前は 13.0 です)。 各バージョン キーの下には、そのバージョンと共にインストールされたSQLUserInstance.dll ファイルへの完全なパスを定義するInstanceAPIPath名前と値のペアがあります。 次の例は、LocalDB バージョン 11.0 と 13.0 がインストールされているコンピューターのレジストリ エントリを示しています。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions\11.0]
"InstanceAPIPath"="C:\\Program Files\\Microsoft SQL Server\\110\\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 ビット バージョンを指す値が含まれています。

Use LOCALDB_DEFINE_PROXY_FUNCTIONS

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

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

プロキシ関数は、msoledbsql.h ファイルを含む前に定数 LOCALDB_DEFINE_PROXY_FUNCTIONS がユーザー コードで定義されている場合にのみ有効になります。 この定数は、すべての 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)))
{
...
}
...