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

本文关键字:SQL Server 连接 数据库 何打开 | 更新日期: 2023-09-27 18:01:18

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

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

无法打开登录请求的数据库"WebStore"。登录失败。用户"NT AUTHORITY''SYSTEM"登录失败

这是来自windows服务的代码:

    public static string GetConnectionString()
    {
        return @"Data Source=(LocalDB)'v11.0; DataBase=WebStore; 
                AttachDbFilename=myDbFullPath;
                Integrated Security=True;Connect Timeout=30";
    }

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

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需要打开且可用的连接。连接已关闭

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

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

CREATE LOGIN user1
WITH PASSWORD = 'password1';
GO
CREATE USER user1 FOR LOGIN user1;
GO

然后我尝试在服务器资源管理器中附加我的数据库:我选择"使用Sql Server身份验证"并输入用户名:user1,密码:password1。

我得到:

尝试附加到数据库失败,返回以下信息:
用户"user1"登录失败

编辑2:我设置了这个属性:

processInstaller.Username = "user1";
processInstaller.Password = "password1";

然后在cmd:中运行

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"帐户"属性中设置了我的用户名和密码,并将其保留为"本地系统"。它运行,但当我更改图像(以及试图访问我的数据库的事件处理程序(时,我得到:

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时,我会从Edit 1收到消息。

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

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

Cannot open database "WebStore" requested by the login. The login failed. Login failed for user 'NT AUTHORITY'SYSTEM'.

发生这种情况是因为您的服务使用LocalSystem帐户运行,并且您正在使用集成安全性连接到SQL server,而SYSTEM不应该访问那里。所以有三个选择:

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

第二个错误

InvalidOperationException: Opened and available connection is needed for ExecuteNonQuery. Connection is closed.

是由第一个错误引起的,打开连接失败会引发此问题。没有开放的连接,你就无法执行任何东西,ADO.Net确保了这一点。

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

我建议您选择选项二,因为这在安全实践方面是最好的,而且由于您是在集成安全环境中运行的,您不必存储任何密码,当您的应用程序在具有不同数据库、用户、密码和其他内容的多个环境中时,这是一个优势。每个环境只需要一个用户,权限和设置。