2013-02-26 67 views
0

我連接到asp.net mvc 3項目中的數據庫。此外,我在我的解決方案中有一個Windows服務項目,在某些事件中將數據寫入此數據庫。如何打開已經在c#中使用的SQL Server數據庫的連接?

的困難在於,當從Windows服務項目中的代碼需要連接到數據庫,我得到SqlException

無法打開數據庫「網上商店」的登錄請求。登錄失敗。用戶'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 [email protected] WHERE [email protected]"; 

    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 

比我想附上我在服務器資源管理器DB:我選擇「使用SQL服務器自動驗證「並輸入用戶名: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:我在服務中設置了我的用戶名和密碼。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我得到編輯1消息。

我應該在服務器資源管理器*Windows Authentication*和Windows服務中使用的連接字符串中:User Id=user1;PASSWORD=password1;

+0

當您在自己的憑證/身份下調試代碼時,登錄異常仍然發生嗎?另外,我很少在字符串上使用@指令,是否會改變'\'的行爲,使'\ v'正確或者它應該是'\\ v'? (再次,我很少使用@並且不知道。) – 2013-02-26 16:15:12

+2

在數據庫中創建新登錄並在連接字符串中傳遞用戶名和密碼。 – 2013-02-26 16:16:07

+0

您是否嘗試過使用網絡服務帳戶打開它?該帳戶應該繞過傳統登錄。因爲它將像網絡上的計算機一樣工作,所以它不應該有與SQL連接的問題。 http://msdn.microsoft。com/en-us/library/windows/desktop/ms684272%28v = vs.85%29.aspx – Greg 2013-02-26 16:16:35

回答

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

這是因爲你的服務與本地系統帳戶下運行,並且正在使用集成安全性連接到SQL Server和System不應該訪問那裏。所以三選項:

  1. 切換到SQL Server身份驗證。這包括在數據庫中創建一個登錄和修改連接字符串
  2. 運行與只有它真正需要的權限的特定用戶的服務(這其實是一個好主意),並賦予該用戶訪問數據庫,以便它可以與集成安全連接。這是最簡單的,因爲它不需要對代碼
  3. 任何改變。如果你真的需要爲系統中運行,那麼可以使用模擬切換到另一個用戶(比如從選項2的用戶)提供的LogonUser。這樣,您最終只能選擇數據庫訪問權限2,併爲其餘服務代碼保留SYSTEM權限。

第二個錯誤

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

由第一錯誤引起的,未能打開連接把它提出來。如果沒有開放的連接,你不能執行任何操作,ADO.Net可以確保這一點。

所以第一個錯誤是唯一重要的一個。

我推薦你使用選項2,因爲在安全實踐方面是最好的,而且由於你在集成安全性中運行,所以你不必存儲任何密碼,而且當你有你的應用程序時,幾個不同的數據庫,用戶,密碼和你有什麼環境。只是每個環境中的用戶,權限和設置。

+0

究竟如何實施第二種方法?請檢查我上面的編輯。謝謝! – 2013-02-27 17:21:29

+0

不要在安裝時設置用戶,運行services.msc並編輯那裏的服務屬性 – 2013-02-27 17:49:04

+0

您能否逐步描述流程,因爲我沒有完全知道如何以及如何操作。提前致謝! – 2013-02-28 07:16:11

相關問題