首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何打开已在c#中使用的Server数据库的连接?

如何打开已在c#中使用的Server数据库的连接?
EN

Stack Overflow用户
提问于 2013-02-26 16:12:53
回答 1查看 3.4K关注 0票数 0

我连接到asp.net mvc 3项目中的数据库。而且,我的解决方案中有一个windows服务项目,它会在某些情况下将数据写入该数据库。

困难在于,当windows服务项目的代码需要连接到数据库时,我得到了SqlException

无法打开登录请求的数据库"WebStore“。登录失败。登录失败的用户'NT权限\系统‘。

以下是windows服务的代码:

代码语言:javascript
复制
    public static string GetConnectionString()
    {
        return @"Data Source=(LocalDB)\v11.0; DataBase=WebStore; 
                AttachDbFilename=myDbFullPath;
                Integrated Security=True;Connect Timeout=30";
    }

在写入数据库的事件处理程序中:

代码语言:javascript
复制
using (var conn = new SqlConnection(GetConnectionString()))
{
    conn.Open();
    var productId = Convert.ToInt32(Regex.Match(e.Name, @"\d+").Value);
    const string cmd1 = "UPDATE Products SET ImageModifiedDate=@date WHERE ProductId=@productId";

    using (var command = new SqlCommand(cmd1, conn))
    {
        command.Parameters.AddWithValue("@productId", productId);
        command.Parameters.AddWithValue("@date", DateTime.Now);
        command.ExecuteNonQuery();
    }
 }

异常发生在conn.Open();行中。如果我评论这一行,command.ExecuteNonQuery();中将出现新的异常:

InvalidOperationException: ExecuteNonQuery需要打开和可用的连接。连接关闭。

问题:如何打开已附加到另一个项目中的Server数据库的连接?

编辑1:我使用以下代码在DB中创建新登录名和新用户:

代码语言:javascript
复制
CREATE LOGIN user1
WITH PASSWORD = 'password1';
GO
CREATE USER user1 FOR LOGIN user1;
GO

而不是在服务器资源管理器中附加我的数据库:我选择“使用”并输入用户名: user1,密码: password1。

我得到了:

试图附加到数据库的尝试失败,提供了以下信息: 用户“user 1”登录失败。

编辑2:我设置了以下属性:

代码语言:javascript
复制
processInstaller.Username = "user1";
processInstaller.Password = "password1";

并在cmd中运行:

代码语言:javascript
复制
installutil /name=user1 /password=password1 MyService.exe

我得到了System.ComponentModel.Win32.Exception:

the comparison between user names and security identifiers haven't been executed.

我做错什么了?

编辑3:我在services.msc和processInstaller "Account“属性中设置了我的用户名和密码。它会运行,但是当我更改映像(以及试图访问我的数据库的事件处理程序)时,我得到:

Cannot attach file 'C:\Users\Aleksey\repos\working-copy\WebStore\WebStore\App_Data\WebStore.mdf' as database 'WebStore' because this file is already in use for database 'C:\USERS\ALEKSEY\REPOS\WORKING-COPY\WEBSTORE\WEBSTORE\APP_DATA\WEBSTORE.MDF',

在连接字符串中,我添加了我在数据库中创建的用户凭据:

User Id=user1;PASSWORD=password1;

此外,当我试图在服务器资源管理器中添加连接并使用Sql Server Authentication并输入user1password1时,我从编辑1获得消息。

我应该在服务器资源管理器*Windows Authentication*和连接字符串:User Id=user1;PASSWORD=password1;中的windows服务中使用吗?

EN

回答 1

Stack Overflow用户

发布于 2013-02-27 13:18:09

代码语言:javascript
复制
Cannot open database "WebStore" requested by the login. The login failed. Login failed for user 'NT AUTHORITY\SYSTEM'.

之所以会出现这种情况,是因为您的服务正在使用LocalSystem帐户运行,并且您正在使用集成安全性连接到server,并且系统不应该在那里进行访问。因此,有三个回应:

  1. 切换到Server身份验证。,这包括在数据库中创建登录名和修改连接字符串。
  2. 使用特定用户以它真正需要的唯一权限运行服务(这实际上是一个好主意),并允许用户访问数据库,这样它就可以与集成安全性连接。这是最简单的,因为它不需要对代码进行任何更改
  3. 如果您确实需要以系统的形式运行,那么可以使用模拟来使用LogonUser切换到另一个用户(如选项2中的用户)。这样,您将只为数据库访问而使用选项2,并为其余的服务代码保留系统私密性。

第二错误

代码语言:javascript
复制
InvalidOperationException: Opened and available connection is needed for ExecuteNonQuery. Connection is closed.

是由第一个错误引起的,未能打开连接就会引发这种情况。如果没有打开的连接,您就无法执行任何操作,ADO.Net要确保这一点。

因此,第一个错误是唯一重要的错误。

我建议您使用选项二,因为这是安全实践中最好的,而且由于您是在集成安全环境中运行,所以您不必存储任何密码,当您在几个具有不同数据库、用户、密码等不同环境的环境中使用应用程序时,这是一个优点。每个环境只需要一个用户,权限就可以设置了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15093908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档