2

這是一個有點奇怪,但我想檢查是否已連接到我的數據庫已打開或沒有?我如何檢查?如果打開,我希望能夠直接使用它,而無需通過所有語句:使用已經打開的數據庫連接

sqlconnection conn = new sqlconnection("string ..."); 

可以這樣做嗎?我也知道連接字符串和連接名稱。我想檢查這個連接是否可用,然後繼續。

回答

8

如果你知道在連接字符串,然後獲取一個新的可用SQL連接的最簡單的方法是創建SqlConnection類的新實例:

using (SqlConnection conn = new SqlConnection("MyConnectionString")) 
{ 
    conn.Open(); 
    // Use the connection 
} 

.NET框架使用連接池和因此沒有必要擔心開口效率&多個連接 - 在上面的代碼將是重新使用可用的現有的連接,或者根據需要創建一個新的。

如果你想自己節省一些打字,那麼你可能會發現它很有用自己創建一個小的輔助方法或屬性:

class SqlHelper 
{ 
    public static SqlConnection GetConn() 
    { 
     SqlConnection returnValue = new SqlConnection("MyConnectionString"); 
     returnValue.Open(); 
     return returnValue; 
    } 
} 

用法:

using (SqlConnection conn = SqlHelper.GetConn()) 
{ 
    // Use the connection 
} 
+0

謝謝Kragen。我擔心打開已經打開的連接。我不知道.NET的'重用'屬性。 – zack 2010-10-22 15:33:42

+0

非常有用的答案,我沒有什麼是連接池,並打算創建一個機制自己! – Jack 2015-08-24 19:03:38

2

你看着爲SqlConnection的文件?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx

我相信,「國家」屬性會告訴你想要的東西。

如果要問,而更普遍瞭如何使用從連接池中現有的連接,這將時自動創建一個相同的連接字符串作爲有效連接的新的SqlConnection來完成。

如果你只是想避免編寫冗餘代碼,然後把它放在一個類和重用。

1

雖然你可能只使用SQL Server可能是很好的做法,以熟悉,因爲所有數據提供者實現他們System.Data所有的核心接口。我相信State財產上IDbConnection返回你所要求的(IDbConnection

你也可能想要隱藏某種集中的方法是邏輯的信息:

public static IDbConnection RetrieveConnection(){ 
    if(DataAccess.Connection.State == ConnectionState.Open) return DataAccess.Connection; 

    conn.Dispose(); //to be clean, I believe this is safe if it's already disposed 
    //retrieve configured connection string 
    //create and open connection 
    return DataAccess.Connection; 
} 

所以也許DataAccess是一些地方,你可以放置和檢索你的連接對象,但我會避免讓每個人都直接使用它。而是讓他們通過可以確保連接可用的方法。我只是想給你提供一些想法。你

可能還需要採取這一步,使用類似的NHibernate將管理你的連接和所有的東西。儘管如果項目很小,這並不總是值得的。

編輯:取得的代碼更明確的

+0

謝謝。在這裏我應該用我的connectionstringName替換conn吧? – zack 2010-10-22 15:25:52

+0

哦,我實際上使用'conn'作爲IDbConnection變量。我將更新變量名稱。我試圖表明,也許你有可能活連接掛在一些單身人士或緩存,這種方法知道。這樣你所有的代碼都可以使用這種方法,它可以檢查並可能建立/打開連接。 – 2010-10-22 15:31:06

+0

我得到了我的答案。感謝分享這個雖然:) – zack 2010-10-22 15:32:52

1

Façade設計模式應該幫助你在這裏。這是一個例子。

  1. Façade Pattern (wikipedia);
  2. Façade Design Pattern (Gang of Four)

一個「智能」門面知道什麼方法需要連接到哪裏,等等。門面打開連接,並將其傳遞給底層代碼,通常包含在工廠類或類似的東西。

public class DoSomethingFacade { 
    private static readonly DoSomethingFactory _doSomethingFactory = new DoSomethingFactory(); 

    public static IList<T> GetList<T>() { 
     using(IDbConnection connection = OpenConnection("string...")) 
      return _doSomethingFactory.GetList<T>(connection); 
    } 

    public static IDbConnection OpenConnection(string connectionString) { 
     IDbConnection openedConnection = new SqlConnection(connectionString); 
     openedConnection.Open(); 
     return openedConnection; 
    } 
} 

internal class DoSomethingFactory { 
    internal DoSomethingFactory() { } 

    internal IList<T> GetList<T>(IDbConnection connection) { 
     IList<T> results = new List<T>(); 

     // use connection here without caring about it, 
     // as it should be provided as an opened available connection. 

     return results; 
    } 
} 
相關問題