SQL Server Express LocalDB 标头信息和版本信息

没有用于 SQL Server Express LocalDB 实例 API 的单独头文件;LocalDB 函数签名和错误代码在 SQL Server Native Client 头文件 (sqlncli.h) 中定义。 若要使用 LocalDB 实例 API,必须在项目中包含 sqlncli.h 头文件。

LocalDB 版本

对于每个主要 SQL Server 版本,LocalDB 安装将使用单组二进制代码。 这些 LocalDB 版本独立进行维护和修补。 这意味着,用户必须指定他或她将使用的 LocalDB 基准版本(也即主 SQL Server 版本)。 该版本以 .NET Framework System.Version 类定义的标准版本格式指定:

major.minor[.build[.revision]]

版本字符串中的前两个数字(major 和 minor)是必需的。 版本字符串的最后两个数字(build 和 revision)是可选的,如果用户将其省略,则默认值为 0。 这意味着,如果用户仅指定“11.2”作为 LocalDB 版本号,则视为用户指定的是“11.2.0.0”。

LocalDB 安装的版本在 SQL Server 实例注册表项下的 MSSQLServer\CurrentVersion 注册表项中定义,例如:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\ MSSQLServer\CurrentVersion: “CurrentVersion”=”10.0.2531.0”

并行支持同一工作站上的多个 LocalDB 版本。 但是,用户代码始终使用本地计算机上最新的 SQLUserInstance DLL 连接到 LocalDB 实例。

查找 SQLUserInstance DLL

若要找到 SQLUserInstance DLL,客户端提供程序使用以下注册表项:

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

在此注册表项之下有一个项列表,每个项对应于计算机上安装的每个 LocalDB。 每个项的名称都具有 <major-version>.<minor-version> 格式的 LocalDB 版本号。(例如,SQL Server 2012 的项命名为 11.0)。 在每个版本项之下都有一个 InstanceAPIPath 名称-值对,用于定义指向随该版本一起安装的 SQLUserInstance.dll 文件的完全路径。 下面的示例显示一个安装了 LocalDB 版本 11.0 和 12.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\12.0]
"InstanceAPIPath"="C:\\Program Files\\Microsoft SQL Server\\120\\LocalDB\\Binn\\SqlUserInstance.dll"]

客户端提供程序必须在所有安装的版本中找到最新版本,并从关联的 InstanceAPIPath 值中加载 SQLUserInstance DLL 文件。

64 位 Windows 上的 WOW64 模式

64 位 LocalDB 安装将有一组附加注册表项,以允许在 Windows 64 位上的 Windows 32 位 (WOW64) 模式下运行的 32 位应用程序使用 LocalDB。 具体而言,在 64 位 Windows 上,LocalDB MSI 将创建以下注册表项:

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

读取 Installed Versions 项的 64 位程序将看到指向 SQLUserInstance DLL 的 64 位版本的值,而 32 位程序(在 WOW64 模式的 64 位 Windows 上运行)将自动重定向到位于 Wow6432Node 配置单元下的 Installed Versions 项。 此项包含指向 32 位版本的 SQLUserInstance DLL 的值。

使用 LOCALDB_DEFINE_PROXY_FUNCTIONS

LocalDB 实例 API 定义一个名为 LOCALDB_DEFINE_PROXY_FUNCTIONS 的常量,该常量可自动进行查找并加载 SqlUserInstance DLL。

该常量启用的代码部分为每个 LocalDB API 提供代理的实现。 代理实现使用一个常用函数绑定到最新安装的 SqlUserInstance DLL 中的入口点,然后转发请求。

只有在包含 sqlncli.h 之前,在用户代码中定义常量 LOCALDB_DEFINE_PROXY_FUNCTION 时,才启用代理函数。 只应在一个源模块(.cpp 文件)中定义常量,因为该常量为所有 API 入口点定义外部函数名称。 它为每个 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 (sqlncli.h) is included
#define LOCALDB_DEFINE_PROXY_FUNCTIONS
#include <sqlncli.h>
…
HRESULT hr = S_OK;

// Create LocalDB instance by calling the create API proxy function included by macro
if (FAILED(hr = LocalDBCreateInstance( L“11.0”, L“name”, 0)))
{
…
}
…