Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何打开与已在c#中使用的SQL Server数据库的连接?_C#_Asp.net_Sql_Database Connection_Sql Server 2012 - Fatal编程技术网

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

如何打开与已在c#中使用的SQL Server数据库的连接?,c#,asp.net,sql,database-connection,sql-server-2012,C#,Asp.net,Sql,Database Connection,Sql Server 2012,我连接到asp.net mvc 3项目中的数据库。我的解决方案中还有一个windows服务项目,在某些情况下会将数据写入此数据库 困难在于,当windows服务项目中的代码需要连接到数据库时,我得到了SqlException: 无法打开登录请求的数据库“WebStore”。登录失败。用户“NT AUTHORITY\SYSTEM”登录失败 以下是来自windows服务的代码: public static string GetConnectionString() {

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

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

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

CREATE LOGIN user1
WITH PASSWORD = 'password1';
GO
CREATE USER user1 FOR LOGIN user1;
GO
然后,我尝试在服务器资源管理器中附加数据库:我选择“使用Sql Server AutherNotification”并输入用户名:user1,密码:password1

我得到:

尝试附加到数据库失败,信息如下:
用户“user1”的登录失败

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

processInstaller.Username = "user1";
processInstaller.Password = "password1";
然后在cmd中运行:

installutil /name=user1 /password=password1 MyService.exe
我得到了
System.ComponentModel.Win32.Exception:

尚未执行用户名和安全标识符之间的比较。

我做错了什么

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

无法将文件“C:\Users\Aleksey\repos\working-copy\WebStore\WebStore\App\u Data\WebStore.mdf”附加为数据库“WebStore”,因为此文件已用于数据库“C:\Users\Aleksey\repos\working-copy\WebStore\WebStore\App\u Data\WebStore.mdf”

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

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();
    }
 }
User Id=user1;密码=密码1

此外,当我尝试在服务器资源管理器中添加连接并使用
Sql server身份验证时,我输入
user1
password1
时,我会从编辑1获得消息

我是否应该在服务器资源管理器
*Windows身份验证*
中以及在Windows服务中使用连接字符串:
User Id=user1;密码=密码1

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

  • 切换到SQL Server身份验证。这包括在数据库中创建登录名和修改连接字符串
  • 使用一个特定的用户以它真正需要的权限运行该服务(这实际上是一个好主意),并为该用户提供对数据库的访问权限,以便它可以使用集成的安全性进行连接。这是最简单的,因为它不需要对代码进行任何更改
  • 如果确实需要作为系统运行,则可以使用模拟切换到另一个用户(如选项2中的用户),并使用LogonUser。这样,您就只需要访问数据库就可以使用选项2,并保留其余服务代码的系统权限
  • 第二个错误

    InvalidOperationException: Opened and available connection is needed for ExecuteNonQuery. Connection is closed.
    
    是由第一个错误引起的,打开连接失败会导致此问题。没有打开的连接,您无法执行任何操作,ADO.Net确保了这一点

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


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

    当您使用自己的凭据/身份调试代码时,登录异常是否仍会发生?另外,我很少在字符串上使用@directive,这会改变“\”的行为,使“\v”是正确的还是应该是“\\v”?(同样,我很少使用@和不知道。)在数据库中创建新登录名,并在连接字符串中传递用户名和密码。您是否尝试使用网络服务帐户打开它?该帐户应绕过传统登录。因为它的行为类似于网络上的计算机,所以它与SQL的接口不应该有问题。我还没有尝试用网络服务帐户打开它。将检查链接系统用户是否具有sql server的登录权限,以及是否具有WebStore DB的权限?您的windows服务正在以此用户身份运行,并尝试使用这些凭据进行连接。我认为问题不在于两个同时连接。您还可以通过其属性更改服务的运行身份。如何准确实现第二种方法?请检查我上面的编辑。谢谢不要在安装中设置用户,运行services.msc并编辑服务属性。你可以一步一步地描述这个过程,因为我不完全了解如何以及如何做。提前谢谢!以管理用户身份运行services.msc。找到您的服务,双击,转到“登录”选项卡,从本地系统更改为“此帐户”,将具有集成安全性的sql server访问权限的用户放入