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

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

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

版本字符串<major> (和 <minor>)中的前两个数字是必需的。 版本字符串<build> (和 <revision>)中的最后两个数字是可选的,如果用户退出,则默认为零。这意味着,如果用户仅 12.2 指定为 LocalDB 版本号,则被视为用户指定的 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"

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

找到 SQLUserInstance DLL

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

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

在此密钥下,有一个密钥列表,一个用于计算机上安装的每个 LocalDB 版本。 其中每个密钥都以 LocalDB 版本号命名为格式 <major-version><minor-version> (例如,SQL Server 2014(12.x)的密钥命名为 13.0。 在每个版本密钥下,都有一个 InstanceAPIPath 名称/值对,用于定义随该版本一起安装的文件的完整路径 SQLUserInstance.dll 。 以下示例显示了安装了 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 VersionsSQLUserInstance 64 位程序会看到指向 64 位版本的 DLL 的值,而 32 位程序(在 WOW64 模式下的 64 位 Windows 上运行)会自动重定向到 Installed Versions 位于 hive 下的 Wow6432Node 密钥。 此键包含指向 DLL 的 32 位版本的 SQLUserInstance 值。

Use LOCALDB_DEFINE_PROXY_FUNCTIONS

LocalDB 实例 API 定义一个名为 LOCALDB_DEFINE_PROXY_FUNCTIONS 自动发现和加载 DLL 的 SqlUserInstance 常量。

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

只有在将 msoledbsql.h 文件包含在用户代码中定义常量 LOCALDB_DEFINE_PROXY_FUNCTIONS 时,才启用代理函数。 只应在一个源模块(.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 (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)))
{
...
}
...