使用已打开的数据库连接

时间:2010-10-22 15:15:00

标签: c# sql-server visual-studio-2010 database-connection sqlconnection

这有点奇怪,但我想检查一下我的数据库是否已经打开?我该如何检查?如果打开我希望能够直接使用它而不通过所有声明:

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

可以这样做吗?我也知道连接字符串和连接名称。我想首先检查此连接是否可用,然后继续。

4 个答案:

答案 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设计模式应该可以帮到你。这是一个例子。

  1. Façade Pattern (wikipedia);
  2. Façade Design Pattern (Gang of Four)
  3. “智能”外观知道需要连接的方法等等。外观打开连接并将其传递给底层代码,通常包含在工厂类或类似的东西中。

    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;
        }
    }