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

「State」プロパティがあなたが望むものを教えてくれると私は信じています。

接続プールから既存の接続をどのように使用できるかをより一般的に尋ねる場合は、アクティブな接続と同じ接続文字列を使用して新しいSqlConnectionを作成すると、これが自動的に行われます。

冗長なコードを記述しないようにするだけの場合は、それをクラスに入れて再利用します。

于 2010-10-22T15:19:32.317 に答える
1

System.DataおそらくSQLServerを使用しているだけですが、すべてのデータプロバイダーがそれらを実装しているため、すべてのコアインターフェイスに精通することをお勧めします。上の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 に答える