這是一個有點奇怪,但我想檢查是否已連接到我的數據庫已打開或沒有?我如何檢查?如果打開,我希望能夠直接使用它,而無需通過所有語句:使用已經打開的數據庫連接
sqlconnection conn = new sqlconnection("string ...");
可以這樣做嗎?我也知道連接字符串和連接名稱。我想檢查這個連接是否可用,然後繼續。
這是一個有點奇怪,但我想檢查是否已連接到我的數據庫已打開或沒有?我如何檢查?如果打開,我希望能夠直接使用它,而無需通過所有語句:使用已經打開的數據庫連接
sqlconnection conn = new sqlconnection("string ...");
可以這樣做嗎?我也知道連接字符串和連接名稱。我想檢查這個連接是否可用,然後繼續。
如果你知道在連接字符串,然後獲取一個新的可用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
}
你看着爲SqlConnection的文件?
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx
我相信,「國家」屬性會告訴你想要的東西。
如果要問,而更普遍瞭如何使用從連接池中現有的連接,這將時自動創建一個相同的連接字符串作爲有效連接的新的SqlConnection來完成。
如果你只是想避免編寫冗餘代碼,然後把它放在一個類和重用。
雖然你可能只使用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將管理你的連接和所有的東西。儘管如果項目很小,這並不總是值得的。
編輯:取得的代碼更明確的
的Façade
設計模式應該幫助你在這裏。這是一個例子。
一個「智能」門面知道什麼方法需要連接到哪裏,等等。門面打開連接,並將其傳遞給底層代碼,通常包含在工廠類或類似的東西。
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;
}
}
謝謝Kragen。我擔心打開已經打開的連接。我不知道.NET的'重用'屬性。 – zack 2010-10-22 15:33:42
非常有用的答案,我沒有什麼是連接池,並打算創建一個機制自己! – Jack 2015-08-24 19:03:38