这有点奇怪,但我想检查一下我的数据库是否已经打开?我该如何检查?如果打开我希望能够直接使用它而不通过所有声明:
sqlconnection conn = new sqlconnection("string ...");
可以这样做吗?我也知道连接字符串和连接名称。我想首先检查此连接是否可用,然后继续。
答案 0 :(得分: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
}
答案 1 :(得分:2)
您是否查看了SqlConnection的文档?
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx
我相信“州”财产会告诉你你想要什么。
如果您更普遍地询问如何使用连接池中的现有连接,则在创建具有相同连接字符串作为活动连接的新SqlConnection时,这将自动完成。
如果你只是想避免编写冗余代码,那么把它放在一个类中并重用它。
答案 2 :(得分: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这样的东西来管理连接和所有这些东西。虽然如果项目很小,那并不总是值得的。
编辑:使代码更加明确
答案 3 :(得分:1)
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;
}
}