【问题标题】:Can't connect to SQL LocalDB from Windows Service, WPF app & SSMS work fine?无法从 Windows 服务、WPF 应用程序和 SSMS 连接到 SQL LocalDB 工作正常?
【发布时间】:2016-01-31 10:45:16
【问题描述】:

我正在开发的系统遇到了一些问题。就这个问题而言,布局是一个 WiX 构建的 msi 安装程序,它安装 SQL LocalDB 2012、一个 WPF 应用程序和一个 Windows 服务。 Windows 服务和 WPF 应用程序都将与同一个数据库、由用户交互驱动的应用程序和计时器上的服务进行通信。

一切都安装干净,数据库实例以混合模式安装,因此我的数据库初始化程序为实例和数据库创建了一个新的登录名和用户,并且在 SSMS 中它们似乎都配置正确。我可以使用新登录名登录并查询表格。这是我用来创建登录的代码:

IF NOT EXISTS 
(SELECT loginname 
 FROM master.dbo.syslogins WHERE name = 'BP_SERVICELOGIN') 
 BEGIN 
   CREATE LOGIN[BP_SERVICELOGIN] WITH PASSWORD = 'pw';
   CREATE USER[bpUser] FOR LOGIN[BP_SERVICELOGIN] WITH DEFAULT_SCHEMA = dbo;     
   USE DatabaseName; 
   EXEC sp_addrolemember 'db_owner', 'bpUser' 
 END

所以我重申;此登录在 SSMS 中工作得很好,并允许我登录并访问由 WPF 应用程序的初始化程序创建的数据库。

但是,我无法从 Windows 服务登录到该数据库。我确保在我的连接字符串中使用新的登录名,并且一切都在那里正确设置。我怎么知道这个?因为当我将连接字符串复制到我的 WPF 应用程序并使用它而不是 Windows 身份验证时,它可以工作!?!

服务不断失败并显示以下消息:

"System.Data.Entity.Core.EntityException: The underlying provider failed on Open. in EntityFramework:File: Method:Open Line:0 Column:0   System.Data.SqlClient.SqlException: Login failed for user 'BP_SERVICELOGIN'. in .Net SqlClient Data"

这是我正在使用的连接字符串:

<add name="ConnStringName" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=DbName;User Id=BP_SERVICELOGIN;Password=pw;MultipleActiveResultSets=True;Application Name=ServiceName" />

似乎有一些障碍阻止来自 Windows 服务的连接正常连接,而其他人则没有这样的问题。 LocalDB 安装是全新的,除了创建的数据库和登录名/用户之外,在 OOB 状态下没有对其进行任何操作。

谁能帮忙?

【问题讨论】:

  • 嗨!你试过this吗?
  • 你在使用多个实例吗?!如果是,请尝试将实例名称添加到连接字符串中。
  • SqlLocalDb info "MyInstance",它返回什么?
  • 很可能是权限问题...您看过这里吗? stackoverflow.com/questions/26597498/…
  • Cucu:我没有使用多个实例,这个解决方案必须从分布式安装程序中运行,所以我只是运行了 LocalDB 的默认安装路径,并且正在使用以混合模式运行的自动实例。跨度>

标签: .net sql-server windows-services database-connection connection-string


【解决方案1】:

我不是 Windows 服务的专业人士。

我认为问题出在您编写的 Windows 服务中。使用会话零隔离,您可能必须在指定的用户帐户中运行 Windows 服务。
如果您可以提供运行 Windows 服务的用户帐户,将会很有帮助。默认情况下,该服务在称为 SYSTEM 帐户的不同用户帐户中运行。此帐户可能没有访问数据库的权限。这可能会导致问题。

【讨论】:

  • 该服务以 NT AUTHORITY/SYSTEM 身份运行,您是对的,没有连接或访问数据库的权限。但是,我提供给服务的连接字符串指定了一个在数据库中正确配置的 Sql 身份验证帐户,并且根据它返回的日志,它实际上是在尝试使用该帐户而不是 SYSTEM 进行连接。
  • 您是否尝试过像这样更改连接字符串? "Data Source=(localdb)\.\v11.0;Initial Catalog=DbName;User Id=BP_SERVICELOGIN;Password=pw;MultipleActiveResultSets=True;Application Name=ServiceName" 并尝试使用 LocalDB 的共享实例,如 this 所示,不知何故它对他有用。
  • Alexander Derck:您的意思是将 Windows 服务作为网络服务运行吗?我可以试试这个,但是 iirc 所有这一切都会改变意味着该服务将作为 NT AUTHORITY/NETWORK SERVICE 而不是 NT AUTHORITY/SYSTEM 运行,如果有的话,权限会更少,不是吗?在任何情况下,我都不会尝试作为运行帐户连接到数据库服务器,我在连接字符串中提供了有效的 SQL 身份验证凭据,并确保数据库在混合身份验证模式下运行。
  • 我选择了这个作为正确答案,因为我认为 Pulathisi 本质上是正确的,这是会话隔离和 LocalDB 的问题。由于某种原因,LocalDB 不希望允许在非用户帐户下运行的进程进行连接。我受到时间限制,所以为了避免将来出现更多问题,我只是安装了 SQL Express,尽管这会增加我的安装程序的大小。但我认为,如果我将我的服务设置为在用户上下文中运行,它将能够连接到数据库。
【解决方案2】:

您能否检查一下这是否是您遇到的问题,建议的解决方案对您有帮助吗?

http://www.codeproject.com/Tips/775607/How-to-fix-LocalDB-Requested-Login-failed

您所描述的内容很奇怪,从您的描述来看,一切看起来都不错,但是 localdb 数据库这一事实令人怀疑。

【讨论】:

  • 这不是问题,安装的实例没有问题,因为从桌面上运行的另一个应用程序登录可以登录并访问数据而没有问题。它肯定闻起来更像是权限问题。
【解决方案3】:

您是否尝试在连接字符串中添加 Integrated Security=True;

【讨论】:

  • 答案不应包含问题。您可能想阅读此stackoverflow.com/help/how-to-answer
  • 所做的只是将传递给 LocalDB 安装的用户改回 NT AUTHORITY/SYSTEM,这在此环境中不起作用。
猜你喜欢
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 2013-04-03
  • 2015-11-02
相关资源
最近更新 更多