2011-06-29 5 views
4

データアクセス用にMicrosoftアプリケーションブロックを使用してデータベースとやり取りするアプリケーションを検討しています。アプリケーションは関数を呼び出し、その関数にクエリを渡します。この関数は、(指定されたクエリの)データアクセスアプリケーションブロックを使用してDataReaderオブジェクトを作成し、DataReaderを呼び出し元に返します。データアクセス用にMicrosoftアプリケーションブロックを使用する場合、DataReader.Close()メソッドは接続オブジェクトを閉じますか?

アプリケーションは、完了したらDataReaderオブジェクトを閉じます。私が持っている質問は、DataReaderオブジェクトを閉じると自動的に基底の接続オブジェクトを閉じるかどうかです。データアクセスアプリケーションブロックがCommandBehavior.CloseConnectionフラグを持つコマンドオブジェクトを開くかどうかはわかりません。

質問:close()メソッドは、DataReaderオブジェクトで呼び出された場合

  1. 、それはまた、基になる接続オブジェクト(DataReaderオブジェクトは、Microsoftアプリケーションブロックを使用して作成されて閉じない - Database.ExecuteReader()メソッドを
  2. ない場合、我々はデータリーダーで行われた後、接続が解放されることを保証するための推奨方法は何ですか?事前に

おかげ

答えて

0

オブジェクトを手動で閉じて処分することをお勧めします。 GCは最終的にそれらを収集しますが、データベースを扱うときはいつか分かりません。オープンな接続がリソースを浪費するのを止めたくない場合です。

だからあなたの質問に答えるために:

1)はい、DataReader.Close()は接続を閉じます。これは、接続されたオブジェクトを扱う場合に関係します。

リーダーを閉じるとすぐに、使用していた接続は も自動的に閉じられます。 Readersはオブジェクト (正しく機能するにはオープン接続が必要です)に接続されているため、読み取りを終了する前に Connectionを閉じることはできません。 http://p2p.wrox.com/book-beginning-asp-net-1-0/11037-sqldatareader-close-connection.html

も見:http://msdn.microsoft.com/en-us/magazine/cc188705.aspx

2)私は、usingステートメントで接続を置くことをお勧めします: **これらは、通常のSqlClientオブジェクトを使用して行われているが、彼らが継承するすべてのオブジェクトを操作しますSystem.Data.Common.DbCommant、System.Data.Common.DbConnectionなどのクラスから取得できます。

using(SqlConnection con = new SqlConnection(....)) 
{ 
    //blah blah blah 
    con.close(); 
} 

Disposeはusingの最後に呼び出されます。これはcloseを呼び出しますが、私はまだ暗黙的に呼び出したいと思います。

か、あなたは、try/catch文でそれを置くことができます。

SQLConnection con = new SqlConnection(...); 
try 
{ 
    con.open(); 
} 
catch(Exception ex) 
{ 
} 
finally 
{ 
    //depending on the version of .NET you might want to do: 
    //if(con.State != System.Data.ConnectionState.Closed) 
    // con.Close(); 
    con.close(); 
} 
+0

おかげでライアン。私の質問は特にMicrosoft Data Access Applicationブロックに関するものでした。この場合、接続を開いて管理するのはアプリケーションブロックライブラリです。私は、多数の接続を開いたままにするアプリケーションを見直していました。私はそれを見たとき、アプリケーションがデータリーダーオブジェクトを閉じるときに、アプリケーションブロックが接続を閉じないように見えました。だから私はそれがMAB内でどのように動作するかについていくつかの洞察を得たいと思っていました。 –

+0

コメントに問題はありません。マイクロソフトでは、すべてのデータウェアハウスオブジェクトでこの機能を実行しています。あなたが見ているなら:http://msdn.microsoft.com/en-us/magazine/cc188705.aspxあなたは、読者が閉じても、下にある接続も閉じていることがわかります。それはDAABを扱うものです。 –

+0

明示的に呼びたい場合は私は個人的には2番目の例を好む –

0

「CommandBehavior.CloseConnection」を使用すると、リーダーが閉じた後に接続が終了します。ちょうどこのよう:

OracleDataReader odr = oc.ExecuteReader(CommandBehavior.CloseConnection); 
odr.Close(); 
if (oc.Connection.State == System.Data.ConnectionState.Closed) { 
    System.Diagnostics.Debug.WriteLine("connection is closed"); 
} 

場合だけ

のようなパラメータなしであなたのExecuteReader()、
OracleDataReader odr = oc.ExecuteReader(); 
odr.Close(); 
if (oc.Connection.State != System.Data.ConnectionState.Closed) { 
    System.Diagnostics.Debug.WriteLine("connection is openning"); 
} 

読み取り:コメントをhttp://msdn.microsoft.com/en-us/library/system.data.commandbehavior.aspx

関連する問題