2010-11-26 16 views
2

私はC#でアプリケーションを構築しており、DAL(SQL Server)用のエンタープライズライブラリを使用することに決めました。エンタープライズライブラリの管理接続

どこか覚えていませんが、接続が自動的に閉じられると言ったEntLibに関する記事を読んでいました。

本当ですか?

もしそうでなければ、中間層の接続を管理する最良の方法は何ですか? それぞれの方法で開閉しますか?

上記Iは、予めEntLib

public DataSet ReturnSomething 
{ 
    var sqlStr = "select something"; 
    DbCommand cmd = db.GetSqlStringCommand(sqlStr); 
    db.AddInParameter(cmd, "@param1", SqlDbType.BigInt, hotelID); 
    db.AddInParameter(cmd, "@param2", SqlDbType.NVarChar, date); 
    return db.ExecuteDataSet(cmd); 

}

おかげを使用しています方法のサンプル方法です。

答えて

2

ExecuteDataSetメソッドは、すべてのデータを含むDataSetオブジェクトを返します。これにより、あなた自身のローカルコピーが得られます。 ExecuteDataSetへの呼び出しは、接続を開き、DataSetを移入し、そしてより多くの情報のために結果

を返す前に、接続を閉じます。私はあなたのように使用する静的クラスのようなものを持ってすべきだと思う

http://msdn.microsoft.com/en-us/library/ff648933.aspx

+0

DataReaderを取得するか、挿入、削除、更新する場合はどうなりますか?接続の処理方法は? – StrouMfios

0

あなたのライブラリサブシステムに適切な接続を提供するFaçade。

public static class SystemFacade { 
    // Used as a subsystem to which the connections are provided. 
    private static readonly SystemFactory _systemFactory = new SystemFactory(); 

    public static IList<Customer> GetCustomers() { 
     using (var connection = OpenConnection(nameOfEntLibNamedConnection)) 
      return _systemFactory.GetCustomers(connection); 
    } 

    public static DbConnection OpenConnection(string connectionName) { 
     var connection = 
      // Read EntLib config and create a new connection here, and assure 
      // it is opened before you return it. 

     if (connection.State == ConnectionState.Closed) 
      connection.Open(); 

     return connection;    
    } 
} 

internal class SystemFactory { 
    internal IList<Customer> GetCustomers(DbConnection connection) { 
     // Place code to get customers here. 
    } 
} 

そして、このコードを使用:このコードサンプルで

public class MyPageClass { 
    private void DisplayCustomers() { 
     GridView.DataSource = SystemFacade.GetCustomers(); 
    } 
} 

は、あなたはクラスライブラリの機能と機能を提供して静的クラスを持っています。 Façadeクラスはユーザーに可能なすべてのアクションを提供するために使用されますが、使用する接続などで頭痛を感じることはありません。必要なのは、基礎となるデータストアから顧客のリストだけです。その後、GetCustomersへの呼び出しがそれを行います。

Façadeは情報をどこから取得するかを知っているインテリジェントなクラスであるため、それに応じて接続を作成し、顧客をサブシステムファクトリから注文します。工場は、要求されたことを行い、利用可能な接続を取得し、さらに質問することなく顧客を検索します。

これは役に立ちますか?

+0

私が読んだ記事は間違っていたので、それぞれの使用のために接続を閉じて開きます!ご協力ありがとうございます。Will Marcouiller – StrouMfios

+0

いいえ、接続を手動で管理する必要はありません。ブロックは自動的に接続を開き、接続を閉じます。このソリューションは、特にデータセットを使用している場合は、過剰な使用です。 –

0

はい、EntLibは接続を閉じます(実際には接続プールに戻します)。これがEntLibの使用を始めた主な理由です。

しかし、新しい開発のためにEntity Frameworkを使用するようになりましたが、これははるかに生産性が高いことがわかりました。

+0

この透明性はすべて私を心配させます。だから、私は接続を開く必要はありません。新しい "アクション"を実行すると、利用可能な接続がプーリングから取得されます(利用可能な場合)か、新しい接続が開きますか?私はDB内でsp_who2を実行し、スリープ状態と15以上の接続があります。私はこのdbを使用する唯一のユーザーだから、利用可能な接続の数が多すぎると思う。 – StrouMfios

+0

はい、すべて自動です。コードをループに入れて1000回実行してみてください。接続数は増えないでください。 –

+0

それは奇妙です、私は15以上の接続がある前に私が言ったように何かが間違っている原因です。それは接続を閉じることはなく、すべての要求が新しい接続を作成するようです。 – StrouMfios

関連する問題