2011-12-06 35 views
6

這一個讓我難住。我甚至不想連接到數據庫。當這段代碼到達實例化一個新的SqlConnection對象的那一行時,它就掛在那裏,不會拋出異常或任何東西。我試過編譯它爲2.0。 3.5和4.0,他們都掛起。當然,它也適用於我的機器和你的機器。但我試圖在Windows Server 2008 x64服​​務器上運行此代碼,並且它不會改變。調用新的SqlConnection()掛起程序

// example.cs 
using System; 
using System.Data; 
using System.Data.SqlClient; 

public class MainClass { 
    public static void Main(string[] args) { 
     Console.WriteLine("start"); 
     SqlConnection conn = new SqlConnection(); // hangs here 
     Console.WriteLine("finish");    // never makes it here. 
    } 
} 

彙編(2.0): C:\的Windows \ Microsoft.NET \框架\ V2.0.50727 \ CSC.EXE example.cs

+0

是的,它掛起有或沒有連接字符串。 – CrackingWise

+0

如果以32位或64位爲目標,行爲是否相同? – Rob

+0

嘗試將連接字符串傳遞給SqlConnection類。 – amrfaissal

回答

1

推薦2個步驟:

  • 復位IIS清除任何連接池。 (也許,重新啓動Windows?)
  • 變化的代碼有一個using聲明:
public static void Main(string[] args) { 
    Console.WriteLine("start"); 
    using (SqlConnection conn = new SqlConnection()) 
    { 
      Console.WriteLine("middle");    
    } 
    Console.WriteLine("finish");    
} 

從該計算機中的任何其他應用程序可以讓任何其他的SqlConnection對象?

這顯然是一個環境問題,因爲您的發佈代碼將在任何其他機器上工作。懷疑它已經超出了某個臨界點,並且using將在未來幫助防禦這一點。

+0

有趣的是,你爲什麼認爲「使用」有幫助?無論如何,無參數的ctor究竟做了什麼?有人可以用.NET Reflector來檢查它。 – kol

+0

我還沒有重啓機器,它是一個生產服務器。但是寫我按照你的建議,它永遠不會變成「中等」。 – CrackingWise

+0

@CrackingWise:如何重置IIS,是否有可能? –

2

您的安裝必須被打破。代碼根本就沒有做任何重要的事情,所以沒有理由掛在那裏。

SqlConnection的構造函數這樣的:

public SqlConnection() { 
    this.ObjectID = Interlocked.Increment(ref SqlConnection._objectTypeCount); 
    base(); 
    GC.SuppressFinalize(this); 
    this._innerConnection = DbConnectionClosedNeverOpened.SingletonInstance; 
} 

所以,它增加一個變量,其拷貝到一個屬性,調用基構造,從finaliser隊列中移除該對象,副本的參考。就這樣。

基地(DbConnection)構造函數如下:

protected DbConnection() { 
} 

所以,沒有什麼在這裏,其實做任何事情都涉及到一個實際的數據庫連接。所有這些都是在您實際打開連接時完成的。

您的程序可能會掛在第一個Console.WriteLine調用之後,甚至沒有創建SqlConnection對象。

+0

我懷疑這是一個破損的安裝,這意味着我所有的.NET安裝都會中斷(2.0,3.0,3.5和4.0)。它不掛在Console.Write行上,我測試過了。 – CrackingWise

+0

在SingletonInstance屬性的getter中沒有發生什麼事情嗎? – kol

+0

我同意,破碎的安裝是我的#1猜測。它相當快速和容易重新安裝。淨我會嘗試第一。你需要.net2,3.5和4嗎?如果不是,只安裝一個你需要的(儘可能減少可能的問題) – wal

0

我有同樣的問題,它開始在I後工作1.將目標框架從4.0更改爲3.5,並在Visual Studio中將調試設置更改爲x64。

6

這可能是一個性能不佳的問題。我有這個問題,我用Procmon來檢測發生了什麼。當它來加載註冊表項性能監視器「.NET數據提供程序使用Sql Server」

絞死我的.NET應用程序卸載我用下面的命令櫃檯得到它的工作:

unlodctr ".NET Data Provider for SqlServer" 
+0

謝謝 - 當我遇到這個問題時,這幫助了我! – Konrad

+0

**「.NET Memory Cache 4.0」**是另一個可能受到影響的產品 - 不確定這些計數器是如何被損壞的。 – SliverNinja

0

找到解決方案我在很多個人電腦上有同樣的問題。 4.5.2框架

運行此命令管理員在CMD:

unlodctr ".NET Data Provider for SqlServer" 

您可能需要手動鍵入它作爲一份麪食不包括引號很好地工作。

來源:

http://askproblem.com/question/calling-new-sqlconnection-hangs-program/

我知道這個線程是老了,但也許別人會得到這個錯誤。這是 可能是一個性能問題,這是一個問題。我有這個問題 ,我用Procmon來檢測發生了什麼。我的.NET應用程序當它加載性能監視器的「.NET數據 提供程序」爲SqlServer「加載註冊表項時被絞死」我使用以下命令將計數器卸載到 讓它工作:C:Windowsinf> unlodctr「.NET Data SqlServer提供程序「

+3

這只是一個重複的答案_right此頁_... –