2016-09-23 69 views
1

SQLConnection使用隨機命名管道(445)而不是tcp(1433)。 namedpipes端口被我們的防火牆阻止,但不是tcp。這隻發生在試圖連接到我們的一臺sql服務器時。大多數情況下應用程序使用tcp,但隨機嘗試使用namedpipes端口。我們的sql連接非常簡單,我們不會對它做任何事情。SQLConnection使用隨機命名管道而不是tcp

我們不想硬編碼連接字符串上的tcp端口。我們已經嘗試解決這個問題。該問題僅在上週出現,而我們的Web應用程序嘗試連接時會有一段時間。

爲什麼sql連接有時試圖連接445而不是1433?它是由.net最新更新引入的錯誤還是服務器可以規定下一個要使用的端口?

UPDATE 2016年9月23日11:00

下面的代碼的示例中,我們使用連接

string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True"; 
using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    try { 
     connection.Open(); 
… 
+0

您可以發佈您的連接字符串代碼 – Ashu

+0

如果這個連接是從最終用戶的個人電腦,網絡服務器,其他數據庫服務器等製成,你從來不提然而,無論是命名管道使用TCP或者是在本地連接設置啓動連接的PC。有關更多詳細信息,請參閱https://msdn.microsoft.com/en-us/library/ms181035.aspx。 – Igor

+0

無論是Web服務器還是客戶端到sql服務器的PC連接。 – sebascomeau

回答

2

我們不想硬編碼的TCP端口我們的連接字符串

您不必在連接字符串中輸入IP地址/端口號。

但是,你可以強制連接字符串中的網絡協議

Network Library=DBMSSOCN; 

​​

但是,當我有隨機命名管道的問題是緩慢的表現,我做連接字符串爲「特定」成爲可能。這是...指定網絡庫和IP地址以及端口號。

順便說一下,我真的很希望你實際上沒有在編譯代碼中編寫你的連接字符串,下面的代碼並不是你的實際代碼。

string connectionString = "Data Source=SERVERNAME;Initial Catalog=DATABASE;uid=username;pwd=mypass;MultipleActiveResultSets=True"; 

附加:

你可以在 「魚」 周圍的問題此機註冊表的設置。

HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的MSSQLServer \客戶端\ ConnectTo \

如果DSQUERY設置或不設置我特別期待。

https://support.microsoft.com/en-us/kb/328306

檢查在下面的註冊表子項中指定的協議: HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的MSSQLServer \客戶端\ ConnectTo \ DSQUERY該值通常反映了CNU中的設置,但有時 它不是。

如果該值爲DBNETLIB,則使用其中一個協議 啓用CNU的協議列表。如果列出了特定的協議 ,則使用該協議。

如果是這樣的問題......... 最終,任何其他程序可以改變這個值。所以你沒有完全控制。同樣,更好的解決方案是將網絡庫放在連接字符串中,所以「外部力量」不能在遊戲中期改變遊戲。我知道這個的原因是因爲我在客戶端燒燬了......其他一些程序改變了DSQUERY的值,並且使用我們的應用程序的1/3的客戶端機器進入爬行狀態。因此,我沒有與之對抗,而是將網絡庫放入連接字符串中,以便永久解決問題。

+0

我們知道,我們不想指定使用的協議,因爲一切正常,因爲Web應用程序是活的(2年前)。爲什麼突然之間sql連接有這種奇怪的行爲來使用445. – sebascomeau

+0

這只是測試代碼,我們沒有編譯我們的連接字符串btw。 – sebascomeau

+0

我附加了我的答案和一個新建議。 – granadaCoder

1

您從不提及此連接是否由最終用戶PC,Web服務器,其他數據庫服務器等構成。但是,是使用命名管道還是TCP作爲主協議是創建連接的PC上的設置。這可以使用SQL Server Native Client Configuration配置,也可以在連接字符串中重寫。

要更改默認協議或協議順序爲客戶端計算機

  1. 在SQL Server配置管理器,展開SQL Server Native Client配置,右鍵單擊客戶端協議,然後單擊屬性。
  2. 在啓用的協議框中,單擊上移或下移,嘗試連接到SQL Server時更改嘗試協議的順序。啓用協議框中的頂層協議是默認協議。

將客戶端配置爲使用TCP/IP

  1. 在SQL Server配置管理器,展開SQL Server Native Client配置,右鍵單擊客戶端協議,然後單擊屬性。
  2. 在「已啓用協議」框中,單擊向上和向下箭頭可嘗試連接到SQL Server時更改嘗試協議的順序。啓用協議框中的頂層協議是默認協議。

Configure Client Protocols

+0

我們驗證了訂單,並且一切都很順利 – sebascomeau

+0

@sebascomeau - 問題是持續的還是不錯的,如該問題是否解決? – Igor

+0

對不起,這個問題依然存在。這是好的秩序。(我的壞) – sebascomeau

0

怎麼樣的服務器端?

什麼,我會在服務器上翻一番SQL Server實例配置檢查:

  • 該協議上的服務器表現爲有望啓用
  • 該協議是真實顯示出意想不到的服務器上啓用行爲

我的猜測是,'破'的服務器已命名管道啓用,而其他服務器不這樣做時,.NET客戶端正在選擇連接原型科爾有時會做出錯誤的選擇。

這是一個瘋狂的猜測,因爲我不知道.NET如何選擇連接協議...

+0

我們檢查了SQL服務器配置和一切都是正確的順序。我們的應用程序和Web服務器採用tcp協議一段時間,並突然取出命名管道,並收到錯誤消息。在我們再次嘗試之後,它需要tcp。 – sebascomeau

+0

這並不包括我的建議。配置與「正常工作」的服務器相同嗎? – Paolo

+0

如何禁用服務器上存在問題的命名管道? – Paolo