2011-09-19 71 views
2

我有一個C#應用程序,在過去的一年中運行得很好。但是,在過去的幾個月中,我們增加了更多的客戶端,並且數據庫一直以更一致的方式報告連接錯誤。現在可能是重新審視連接處理方式的時候了,也許有更好的方法來做到這一點。這裏是管理我的連接的類:用C#進行SQL Server連接管理#

public class myDAL 
    { 
     protected SqlConnection sqlConnection = new SqlConnection(); 

     protected void openConnection(string connection) 
     { 
       sqlConnection.ConnectionString = connection; 
       sqlConnection.Open();    
     } 


     protected void closeConnection() 
     {    
      sqlConnection.Close(); 
     } 

} 

請注意,我真的沒有做任何特殊的事情來管理連接。我只需要根據需要調用打開和關閉,並且這是同時發生在多個客戶端上。我在這裏做什麼明顯錯誤嗎?

+1

什麼是實際錯誤?連接時只會看到錯誤,即調用'openConnection'時。 –

+0

如果初始嘗試失敗,可以使用重試邏輯嘗試打開連接(再次)。 –

+0

對不起,我的意思是包括錯誤。錯誤是最常見的傳輸錯誤的變體:與SQL Server建立連接時發生網絡相關或特定於實例的錯誤。服務器未找到或無法訪問。驗證實例名稱是否正確,並將SQL Server配置爲允許遠程連接。 (提供程序:命名管道提供程序,錯誤:40 - 無法打開到SQL Server的連接) –

回答

2

吉姆您有開放的實踐,另一個類中緊密連接方法是非常古老的,現代的.NET開發遵循這樣的圖案時下:SO Closing SqlConnection and SqlCommand c#或搜索在數百個問題和答案都告訴相同,關閉連接:

using (SqlConnection conn = new SqlConnection("connection string here")) 
using (SqlCommand cmd = new SqlCommand("sql query", conn)) 
{ 
    // execute it blah blah 
} 

看這裏立即或者在本例中使用,或者在同一個方法中使用try/finally,不需要打開一個方法,也不需要關閉它的方法,如果在兩者之間發生任何事情,就會出錯。

+0

「現代.NET開發遵循...」。值得慶幸的是,它不是強制遵循「現代」模式,只是爲了「現代」的搖擺,而只有當它有實際的收益時,例如,性能,代碼維護,執行速度等。 – ThunderGr

0

您可以在包裝類中實現IDisposable接口。

和/或

隨着using語句打開和關閉您的連接。

using(var db = new SqlConnection() 
{ 
    db.Something(); 
} 

現在連接自動關閉。

何時關閉連接?在每批命令之後或間隔之後?

+0

查詢後立即關閉連接。 –

0

根據呼叫的方式頻繁地進行我認爲是這樣的:

using (var sqlconnection = new SqlConnection()) 
    { 
    } 

,或者如果這不是裝修的任務,你也許可以用類似(只是僞例子)附加您的DAL:

protected void SqlExecute(Action a) 
{ 
    if (sqlConnection.State != ConnectionState.Connected) 
    sqlConnection.Open(); 

    a(); 
} 

和您的來電:

 SqlExecute(() => 
         { 
          DoSth(); 
         }); 
+0

然後將不會有呼叫到CloseConnection。 – Max

+0

我老了,這是什麼意思? – billinkc

+0

DoSth = DoSomething :-P – Max

1

使用IDisposable接口的類,還可以使用斷開連接的數據,這將是有益的

public class myDAL:IDisposable 
{ 
    protected SqlConnection sqlConnection = new SqlConnection(); 
    protected void openConnection(string connection) 
    { 
      sqlConnection.ConnectionString = connection; 
      sqlConnection.Open();    
    } 


    protected void closeConnection() 
    {    
     sqlConnection.Close(); 
    } 

    public void Dispose() 
    { 
     sqlconnection.Close(); 
     //Dispose of the connection 
    } 

} 

使用語句

using (MyDal Conn= new MyDal()) 
{ 
    //Code 
} 
0

我相信你想要的東西已經回答了here。如果您預計到數據庫的流量很大,則實施重試過程至關重要。在那個問題中,重點在於死鎖,但它對於各種SQL異常也非常有用,包括連接異常。

這可能會晚一年以上,但對於想要回答此問題的其他人可能會有用。