这有点奇怪,但我想检查到我的数据库的连接是否已经打开?我该如何检查?如果打开,我希望能够直接使用它而无需查看所有语句:
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;
}
}