【发布时间】:2014-12-23 05:14:08
【问题描述】:
我有一个非常小的测试应用程序,我试图在其中安装 Windows 服务并在安装过程中创建一个 LocalDB 数据库,然后在 Windows 服务运行时连接到该 LocalDB 数据库。
我在从我的 Windows 服务连接到 LocalDB 实例时遇到了很大的问题。
我的安装过程是这样的:
执行安装程序 .msi 文件,该文件以 NT AUTHORITY\SYSTEM 帐户运行 msiexec 进程。
-
使用以下命令运行自定义操作以执行 SqlLocalDB.exe:
- sqllocaldb.exe 创建 MYINSTANCE
- sqllocaldb.exe 共享 MYINSTANCE MYINSTANCESHARE
- sqllocaldb.exe 启动 MYINSTANCE
-
使用 ADO.NET (System.Data.SqlConnection) 运行自定义 C# 操作以执行以下操作:
- 连接到以下连接字符串
Data Source=(localdb)\MYINSTANCE; Integrated Security=true - 创建数据库测试数据库
- 使用测试数据库
- 创建表 ...
- 连接到以下连接字符串
在安装程序完成之前启动 Windows 服务。
Windows 服务安装到 LocalSystem 帐户,因此也作为 NT AUTHORITY\SYSTEM 用户帐户运行。
服务尝试使用上面使用的相同连接字符串进行连接。
尝试从 Windows 服务中打开与上述连接字符串的连接时,我一直收到以下错误:
System.Data.SqlClient.SqlException (0x80131904):网络相关或 建立连接时发生特定于实例的错误 SQL 服务器。服务器未找到或无法访问。核实 实例名称正确且 SQL Server 配置为 允许远程连接。 (提供者:SQL 网络接口,错误:50 - 发生本地数据库运行时错误。指定的 LocalDB 实例不存在。
这令人沮丧,因为 msi 安装程序自定义操作和 Windows 服务都在同一个 Windows 用户帐户下运行(我检查过,它们都是 NT AUTHORITY\System)。那么为什么第一个有效而第二个无效是我无法理解的。
我尝试将自定义操作和 Windows 服务中使用的连接字符串更改为使用共享名称 (localdb)\.\MYINSTANCESHARE,但我从 Windows 服务中得到了完全相同的错误。
我已尝试将 Windows 服务登录的用户帐户更改为我的 Windows 用户帐户,只要我首先运行命令将其添加到该实例的 SQL 服务器登录名,它就可以工作。
我也尝试过运行控制台应用程序并连接到共享名称连接字符串,效果也很好。
我还尝试从 SQL Server Management Studio 连接到共享名称,并且效果也很好。
但是,这些方法都没有真正解决我的问题。我需要一个 Windows 服务,因为它会在计算机启动后立即启动(即使没有用户登录)并且无论登录哪个用户帐户都会启动。
Windows 服务如何连接到 LocalDB 私有实例?
我正在使用 SQL Server 2014 Express LocalDB。
【问题讨论】:
-
我怀疑 Windows 现在正在为作为系统运行的所有服务创建“虚拟帐户”,因此它们无法相互通信。我可能是错的,我隐约记得在某处读过一些类似的东西,不久前。但是现在查不出来。希望对您有所帮助。
-
出于测试目的,我尝试让服务作为非系统帐户运行,而不是在创建 LocalDB 实例期间使用的帐户。我得到了同样的错误。所以我不确定问题是我正在使用的系统帐户,问题要么是 SqlLocalDB.exe 实用程序作为系统帐户运行以创建实例,要么是帐户之间的共享只是根本不工作。
-
安装程序完成后,实例在哪里物理创建?它应该位于类似于: C:\Users\{some login}\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances 的位置。请记住,LocalDB 是“用户模式”,因此它必须在用户的上下文中,我猜虚拟帐户不符合拥有实例/数据库的条件,但仍然可以连接。跨度>
-
另外,您为 Windows 服务使用的 .Net 版本是什么?本地系统帐户是否被视为管理帐户?您是否在连接字符串中使用双反斜杠,或者如果没有,则在字符串前面加上“@”?
-
@srutzky 该实例应该在
C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances中创建,这是 SYSTEM 帐户的正确 AppData 文件夹。但是,我看到在C:\Windows\System32\config\systemprofile中创建 .mdf 和 .ldf 文件时,正在为处于活动状态的用户在C:\Users\{current user}\...文件夹中创建实际的实例文件夹。
标签: sql sql-server localdb