如何从 Windows 服务访问本地数据库(LocalDB)

5

我需要在本地使用数据库。我用Visual Studio 2012在(LocalDB)\v11.0服务器上创建了数据库。当从控制台应用程序连接时,一切正常。但我的应用程序是Windows服务。尝试连接到我的数据库会输出以下内容:

"... The login failed.Login failed for user 'NT AUTHORITY\SYSTEM"

这个问题有没有解决方案?也许我应该考虑为它设置另一个数据库服务器?如果是这样,如何设置才能使其只在本地可见?

3个回答

12

我自己找到了解决方案,可以连接运行为本地系统的Windows服务的(localdb)实例:

我使用了以下文章: http://technet.microsoft.com/pl-pl/library/hh212961.aspx http://dba.fyicenter.com/faq/sql_server_2/Verifying_a_Login_Name_with_SQLCMD_Tool.html http://social.technet.microsoft.com/wiki/contents/articles/4609.troubleshoot-sql-server-2012-express-localdb.aspx

所以我分享了我的localdb(如第一篇文章所述),问题是我无法使用命名管道np://连接sqlcmd。我在第三篇文章中找到了答案:

当使用sqlcmd时,请确保您使用的是SQL Server 2012版本 (位于% Program Files%\Microsoft SQL Server\110\Tools\Binn中)。如果您安装了早期版本的sqlcmd,仅从命令行调用sqlcmd将很可能使用旧版本(该版本不具备localdb-aware功能),因为较旧的路径首先出现在PATH环境变量中。通常最好手动调整PATH环境变量,以便首先使用110版本。

这些小信息实际上非常重要;)

所以我创建了用户:user密码:pass321!@.

在我的Windows服务中,我的Sql连接字符串如下:

"Data Source=(localdb)\\.\\MyInstanceShared;Integrated Security=false;User Id=user;Password=pass321!@"

集成安全设置为false值也很重要。

也许会对某些人有帮助。


为避免由于C#字符串转义而导致的混淆,连接字符串应该像这样(只有一个单独的\\):Data Source=(localdb).\MyInstanceShared;Integrated Security=false;User Id=user;Password=pass321!@ - Dmitry Pavlov

1
也许您的连接字符串正在使用当前Windows用户帐户(运行服务的帐户可能是错误中看到的帐户)连接到数据库(而该用户帐户没有访问权限)。我会更改数据库以允许“混合身份验证”(这意味着SQL用户和Windows用户),然后创建一个新用户,将所需权限分配给该用户以与您的应用程序一起工作,然后从Windows服务中使用该用户名和密码在连接字符串中。您也可以将数据库保留为原样,并添加来自Windows的用户“System”,然后为其分配所需的权限。您只需将“dbo”配置文件添加到用户中即可使其快速工作(但在发布产品之前请检查安全性)。

你能告诉我如何在Visual Studio中管理用户吗? - santBart
你应该已经有SQL Server管理工具了,实际上你是如何创建正在使用的数据库的?我不知道你是否可以从Visual Studio管理安全性,但我确定你可以从SQL管理工具中。只需使用管理工具连接到本地服务器,然后打开安全选项卡/文件夹并将“SYSTEM”用户添加到您的数据库中。查看这些链接,它们可能会有所帮助:https://dev59.com/EXRC5IYBdhLWcg3wP-r5和http://msdn.microsoft.com/en-us/evalcenter/hh230763。 - Jportelas

-3

我认为你需要允许远程连接到你的 SqlServer。

在 Sql Server 配置管理器中,在 SQL 网络配置下,选择你的服务器并确保 TCP/IP 已启用。

在我的情况下,双击 TCP/IP,在底部找到 "IPAll",将动态端口设置为空,并将 TCP 端口设置为 1433。

如果以上步骤足够,请告诉我。


但我不想启用数据库的远程连接。 - santBart
一个Windows服务使用TCP/IP协议连接到数据库。即使您在同一台机器上... - Clement Dungler
不确定,但是当您启动Web服务时,它使用的是ASP.Net开发服务器,这不被视为SQL Server的“本地”。 现在它能够正常工作了吗? - Clement Dungler
它是Windows服务,不是Web服务。我已经阅读过在Express LocalDB上启用txp不是一个好的实践。 - santBart
但是你测试过这些设置吗?我使用三种类型的应用程序:WPF、Windows服务和Web服务。所有应用程序都使用相同的连接类,但如果未启用TCP/IP,则无法正常工作。 我使用SQL Server而不是Express。 - Clement Dungler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接