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 版本

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

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 版本号命名,格式<为主要版本。<>次要版本>(例如,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\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 模式

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\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 上运行)将自动重定向到Installed Versions位于 hive 下的Wow6432Node密钥。 此键包含指向 SQLUserInstance DLL 的 32 位版本的值。

使用 LOCALDB_DEFINE_PROXY_FUNCTIONS

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

该常量启用的代码部分为每个 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)))  
{  
...  
}  
...