1

ストアド プロシージャを呼び出して FOR XML クエリを実行するデータ アクセス クラスから XMLReader を返そうとしています。問題は、xmlreader を返すときに SQL 接続で close() を呼び出すことができないか、読み取りが終了することです。xmlreader を呼び出すクラスは、SQL 接続について何も知らないため、接続を閉じることはできません。どうすればこれを処理できますか?

4

2 に答える 2

3

を構築しXmlDocumentて返すことができるので、そのデータベース接続を閉じることができます。

于 2010-01-11T17:21:03.587 に答える
1

匿名メソッドを使用して呼び出しをラップします。

たとえば、データ層クラスがあると仮定すると、同様のメソッドをデータ層に追加します。

public delegate void DoSomethingInvoker();
class DataLayer
{
   //myReader needs to be declared externally in other to access it from the doSomething delegate
   public void MethodThatGetsAsXmlReader(XmlReader myReader, DoSomethingInvoker doSomething)
   {
      myReader = GetXmlReaderFromDB();
      doSomething();
      CloseDbConnection();      //close connections, do cleanup, and any other book keeping can be done after the doSomething() call
   }
}

それを呼び出し/使用するには、高レベルのクラスでこれを行うだけです

DataLayer dl = new DataLayer();
XmlReader myReader = null;  //variables declared outside the scope of the anonymous method are still accessible inside it through the magic of closures
dl.MethodThatGetsAsXmlReader(myReader, delegate()
   {
      //do all work that involves myReader here
      myReader.read();   
      Console.out.println(myReader.value);
   });
//at this point myReader is closed and cannot be used

基本的に、実行したいコードをデータレイヤーに渡すと、データレイヤーは xmlreader をフェッチし、それに対してコードを呼び出して、クリーンアップを行います。

コードでトランザクション ロジックをラップするために、同様の手法を使用します。

DataLayer dl = new DataLayer();
dl.Transaction(delegate()
   {
        dl.DbCall1();
        dl.DbCall2();
        dl.DbCall3();
    });

コードを整理して層状に保ちながら、コードを読みやすくします。

于 2010-01-11T18:11:57.787 に答える