2

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

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

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

4

4 回答 4

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
}
于 2010-10-22T15:29:53.633 回答
2

你看过 SqlConnection 的文档吗?

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

我相信“状态”属性会告诉你你想要什么。

如果您更一般地询问如何使用连接池中的现有连接,当您创建一个具有与活动连接相同的连接字符串的新 SqlConnection 时,这将自动完成。

如果您只是想避免编写冗余代码,请将其放入一个类中并重用它。

于 2010-10-22T15:19:32.317 回答
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 之类的东西来为您管理连接和所有这些东西。尽管如果项目很小,这并不总是值得付出努力。

编辑:使代码更加明确

于 2010-10-22T15:23:41.277 回答
1

Façade设计模式应该在这里为您提供帮助。这是一个例子。

  1. 立面图案(维基百科)
  2. 立面设计模式(四人组)

“智能”外观知道需要什么方法连接到哪里等。外观打开连接并将其传递给底层代码,通常包含在工厂类或类似的东西中。

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;
    }
}
于 2010-10-22T15:40:37.330 回答