Заголовок и сведения о версии SQL Server Express LocalDB
Отдельный файл заголовка для интерфейса API экземпляра SQL Server Express LocalDB отсутствует. Сигнатуры функций LocalDB и коды ошибок определяются в файле заголовка собственного клиента SQL Server (sqlncli.h). Для использования интерфейса API экземпляра LocalDB необходимо включить в проект файл заголовка sqlncli.h.
Управление версиями LocalDB
Установка LocalDB использует по одному набору двоичных файлов на каждую из основных версий SQL Server. Эти версии LocalDB поддерживаются независимо. Исправления в них также вносятся независимо друг от друга. Это значит, что пользователю необходимо указывать используемый базовый выпуск LocalDB (то есть номер основной версии SQL Server). Версия указывается в стандартном формате версии, определяемом классом System.Version платформы .NET Framework:
major.minor[.build[.revision]]
Первые два числа в строке версии (major и minor) должны быть указаны обязательно. Последние два числа в строке версии (build и revision) не обязательны. Если пользователь не указывает их, по умолчанию они устанавливаются равными нулю. Это значит, что при указании пользователем номера версии LocalDB “11.2” считается, что задана версия “11.2.0.0”.
Версия установки LocalDB определяется в разделе реестра MSSQLServer\CurrentVersion, который содержится в разделе реестра экземпляра SQL Server:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11E.LOCALDB\ MSSQLServer\CurrentVersion: “CurrentVersion”=”10.0.2531.0”
Поддерживается параллельная работа нескольких версий LocalDB на одной рабочей станции. Однако пользовательский код всегда выбирает самую новую доступную DLL-библиотеку SQLUserInstance на локальном компьютере для подключения к экземплярам LocalDB.
Поиск DLL-библиотеки SQLUserInstance
Чтобы найти DLL-библиотеку SQLUserInstance, поставщик клиента использует следующий раздел реестра:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Local DB\Installed Versions]
Этот ключ содержит список ключей, по одному для каждой из установленных на компьютере версий LocalDB. Имена этих ключей соответствуют номерам версий LocalDB в формате <major-version>.<minor-version> (например, ключ для SQL Server 2012 имеет имя 11.0). В каждом из ключей версий содержится пара «имя-значение» InstanceAPIPath, определяющая полный путь к установленному в составе соответствующей версии файлу SQLUserInstance.dll. В следующем примере показаны записи реестра на компьютере, на котором установлены версии 11.0 и 12.0 LocalDB.
[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"]
Поставщик клиента должен найти самую новую из установленных версий и загрузить файл DLL-библиотеки SQLUserInstance по связанному значению InstanceAPIPath.
Режим WOW64 в 64-разрядной системе Windows
У 64-разрядных установок LocalDB имеется дополнительный набор разделов реестра, который позволяет 32-разрядным приложениям, выполняющимся в режиме Windows-32-в-Windows-64 (WOW64), использовать LocalDB. Точнее говоря, в 64-разрядной Windows установщик MSI LocalDB создает следующие разделы реестра:
[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"]
64-разрядные программы, считывающие ключ Installed Versions, получат значения, указывающие на 64-разрядные версии DLL-библиотеки SQLUserInstance, а 32-разрядные программы (выполняющиеся в 64-разрядной версии Windows в режиме WOW64) автоматически перенаправляются на ключ Installed Versions, расположенный в кусте Wow6432Node. Этот ключ содержит значения, указывающие на 32-разрядные версии DLL-библиотеки SQLUserInstance.
Использование константы LOCALDB_DEFINE_PROXY_FUNCTIONS
Интерфейс API экземпляра LocalDB определяет константу LOCALDB_DEFINE_PROXY_FUNCTIONS, автоматизирующую обнаружение и загрузку DLL-библиотеки SqlUserInstance.
Раздел кода, включаемый этой константой, содержит реализацию учетных записей-посредников для каждого из интерфейсов API LocalDB. Реализации учетной записи-посредника используют общую функцию для привязки к точкам входа в самой новой установленной DLL-библиотеке SqlUserInstance и для последующего перенаправления запросов.
Функции учетной записи-посредника включаются лишь в случае, если константа LOCALDB_DEFINE_PROXY_FUNCTIONS определяется в пользовательском коде перед включением файла sqlncli.h. Эту константу следует определять только в одном исходном модуле (CPP-файле), так как она определяет внешние имена функций для всех точек входа интерфейса API. Она предоставляет реализацию прокси-классов для каждого из API-интерфейсов LocalDB.
В следующем примере кода показано использование макроса из собственного кода 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)))
{
…
}
…