2010-07-01 84 views
2

我創建了一個將連接到SQL Server以運行存儲過程的類。在Windows窗體解決方案中使用此類時,可以成功訪問數據庫。當班級放入Windows服務時,出現以下錯誤:從Windows服務通過網絡訪問SQL Server

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

我懷疑問題是與權限相關的。

這是培訓相關代碼段:

SqlConnection conn = new SqlConnection(j.ConnectionString); 
SqlCommand cmd = new SqlCommand(j.Query, conn); 
cmd.CommandType = CommandType.Text; 
SqlDataAdapter da = new SqlDataAdapter(cmd); 

DataSet ds = new DataSet("Table1"); 

da.Fill(ds, "Table1"); // <----- error occurs here (Windows Service only) 

的SQL Server版本是

Microsoft SQL Server 2008 (SP1) - 10.0.2766.0 (X64) 
Enterprise Edition (64-bit) on Windows NT 5.2 <X64> 
(Build 3790: Service Pack 2) 

在Visual Studio版本是Microsoft Visual C# 2008 Framework版本是3.5 SP1

+0

我會查看服務運行的用戶。它是一個本地用戶嗎? – 2010-07-01 14:16:58

+1

你使用什麼連接字符串,你使用集成或sql服務器身份驗證? – 2010-07-01 14:21:55

+0

我試過使用「本地服務」,「網絡服務」,「本地系統」和「用戶」。 連接字符串是「Persist Security Info = False; User ID = call_tracker; Password = pCa11Tracker; Initial Catalog = CallData; Data Source = SQLData \ CORP」,它與用於Windows窗體應用程序的連接字符串完全相同工作(從配置文件中讀取字符串)。 – flynn 2010-07-01 15:36:46

回答

1

該特定錯誤僅表示客戶端無法連接到服務器。這是甚至沒有權限。檢查以確保應用程序服務器可以連接。有些事情要嘗試:

1)通過端口1433做一個telnet到服務器IP(假設默認端口) 如果這不起作用,是否有路由器或防火牆阻止對服務器的訪問? 2)轉到應用程序服務器上的ODBC(數據源),並設置DNS條目,並在最後點擊「測試」按鈕。這將測試客戶端驅動程序是否可以與SQL Server交談。

最有可能的第1步將失敗。如果您將服務器名稱更改爲「BigBird」,則會出現相同的錯誤。這是一個普通的錯誤,說「你告訴我連接到這臺服務器,但沒有服務器響應連接請求」。這發生在客戶端和服務器之間發生「握手」和權限檢查之前。

HTH, 埃裏克

+0

我同意這是錯誤消息的含義,但是當在Windows窗體應用程序中使用完全相同的代碼時,我可以連接到SQL Server,將數據拉回到我的系統並將該數據寫入文本文件。這很奇怪,Windows窗體應用程序的作品,但Windows服務應用程序沒有。 – flynn 2010-07-02 14:53:46

+0

我只是想澄清,這不是權限相關。這不是您使用的用戶名稱的問題。客戶端和服務器根本無法互相通話。 – Anon246 2010-07-02 15:07:21

+0

正確。感謝您的意見。當我說「權限相關」時,我的意思是「與連接有關」。 – flynn 2010-07-02 16:27:24

3

Windows服務使用默認的「本地服務」登錄時使用網絡資源的限制。因此,您需要在允許訪問網絡的用戶帳戶下運行該服務。以下是可能性:

1.)如果您使用「NetworkService」連接,則不應在與SQL服務的連接上使用Windows的集成身份驗證,但可以使用帶有用戶名和密碼的SQL身份驗證。 (從技術上講,如果您提供客戶端計算機的域帳戶(例如CLIENT $),則可以使用集成身份驗證 - 對數據庫的權限...但不建議這樣做。)

2.)如果您將服務設置爲在您選擇的真實用戶帳戶下運行,那麼SQL連接可以使用Windows集成身份驗證,但您必須將該帳戶權限授予數據庫。

+0

Windows窗體用於連接到SQL Server的連接類型是什麼? Windows身份驗證?但是,Windows Form應用程序已成功連接,這就是我需要該服務進行連接的方式。 – flynn 2010-07-02 14:55:17

+0

這取決於你配置它做什麼。如果你使用了用戶名和密碼,那可能是SQL認證;如果你沒有,它可能是Windows集成身份驗證(它使用登錄和運行應用程序的人的憑據)。 – ewall 2010-07-02 18:24:31

相關問題