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