CommandBehavior.CloseConnectionの役割は何ですか??

7351 ワード

これは実際の知識点に関する問題であり,データベースアクセスのプログラミング経験を調べた.このセクションでは、この問題について具体的な分析を行います.このような具体的な知識点に関する問題に対して、私たちは普段から蓄積に注意しなければならない!!!
関連する知識点
CommandBehavior.CloseConnectionの使用
問題を分析する
ストリーム・モードによるデータベースの読み取りの特徴により、読み込み動作が連続的に行われるため、特定のアプリケーションでは、データベース接続がいつ閉じられるかを決定することは困難です.次に、一般的なデータ・アクセス・レイヤの静的メソッドを示します./// /// SqlDataReader /// /// static SqlDataReader GetReader() { // SqlConnection con = new SqlConnection(conn_String); try { // , // SqlDataReader con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = Sql; SqlDataReader dr = cmd.ExecuteReader(); return dr; } finally { // // :con.Close(); SqlDataReader , // // con.Close(); // } }
コードコメントに記載されているように、このような方法では、接続を閉じることも、接続を開いた状態を維持することもできません.多くのシステムは,このような困難な状況を解決するために,Readerモードを用いたデータソースを放棄したり,接続オブジェクトをメソッド呼び出し者に渡したりしてオフにするしかない.
そしてCommandBehavior.CloseConnectionの機能は、SqlDataReaderオブジェクトが閉じられると、依存する接続も自動的に閉じられるという気まずい状況を避けるために適切です.コード9-2はCommandBehaviorの使用を示す.CloseConnectionとCommandBehaviorを使用しない.CloseConnectionの違い.
ここではSqlDataReaderを例に説明しますが、他のネーミングスペースのXXXXDataReaderオブジェクトについても同様の機能があります.
まず、機能を示すために、コード9-2は、ExecuteReaderメソッドの実行時にCommandBehaviorに伝達する2つの静的なSqlDataReaderを返す方法を含む.CloseConnectionメソッド.
コード9-2はCommandBehaviorを使用する.CloseConnection:UseCommandBehavior.cs partial class UseCommandBehavior { // const String conn_String = "Server=localhost;Integrated Security=true;database=NetTest"; const String Sql = "select * from dbo.DepartCost"; /// /// CommandBehavior.CloseConnection /// /// static SqlDataReader GetReader_CloseConnection(SqlConnection con) { try { // , // SqlDataReader con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = Sql; SqlDataReader dr = cmd.ExecuteReader (CommandBehavior.CloseConnection); return dr; } finally { // CommandBehavior.CloseConnection, // //con.Close(); } } /// /// CommandBehavior.CloseConnection /// /// static SqlDataReader GetReader_NoCloseConnection(SqlConnection con) { try { // , // SqlDataReader con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = Sql; SqlDataReader dr = cmd.ExecuteReader(); return dr; } finally { // SqlDataReader , //con.Close(); } } }
CommandBehaviorを使用するかどうかにかかわらずCloseConnection、2つ
CommandBehaviorを使用するかどうかにかかわらずCloseConnectionでは、両方のメソッドが最終的に接続を閉じていませんが、接続を閉じない理由は異なります.2つのメソッドが用意すると、CommandBehaviorが使用されていることを確認するために、マスターメソッドから2つのメソッドをそれぞれ呼び出してテストを行う.CloseConnectionメソッドで返されるSqlDataReaderオブジェクトが、コード9-3に示すように、閉じながら自動的に接続を閉じるかどうか.
コード9-3はCommandBehaviorを使用する.CloseConnection: UseCommandBehavior.cs { /// /// /// static void Main(string[] args) { // SqlConnection con = new SqlConnection(conn_String); try { // CommandBehavior.CloseConnection Console.WriteLine(" CommandBehavior. CloseConnection :"); SqlDataReader sdr = GetReader_CloseConnection(con); while (sdr.Read()) { } sdr.Close(); Console.WriteLine(" :" + con.State.ToString()); // CommandBehavior.CloseConnection Console.WriteLine(" CommandBehavior. CloseConnection :"); SqlDataReader sdr1 = GetReader_NoCloseConnection(con); while (sdr1.Read()) { } sdr1.Close(); Console.WriteLine(" :" + con.State.ToString()); Console.Read(); } finally { // if (con.State != ConnectionState.Closed) con.Close(); } } }
コードの実行結果は次のとおりです.
テストにはCommandBehaviorを使用しました.CloseConnectionの方法:
コードの実行結果は次のとおりです.
テストにはCommandBehaviorを使用しました.CloseConnectionの方法:
読み込み完了後の接続状態:Closed
テストはCommandBehaviorを使用していません.CloseConnectionの方法:
読み取り完了後の接続状態:Open
読者が見たようにCommandBehaviorを使っています.CloseConnectionで得られたSqlDataReaderオブジェクトは、閉じながら依存するデータベース接続オブジェクトを自動的に閉じます.この特性は、データ・アクセス・レイヤの作成における困難を解決します.
答え
CommandBehavior.CloseConnectionでは、ストリーミングデータモードでデータベース接続を有効に閉じることができない場合を解決します.XXXDataReaderオブジェクトが生成時にCommandBehaviorを使用する.CloseConnectionでは、XXXDataReaderオブジェクトが閉じたときにデータベース接続が自動的に閉じます.