一歩一歩AgileEASの使い方を教えてあげますNETベースクラスライブラリによる応用開発−ベース編−UDAにおける依頼と応用


前文の回顧
前の記事はAgileEASに基づいています.NETプラットフォームの基礎クラスライブラリは応用開発を行う-UDAを使ってSQL文を操作する1文の中でどのようにUDAを使って通常の業務を行って操作を行うことを実証して、私達は2種類のデータ操作の流れを見て、1種は原始の操作の流れで、もう1種は簡略化のデータ操作の流れで、応用開発者はデータベースの開くことと閉じることに関心を持たなくて、これらの仕事はUDAが私達のために完成したので、ビジネスに関連するコードを実装するだけでいいです.
問題の引き出し
前に提供したデータ処理の流れをもう一度見てみましょう.
        AgileEAS.NETプラットフォームは2種類のデータ処理プロセスを提供して私達に選択するように提供して、2種類の方式の違いは応用開発者が接続の開閉を制御するかどうかで、第1種類の方式は応用開発者が接続の開閉を管理して、私達は彼の原生のデータアクセス方式と称して、第2種類の方式はデータベースの開閉がUDAオブジェクトによって自動的にコントロールされるので、彼を怠惰と呼びましょう.SQLを実行する前にUDAで接続を開き、SQLを実行した後にUDAで接続を閉じます.つまり、QuerとExecuteメソッドには、データベースの開閉操作が含まれています.
 
AgileEASに基づくNETプラットフォームのアプリケーション開発では、第2の方法を推奨していますが、同時に問題が発生しました.QueryメソッドはSQL文を実行した後に接続を閉じました.IDataReaderのようなオンラインに接続しなければならない戻りタイプでは、第2の方法ではサポートできません.また、トランザクションでは、1つのトランザクションに複数の文が含まれています.2つ目の方法の自動オン/オフ接続では、トランザクションはサポートされません.
解決方法
 
 
 
上記の問題に鑑みて、我々は2つの解決方法を提供した.第一に、オリジナルモードを使用してデータアクセスを処理する.もちろんこれは我々が推薦しない.第二に、UDAのIDataAccessorには2つの委託方法DelegateQuery、TransactionExecuteとそれに関連するリロードが提供され、DelegateQueryはDataReaderアクセス方式の委託クエリーを実現する.TransactionExecuteはトランザクション依頼を実装します.この2つの依頼方法とdelegate定義についてはAgileEASを参照してください.NETの統一データアクセス一文及びAgileEAS.NETベースクラスライブラリリファレンスマニュアル.
委任クエリの例
次に、委任クエリを使用して、前述のIDataReaderクエリの例を変更し、オリジナルのIDataReaderクエリを貼り付けます.
    /// 
    ///     IDataReader。
    /// 
    /// 
    /// IDataReader             ,             。
    /// 
    public void DemeGetDataReader()
    {
        IDataAccessor accessor = UdaContext.DataAccessor;
        accessor.DataConnection.Open();
        try
        {
            IDataReader reader = null;
            try
            {
                reader = accessor.QueryDataReader("Select top 30 * from dbo.product");
                //reader = (IDataReader)accessor.Query("Select top 30 from dbo.product",
                 ResultType.DataReader);  //  
                while (reader.Read())
                {
                    int count = reader.FieldCount;
                    for (int i = 0; i < count; i++)
                    {
                        System.Console.Write(string.Format("{0}={1}\t", reader.GetName(i), 
                        reader.IsDBNull(i) ? "null" : reader.GetValue(i)));
                    }
                    System.Console.Write("
"); } } finally { if (reader != null && !reader.IsClosed) reader.Close(); } } finally { accessor.DataConnection.Close(); } }

DelegateQueryを使用してこの方法を改造します.
    /// 
    ///       。
    /// 
    public void DemeDelegateQuery()
    {
        IDataAccessor accessor = UdaContext.DataAccessor;
        accessor.DelegateQuery(new DataReaderHandler(this.InternalGetDataReader), 
        "Select top 30 * from dbo.product");
    }
    /// 
    ///     。
    /// 
    /// 
    void InternalGetDataReader(IDataReader reader)
    {
        while (reader.Read())
        {
            int count = reader.FieldCount;
            for (int i = 0; i < count; i++)
            {
                System.Console.Write(string.Format("{0}={1}\t", reader.GetName(i), 
                reader.IsDBNull(i) ? "null" : reader.GetValue(i)));
            }
            System.Console.Write("
"); } }

この方法は簡潔な感じがしますか. 
本例に係るデータテーブル構造については、AgileEASに基づく.NETプラットフォームの基礎クラスライブラリは応用開発を行う-全体の説明とデータ定義の一文、データオブジェクトモデル定義ファイル、ドキュメント、DDLスクリプトについてダウンロードしてください:http://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本コードダウンロード:UDA.Demo2.rar.
 
リンク
AgileEAS.NETプラットフォーム開発ガイド-シリーズディレクトリ
AgileEAS.NETアプリケーション開発プラットフォーム紹介-記事インデックス
一歩一歩AgileEASの使い方を教えてあげますNETベースクラスライブラリによる応用開発-シリーズディレクトリ
AgileEAS.NETプラットフォーム応用開発チュートリアル-ケーススタディ
AgileEAS.NET公式サイト
敏捷ソフトウェアエンジニアリング実験室
QQ群:116773358