Skip to content

Tutorial_ASPNET_CSharp.ja

daisuke nishino edited this page Oct 17, 2018 · 3 revisions

Open 棟梁チュートリアル (ASP.NET アプリケーション (C#) 編)

2014年11月27日

はじめに

本ドキュメントの目的

本チュートリアルでの演習に沿ってサンプルプログラムを開発することで、Open 棟梁を用いた場合の開発の流れ・クラスの作成方法・各種定義ファイルの作成方法・ツールの使用方法・実行結果の確認方法等を習得することを目的としています。

本ドキュメントの対象

Open 棟梁を用いた ASP.NET アプリケーション開発を検討している SE・開発者

本ドキュメントの概要

本チュートリアルでは、Open 棟梁テンプレート・ベース (Visual Studio 2015 用) に付属のサンプルプログラムを題材とし、Open 棟梁を用いた場合の開発の流れを、順を追って説明します。

他社所有名称に対する表示

本ドキュメントに記載の会社名・商品名は、各社の商標または登録商標です。

ライセンス

本ドキュメントは、クリエイティブ・コモンズ CC BY 2.1 JP ライセンスの下で利用可能です。

目次

1. Open棟梁の概要

2. 環境設定

3. 本チュートリアルでの演習課題について

4. 演習

1. Open棟梁の概要

Open 棟梁は、.NET 用のアプリケーションフレームワークです。Open 棟梁は、.NET Framework 4.6 以上を対象に、C/S(Windows Forms, WPF)、Web(ASP.NET)、RIA(Silverlight) など、さまざまなアプリケーションで利用できます。

Open棟梁のクラス構成図を図 1-1 に示します。

図 1-1 Open棟梁のクラス構成図

本チュートリアルでは、図 1-1 のクラス構成図に従い、開発者が実装する画面クラス・業務ロジッククラス・DB アクセスクラスの作成方法を、順を追って説明します。

2. 環境設定

本チュートリアルでは、以下の環境を前提としています。

  • 開発環境
    • IDE
      • Visual Studio 2015 (Express Edition も利用できます)
    • アプリケーション フレームワーク
      • Open 棟梁テンプレート・ベース (Visual Studio 2015 用)
  • 実行環境
    • ランタイム
      • .NET Framework 4.6
    • Web サーバー
      • IIS Express
    • DB
      • SQL Server Express 2008 R2
  • その他
    • OS
      • Windows 7
    • 開発言語
      • C#
    • ブラウザ
      • Internet Explorer 11

あらかじめ、マイクロソフトのサイトなどを参考に、Visual Studio をインストールしておいてください。

次に、Open 棟梁テンプレート・ベース、データベースをセットアップします。

  1. GitHub で [Download ZIP] ボタンを押下して OpenTouryoTemplates.zip を入手し、これを解凍して Open 棟梁テンプレート・ベース (Visual Studio 2015 用) を取得します。

  2. root_VS2015 フォルダにある Readme.md の手順に従って、Open 棟梁テンプレート・ベースとサンプルデータベースのセットアップを行います。

3. 本チュートリアルでの演習課題について

本チュートリアルでは、Open 棟梁テンプレート・ベースに付属のサンプルプログラムに、画面・ロジックを追加する形で演習を行っていきます。サンプルプログラムの構成を図 3-1 に、チュートリアルの画面遷移図を図 3-2 に示します。

図 3-1 サンプルプログラムの構成

本チュートリアルでは、DB アクセスクラス (DAO: Data Access Object) として、以下に示す 3 種類のクラスを作成します。各クラスの詳細については、Open 棟梁の利用ガイド(ベターユース、FAQ 編)をご覧ください。

DB アクセスクラス 説明
自動生成 DAO Open 棟梁付属の D 層自動生成ツールにより生成する DAO クラス。テーブル・ビューに対する単純な CRUD 処理を行う場合に利用する。
共通 DAO Open 棟梁提供の DAO クラス。複数テーブルを結合した結果を取得する場合など、D 層自動生成ツールで自動生成できない処理を行う場合に利用する。
DAO 集約クラス D 層部分のファサードクラス。1 トランザクションで複数 DAO クラスを利用する場合に、B 層からのリクエストを集約させる場合に利用する。

図 3-2 サンプルプログラムの画面遷移図

4. 演習

Open 棟梁を用いた開発の流れを、順を追って説明します。

4.1 Visual Studio の起動

  1. C:\root\programs\C#\Samples\WebApp_sample\WebForms_Sample\WebForms_Sample.sln を開きます。

  2. Visual Studio が起動し、Open 棟梁テンプレート・ベース(Visual Studio 2015 用)に付属のサンプルプログラムが開かれていることを確認してください。

4.2 P層(画面デザイン)の作成

4.2.1 マスターページの作成

  1. Visual Studio のソリューション エクスプローラーで Aspx\Common フォルダを選択し、ツールバーの「プロジェクト(P)」-「新しい項目の追加(W)」を選択します。

  2. 「Web フォームのマスター ページ」を選択し、TouryoMaster.master という名前の、新しいマスターページを追加します。

  3. マスターページに、Open 棟梁が使用する JavaScript、hidden タグを定義するために、Aspx\Common\TestBlankScreen.master を参考に、以下のようにマスターページを実装します。

    <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="TouryoMaster.master.cs" Inherits="WebForms_Sample.Aspx.Common.TouryoMaster" %>
    
    <!-- All Rights Reserved, Copyright (C) 2007,2012 Hitachi Solutions,Ltd. -->
    <!DOCTYPE html>
    
    <html>
    <head id="Head1" runat="server">
        <title>無題のページ</title>
        <!--Uncomment below line when using jQuery-->
        <!--<script src="http://code.jquery.com/jquery-3.1.0.min.js"></script>-->
    
        <!--FxCode:add-start-->
        <script type="text/javascript" src="<%= this.ResolveClientUrl("~/Framework/js/common.js") %>"></script>
        <script type="text/javascript" src="<%= this.ResolveClientUrl("~/Framework/js/ie_key_event.js") %>"></script>
    
        <!-- Resolve URL in the javascript-->
        <script type="text/javascript">
                var baseUrl = "<%= ResolveUrl("~/") %>";
        </script>
    
        <!-- IE8をIE7互換モードで動作させる -->
        <!--meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /-->
    
        <link rel="stylesheet" href="<%= this.ResolveClientUrl("~/Css/style.css") %>" type="text/css"/>
        <!--FxCode:add-end-->
    </head>
    
    <!--FxCode:add-js-event-->
    <body onload="Fx_Document_OnLoad();" onunload="Fx_Document_OnClose();">
    
        <!-- オートコンプリートを指定 -->
        <form id="form1" runat="server" autocomplete="on">
            <!-- 共通ヘッダー -->
            <h1>Open 棟梁サンプル</h1>
    
            <!--SampleCode:add-start-->
    
            <a href="<%= this.ResolveUrl("~/Aspx/start/menu.aspx") %>">メニュー画面</a><br />
            <!--SampleCode:Contents-->
            <asp:contentplaceholder id="ContentPlaceHolder_A" runat="Server">
                    This is Default Content -- Override on Page
            </asp:contentplaceholder>
            <!--SampleCode:add-end-->
    
            <!--FxCode:add-start-->
            <asp:HiddenField ID="ChildScreenType" runat="server" Value="0" />
            <asp:HiddenField ID="ChildScreenUrl" runat="server" Value="0" />
            <asp:HiddenField ID="CloseFlag" runat="server" Value="0" />
            <asp:HiddenField ID="SubmitFlag" runat="server" Value="0" />
            <asp:HiddenField ID="ScreenGuid" runat="server" Value="0" />
            <asp:HiddenField ID="FxDialogStyle" runat="server" Value="0" />
            <asp:HiddenField ID="BusinessDialogStyle" runat="server" Value="0" />
            <asp:HiddenField ID="NormalScreenStyle" runat="server" Value="0" />
            <asp:HiddenField ID="NormalScreenTarget" runat="server" Value="0" />
            <asp:HiddenField ID="DialogFrameUrl" runat="server" Value="0" />
            <asp:HiddenField ID="WindowGuid" runat="server" Value="0" />
            <asp:HiddenField ID="RequestTicketGuid" runat="server" Value="0" />
            <!--FxCode:add-end-->
    
        </form>
    </body>
    </html>
  4. TouryoMaster.master を保存します。

    【注意】
    ここで、TouryoMaster.master を保存しておかないと、次項以降で Web フォームを作成する時に Visual Studio のデザイナでエラーが発生します。

4.2.2 注文情報一覧画面の作成

  1. Visual Studio のソリューション エクスプローラーで Aspx\sample フォルダを選択し、ツールバーの「プロジェクト(P)」-「新しい項目の追加(W)」を選択します。

  2. 「マスター ページを含む Web フォーム」を選択し、OrdersList.aspx という名前の、新しい Windows フォームを追加します。

  3. マスターページの選択ダイアログで、Aspx\Common\TouryoMaster.master を選択して、「OK」ボタンをクリックします。

  4. OrdersList.aspx に、GridView コントロールを追加し、ID を gvwOrdersList とします。

    【注意】コントロール名のプレフィックス (”gvw” など) を適切に設定しないと、Open 棟梁からコントロールが正しく認識されません。(詳しくは Open 棟梁の利用ガイド (共通編) をご覧ください)

  5. 「GridViewタスク」メニューの「列の編集…」を選択します。

  6. 使用できるフィールドから「ButtonField」を選択して「追加」ボタンをクリックします。

  7. ButtonField のプロパティを、以下のように設定します。

    • ButtonType: Button
    • Text: 選択
    • 上記以外はデフォルトのまま
  8. GridView に「選択」ボタンが追加されたことを確認します。

4.2.3 注文詳細情報画面の作成

  1. 4.2.2 項と同じように、Aspx\sample フォルダ以下に、注文の詳細情報を表示する Web フォームを作成します。ここでは、フォームの名前は OrderDetails.aspx としてください。

  2. OrderDetails.aspx に、以下の図のように Label コントロールを 2 つ、GridView コントロールを 2 つ、Button コントロールを 1 つ追加します。

    追加したコントロールには、それぞれ以下のようにプロパティを設定します。

    • Label (上部)
      • Text: 注文情報 (サマリ)
    • Label (下部)
      • Text: 注文情報 (明細)
    • GridView (上部)
      • ID: gvwOrderSummary
      • AutoGenerateEditButton: true
    • GridView (下部)
      • ID: gvwOrderDetails
      • AutoGenerateEditButton: true
    • Button
      • ID: btnUpdateOrder
      • Text: 修正内容を反映

4.2.4 ダイアログ画面に表示する PDF ファイルの設定

  1. Visual Studio のソリューション エクスプローラーで Aspx\sample フォルダを選択し、ツールバーの「プロジェクト(P)」-「既存項目の追加(W)」を選択します。

  2. 既存項目の追加ダイアログで、C:\root\files\resource\Test\test.pdf を選択し、「追加」ボタンをクリックします。

  3. Aspx\sample フォルダに、test.pdf ファイルが追加されたことを確認します。

4.2.5 メニュー画面の修正

  1. Visual Studio のソリューション エクスプローラーで、Aspx\start\menu.aspx ファイルを開きます。

  2. menu.aspx に以下のコードを挿入し、一覧画面に遷移させるための LinkButton (ID: lbnGetOrdersList)、ダイアログ画面を表示させるための LinkButton (ID: lbnShowDialog) をそれぞれ追加します。

    ・ チュートリアル<br />
      - <asp:LinkButton ID="lbnGetOrdersList" runat="server">注文情報の一覧を取得</asp:LinkButton>
    <br />
      - <asp:LinkButton ID="lbnShowDialog" runat="server">モーダルダイアログを表示</asp:LinkButton>
  3. menu.aspx のデザインビューで、追加したリンクボタンが表示されていることを確認します。

4.3 画面遷移に関する各種定義ファイルの設定

4.3.1 アプリケーション構成ファイル (app.config) の設定

  1. Visual Studio のソリューション エクスプローラーで、app.config ファイルを開きます。

  2. FxScreenTransitionMode の値を R に修正する。

    <!-- 画面遷移方法を指定(T:Transfer、R:Redirect、off) -->
    <add key="FxScreenTransitionMode" value="R"/>

4.3.2 画面遷移定義ファイル (SCDefinition.xml) の設定

Open 棟梁で画面遷移を制御する場合、画面遷移を SCDefinition.xml ファイルに定義します。

  1. C:\root\files\resource\Xml\SCDefinition.xml ファイルをメモ帳などで開きます。

  2. menu.aspx の定義を以下のように修正します。

    <Screen value="/WebForms_Sample/Aspx/start/menu.aspx" directLink="allow">
        <!-- 注文情報一覧画面への遷移を定義 -->
        <Transition value="/WebForms_Sample/Aspx/sample/OrdersList.aspx" label="List"/>
    </Screen>
  3. さらに、一覧画面・詳細画面を SCDefinition.xml に定義します。

    <!-- 注文情報一覧画面を定義 -->
    <Screen value="/WebForms_Sample/Aspx/sample/OrdersList.aspx" directLink="deny">
        <!-- 注文情報詳細画面への遷移を定義 -->
        <Transition value="/WebForms_Sample/Aspx/sample/OrderDetails.aspx" label="Detail"/>
    </Screen>
    
    <!-- 注文情報詳細画面を定義 -->
    <Screen value="/WebForms_Sample/Aspx/sample/OrderDetail.aspx" directLink="deny">
    </Screen>

    【注意】
    SCDefinition.xml の記述方法、および Open 棟梁の画面遷移機能の詳細については、Open 棟梁の利用ガイド (各機能編) をご覧ください。

4.4 引数クラス・戻り値クラスの作成

4.4.1 引数クラスの作成

  1. Visual Studio のソリューション エクスプローラーで AppCode\sample\Common フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。

  2. OrderParameterValue.cs という名前のクラスを追加します。

  3. 以下のコードを OrderParameterValue.cs に追加し、Open 棟梁が提供するクラスをインポートします。

    using Touryo.Infrastructure.Business.Util;
    using Touryo.Infrastructure.Business.Common;
  4. OrderParameterValue クラスの宣言部分を以下のように修正し、Open 棟梁の「引数親クラス 2」を継承させます。

    public class OrderParameterValue : MyParameterValue
  5. OrderParameterValue クラスのコンストラクタを以下のように修正します。

    public OrderParameterValue(string screenId, string controlId, string methodName, string actionType, MyUserInfo user) : base(screenId, controlId, methodName, actionType, user)
    {
    }
  6. 画面から業務ロジックに渡す値として、OrderParameterValue クラスに以下のフィールドを追加します。

    /// <summary>注文 ID</summary>
    public string OrderId;
    
    /// <summary>注文情報(サマリ)</summary>
    public System.Data.DataTable Orders;
    
    /// <summary>注文情報(明細)</summary>
    public System.Data.DataTable OrderDetails;

4.4.2 戻り値クラスの作成

  1. 4.4.1 項と同じように、AppCode\sample\Common フォルダに、OrderReturnValue.cs という名前のクラスを追加します。

  2. 以下のコードを OrderReturnValue.cs に追加し、Open 棟梁が提供するクラスをインポートします。

    using Touryo.Infrastructure.Business.Common;
  3. OrderReturnValue クラスの宣言部分を以下のように修正し、Open 棟梁の「戻り値親クラス 2」を継承させます。

    public class OrderReturnValue : MyReturnValue
  4. 画面に返す値として、OrderReturnValue クラスに以下のフィールドを追加します。

    /// <summary>注文情報(サマリ)</summary>
    public System.Data.DataTable Orders;
    
    /// <summary>注文情報(明細)</summary>
    public System.Data.DataTable OrderDetails;

4.5 D 層の作成

4.5.1 ツールによる自動生成

テーブル・ビューに対する単純な CRUD 処理を行うデータアクセスクラス、SQL ファイルについては、Open 棟梁付属の D 層自動生成ツールで自動生成が可能です。

  1. C:\root\programs\C#\Frameworks\DaoGen_Tool\bin\Debug\DaoGen_Tool.exe を実行し、D 層自動生成ツールを起動します。

  2. 以下のように値を設定し、「取得」ボタンをクリックします。

    • データプロバイダ: SQL Server Client
    • 接続文字列: Data Source=localhost\SQLExpress;Initial Catalog=Northwind;Integrated Security=true;
    • プルダウン: 概要情報
  3. 接続文字列等の情報に誤りがなければ、「DBMSのスキーマ情報の表示(概要情報)ダイアログ」が表示されます。

    本ダイアログが表示されたことを確認し、「閉じる」ボタンをクリックして、ダイアログを閉じます。

  4. 「テーブル一覧の取得」ボタンをクリックします。

    テーブル名称に関する注意を促すダイアログが表示されますが、「OK」ボタンをクリックして閉じてください。

  5. Northwind データベース内のテーブル/ビューがリストに表示されます。本チュートリアルでは Orders テーブルと Order Details テーブルのみ使用しますので、Orders テーブル、Order Details テーブル以外を選択して、「削除」ボタンをクリックします。

  6. リスト内の項目が、Orders テーブルと Order Details テーブルのみになったことを確認し、「ロード」ボタンをクリックします。

  7. 「D層定義情報を生成」ボタンが活性化されますので、出力エンコーディングとして「utf-8」を選択し、「D層定義情報を生成」ボタンをクリックします。

    D 層定義情報ファイルの保存ダイアログが表示されますので、C:\root\Info.csv にファイルを保存します。

  8. D 層定義情報ファイルが正常に生成できたことを示すダイアログが表示されますので、「OK」ボタンをクリックして閉じます。

  9. 「STEP2へ遷移」ボタンをクリックします。

  10. 「ステップ2」画面が表示されますので、以下のように値を設定し、「プログラムを生成する」ボタンをクリックします。

    • D 層定義情報ファイル: C:\root\Info.csv
    • ソーステンプレートフォルダ: C:\root\files\tools\DGenTemplates
    • 出力ファイル: C:\root
    • 上記以外はデフォルトのまま
  11. Dao、SQL ファイルが正常に生成できたことを示すダイアログが表示されますので、「OK」ボタンをクリックして閉じます。

  12. C:\root フォルダ以下に、Dao ファイル、SQL ファイルが生成されていることを確認します。

    【注意】Open 棟梁では、SQL ファイルとして、拡張子が .sql のファイルと、.xml のファイルがある。(詳しくは Open 棟梁の説明書をご覧ください)

  13. 自動生成した Dao クラスをサンプルプログラムに含めるため、Visual Studio でサンプルプログラムを開き、AppCode\sample\Dao フォルダを選択し、ツールバーの「プロジェクト(P)」-「既存の項目の追加(G)」を選択します。

  14. 既存項目の追加ダイアログで、C:\root\DaoOrders.csC:\root\DaoOrder_Details.cs ファイルを選択し、「追加(A)」ボタンをクリックします。

  15. C:\root フォルダ直下に生成された SQL ファイル・XML ファイルを、C:\root\files\resource\Sql フォルダに移動します。

  16. D 層自動生成ツールを終了します。

4.5.2 SQL ファイルの作成

D 層自動生成ツールでは、単純な CRUD 処理を行う Dao クラスや SQL ファイルを生成できます。しかし、複数のテーブルを結合 (JOIN) させる SQL など、単純な CRUD 処理ではない SQL は、個別に作成する必要があります。

  1. C:\root\files\resource\Sql フォルダに、SelectOrders.sql ファイルを作成します。

  2. SelectOrders.sql に、以下の SQL 文を記述します。

    SELECT
        Orders.OrderID, Customers.CompanyName, Customers.ContactName, Employees.LastName As EmployeeLastName, Employees.FirstName As EmployeeFirstName, Orders.OrderDate
    FROM
        Orders
            INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
            INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID

4.5.3 DAO 集約クラスの作成

本チュートリアルでは、以下の 3 つの Dao クラスを使用します。

  • DaoOrders
    • Orders テーブルへのアクセス用
  • DaoOrder_Details
    • Order Details テーブルへのアクセス用
  • CmnDao (Open 棟梁の共通 Dao)
    • 4.5.2 項で作成した SQL ファイルを使用したアクセス用

これらの Dao クラスの呼び出しを制御し、業務ロジッククラス (B 層クラス) に対する窓口 (ファサード) となる、DAO 集約クラスを作成します。

  1. Visual Studio のソリューション エクスプローラーで、AppCode\sample\Dao フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。

  2. ConsolidatedLayerD.cs という名前のクラスを追加します。

  3. 以下のコードを ConsolidatedLayerD.cs に追加し、Open 棟梁が提供するクラスをインポートします。

    //    Open棟梁
    using Touryo.Infrastructure.Business.Dao;
    using Touryo.Infrastructure.Public.Db;
    
    // 引数・戻り値クラス
    using WebForms_Sample.AppCode.sample.Common;
  4. ConsolidatedLayerD クラスの宣言部分を以下のように修正し、Open 棟梁の「DAO 集約親クラス」を継承させます。

    public class ConsolidatedLayerD : BaseConsolidateDao
  5. ConsolidatedLayerD クラスに、以下のようにコンストラクタを作成します。

    public ConsolidatedLayerD(BaseDam dam) : base(dam) { }
  6. ConsolidatedLayerD クラスに、注文情報一覧を取得する GetOrders メソッドを作成します。

    public OrderReturnValue GetOrders(OrderParameterValue orderParameter)
    {
        // 戻り値クラスを作成する
        OrderReturnValue returnValue = new OrderReturnValue();
    
        // 共通 DAO を作成する (SQL ファイルとして、4.5.2 項で作成したファイルを使用する)
        CmnDao dao = new CmnDao(this.Dam);
        dao.SQLFileName = "SelectOrders.sql";
    
        // 結果格納用の DataTable
        System.Data.DataTable table = new System.Data.DataTable();
    
        // DB から注文情報一覧を取得し、DataTable に格納する
        dao.ExecSelectFill_DT(table);
    
        // 戻り値クラスに注文情報一覧を格納し、B 層クラスに返す
        returnValue.Orders = table;
        return returnValue;
    }
  7. 同様に、注文 ID をもとに、注文情報の詳細を取得する GetOrderById メソッドを作成します。

    public OrderReturnValue GetOrderById(OrderParameterValue orderParameter)
    {
        // 戻り値クラスを作成する
        OrderReturnValue returnValue = new OrderReturnValue();
    
        // 自動生成した D 層クラスのインスタンスを生成する
        DaoOrders orderDao = new DaoOrders(this.Dam);
        DaoOrder_Details orderDetailsDao = new DaoOrder_Details(this.Dam);
    
        // 注文情報、注文詳細情報を格納するための DataTable
        System.Data.DataTable orderTable = new System.Data.DataTable();
        System.Data.DataTable orderDetailsTable = new System.Data.DataTable();
    
        // パラメータを設定する
        orderDao.PK_OrderID = orderParameter.OrderId;
        orderDetailsDao.PK_OrderID = orderParameter.OrderId;
    
        // 注文 ID をもとに注文情報を検索する
        orderDao.D2_Select(orderTable);
        orderDetailsDao.D2_Select(orderDetailsTable);
    
        // 戻り値クラスに結果セットを格納し、B 層クラスに返す
        returnValue.Orders = orderTable;
        returnValue.OrderDetails = orderDetailsTable;
        return returnValue;
    }
  8. 同様に、画面で入力した注文情報を DB に反映する UpdateOrder メソッドを作成します。

    public OrderReturnValue UpdateOrder(OrderParameterValue orderParameter)
    {
        // 戻り値クラスを作成する
        OrderReturnValue returnValue = new OrderReturnValue();
    
        // 自動生成した D 層クラスのインスタンスを生成する
        DaoOrders orderDao = new DaoOrders(this.Dam);
        DaoOrder_Details orderDetailsDao = new DaoOrder_Details(this.Dam);
    
        // 注文情報、注文詳細情報を格納するための DataTable
        System.Data.DataTable orderTable = orderParameter.Orders;
        System.Data.DataTable orderDetailsTable = orderParameter.OrderDetails;
    
        // レコードの状態を確認し、修正されていたら DB を更新する
        if (orderTable.Rows[0].RowState == System.Data.DataRowState.Modified)
        {
            // 注文情報(サマリ)更新用のパタメータを設定する
            orderDao.PK_OrderID = orderTable.Rows[0]["OrderId"];
            orderDao.Set_OrderDate_forUPD = orderTable.Rows[0]["OrderDate"];
            orderDao.Set_RequiredDate_forUPD = orderTable.Rows[0]["RequiredDate"];
            orderDao.Set_ShippedDate_forUPD = orderTable.Rows[0]["ShippedDate"];
            orderDao.Set_ShipVia_forUPD = orderTable.Rows[0]["ShipVia"];
            orderDao.Set_Freight_forUPD = orderTable.Rows[0]["Freight"];
            orderDao.Set_ShipName_forUPD = orderTable.Rows[0]["ShipName"];
            orderDao.Set_ShipAddress_forUPD = orderTable.Rows[0]["ShipAddress"];
            orderDao.Set_ShipCity_forUPD = orderTable.Rows[0]["ShipCity"];
            orderDao.Set_ShipRegion_forUPD = orderTable.Rows[0]["ShipRegion"];
            orderDao.Set_ShipPostalCode_forUPD = orderTable.Rows[0]["ShipPostalCode"];
            orderDao.Set_ShipCountry_forUPD = orderTable.Rows[0]["ShipCountry"];
    
            // 注文情報(サマリ)を更新する
            orderDao.D3_Update();
        }
    
        foreach (System.Data.DataRow row in orderDetailsTable.Rows)
        {
            // レコードの状態を確認し、修正されていたら DB を更新する
            if (row.RowState == System.Data.DataRowState.Modified)
            {
                // 注文情報(明細)更新用のパラメータを設定する
                orderDetailsDao.PK_OrderID = row["OrderId"];
                orderDetailsDao.PK_ProductID = row["ProductId"];
                orderDetailsDao.Set_UnitPrice_forUPD = row["UnitPrice"];
                orderDetailsDao.Set_Quantity_forUPD = row["Quantity"];
                orderDetailsDao.Set_Discount_forUPD = row["Discount"];
    
                // 注文情報(明細)を更新する
                orderDetailsDao.D3_Update();
            }
        }
    
        // 戻り値クラスをB層クラスに返す(更新処理のため、戻り値はなし)
        return returnValue;
    }

4.6 B層の作成

  1. Visual Studio のソリューション エクスプローラーで、AppCode\sample\Business フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。

  2. OrdersLogic.cs という名前のクラスを追加します。

  3. 以下のコードを OrdersLogic.cs に追加し、Open 棟梁が提供するクラス、引数・戻り値クラス、D 層クラスをインポートします。

    // 業務フレームワーク
    using Touryo.Infrastructure.Business.Business;
    using Touryo.Infrastructure.Business.Common;
    using Touryo.Infrastructure.Business.Dao;
    using Touryo.Infrastructure.Business.Exceptions;
    using Touryo.Infrastructure.Business.Presentation;
    using Touryo.Infrastructure.Business.Util;
    using Touryo.Infrastructure.Business.RichClient.Asynchronous;
    using Touryo.Infrastructure.Business.RichClient.Business;
    using Touryo.Infrastructure.Business.RichClient.Presentation;
    
    // フレームワーク
    using Touryo.Infrastructure.Framework.Business;
    using Touryo.Infrastructure.Framework.Common;
    using Touryo.Infrastructure.Framework.Dao;
    using Touryo.Infrastructure.Framework.Exceptions;
    using Touryo.Infrastructure.Framework.Presentation;
    using Touryo.Infrastructure.Framework.Util;
    using Touryo.Infrastructure.Framework.Transmission;
    using Touryo.Infrastructure.Framework.RichClient.Presentation;
    
    // 部品
    using Touryo.Infrastructure.Public.Db;
    using Touryo.Infrastructure.Public.IO;
    using Touryo.Infrastructure.Public.Log;
    using Touryo.Infrastructure.Public.Str;
    using Touryo.Infrastructure.Public.Util;
    
    // 引数・戻り値クラス
    using WebForms_Sample.AppCode.sample.Common;
    
    // DAO クラス
    using WebForms_Sample.AppCode.sample.Dao;
  4. OrdersLogic クラス宣言部分を以下のように修正し、Open 棟梁の「業務親クラス 2」を継承させます。

    public class OrdersLogic : MyFcBaseLogic
  5. OrdersLogic クラスに、注文情報一覧取得用の UOC_GetOrders メソッド・注文 ID をもとに注文情報の詳細を取得するための UOC_GetOrderById メソッド・注文情報更新用の UOC_UpdateOrder メソッドを作成します。ただし、DAO クラスの呼び出しは DAO 集約クラスが行いますので、B 層クラスは、P 層クラスと DAO 集約クラスの中継のみを行います。

    private void UOC_GetOrders(OrderParameterValue orderParameter)
    {
        // DAO 集約クラスを生成する
        ConsolidatedLayerD facade = new ConsolidatedLayerD(this.GetDam());
    
        // 注文情報一覧を取得する
        OrderReturnValue returnValue = facade.GetOrders(orderParameter);
    
        // 戻り値クラスを返す
        this.ReturnValue = returnValue;
    }
    
    private void UOC_GetOrderById(OrderParameterValue orderParameter)
    {
        // DAO 集約クラスを生成する
        ConsolidatedLayerD facade = new ConsolidatedLayerD(this.GetDam());
    
        // 注文情報の詳細を取得する
        OrderReturnValue returnValue = facade.GetOrderById(orderParameter);
    
        // 戻り値クラスを返す
        this.ReturnValue = returnValue;
    }
    
    private void UOC_UpdateOrder(OrderParameterValue orderParameter)
    {
        // DAO 集約クラスを生成する
        ConsolidatedLayerD facade = new ConsolidatedLayerD(this.GetDam());
    
        // 注文情報をDBに登録する
        OrderReturnValue returnValue = facade.UpdateOrder(orderParameter);
    
        // 戻り値クラスを返す
        this.ReturnValue = returnValue;
    }

    【注意】Open 棟梁の「業務親クラス 2」である MyFcBaseLogic クラスを継承した B 層クラスでは、P 層から呼び出されるメソッド名は UOC_xx (xx は任意) とする必要があります。P 層から ”xx” の部分をパラメータとして渡すことで、Open 棟梁により UOC_xx メソッドに処理が振り分けられます。(後述)

4.7 P層(画面コードクラス)の作成

4.7.1 マスターページの画面コードクラス (TouryoMaster.master.cs) の作成

  1. Visual Studio のソリューション エクスプローラーで、Aspx\Common\TouryoMaster.master.cs ファイルを開きます。

  2. 以下のコードを TouryoMaster.master.cs に追加し、Open 棟梁の名前空間をインポートします。

    using Touryo.Infrastructure.Framework.Presentation;
  3. クラス宣言部分を以下のように修正し、Open 棟梁の「マスターページ親クラス」を継承させます。

    public partial class TouryoMaster : BaseMasterController

    【注意】
    Open 棟梁は、マスターページ・コンテンツページ内のコントロール取得用のユーティリティメソッドを提供しています。この時、マスターページが「マスターページ親クラス」を継承していないと正常にコントロールを取得できなくなります。このため、このユーティリティ メソッドを利用する場合は、「マスターページ親クラス」を継承させる必要があります。(詳しくは Open 棟梁の利用ガイド (纏め者編) をご覧ください)

4.7.2 メニュー画面の画面コードクラス (menu.aspx.cs) の作成

  1. Visual Studio のソリューション エクスプローラーで、Aspx\start\menu.aspx.cs ファイルを開きます。

  2. menu.aspx.cs に、4.2.5 項で追加した LinkButton の Click イベントに対するハンドラメソッドを追加します。

    protected string UOC_lbnGetOrdersList_Click(FxEventArgs eventArgs)
    {
        // SCDefinitions.xml に定義したラベルをもとに画面遷移を行う
        return "List";
    }
    
    protected string UOC_lbnShowDialog_Click(FxEventArgs eventArgs)
    {
        // ダイアログを表示する
        this.ShowNormalScreen("/WebForms_Sample/Aspx/sample/test.pdf");
    
        // 空文字を返す
        return string.Empty;
    }

    【注意】
    Open 棟梁を用いた場合、Button などのコントロールへのイベントハンドラは、上述のように UOC_[コントロール名]_[イベント名] という名前のメソッドで定義します。(詳しくは Open 棟梁の利用ガイド (共通編) をご覧ください)

4.7.3 注文情報一覧画面の画面コードクラス (OrdersList.aspx.cs) の作成

  1. Visual Studio のソリューション エクスプローラーで、Aspx\sample\OrdersList.aspx.cs ファイルを開きます。

  2. 以下のコードを OrdersList.aspx.cs に追加し、Open 棟梁の名前空間をインポートします。

    // 業務フレームワーク
    using Touryo.Infrastructure.Business.Business;
    using Touryo.Infrastructure.Business.Common;
    using Touryo.Infrastructure.Business.Dao;
    using Touryo.Infrastructure.Business.Exceptions;
    using Touryo.Infrastructure.Business.Presentation;
    using Touryo.Infrastructure.Business.Util;
    
    // フレームワーク
    using Touryo.Infrastructure.Framework.Business;
    using Touryo.Infrastructure.Framework.Common;
    using Touryo.Infrastructure.Framework.Dao;
    using Touryo.Infrastructure.Framework.Exceptions;
    using Touryo.Infrastructure.Framework.Presentation;
    using Touryo.Infrastructure.Framework.Util;
    using Touryo.Infrastructure.Framework.Transmission;
    
    // 部品
    using Touryo.Infrastructure.Public.Db;
    using Touryo.Infrastructure.Public.IO;
    using Touryo.Infrastructure.Public.Log;
    using Touryo.Infrastructure.Public.Str;
    using Touryo.Infrastructure.Public.Util;
    
    // B 層クラス
    using WebForms_Sample.AppCode.sample.Business;
    
    // 引数・戻り値クラス
    using WebForms_Sample.AppCode.sample.Common;
  3. クラス宣言部分を以下のように修正し、Open 棟梁の「画面親クラス 2」を継承させます。

    public partial class OrdersList : MyBaseController
  4. 電球マークをクリックし、「抽象クラスの実装」を選択します。

  5. 自動生成された Page_Load メソッドを削除します。

  6. 画面ロード時に注文情報の一覧を取得するため、以下のように UOC_FormInit メソッドをオーバーライドします。なお、ポストバック時の処理はないため、UOC_FormInit_PostBack メソッドから throw new NotImplementedException(); を削除し、空の状態にする。

    protected override void UOC_FormInit()
    {
        // 引数クラスを生成
        // (F層クラスでUOC_GetOrdersメソッドを呼び出すように、パラメータとして"GetOrders"を渡す)
        OrderParameterValue param = new OrderParameterValue(this.ContentPageFileNoEx, "", "GetOrders", "SQL", this.UserInfo);
    
        // 戻り値クラスを生成
        OrderReturnValue returnValue;
    
        // B層呼出し
        OrdersLogic logic = new OrdersLogic();
        returnValue = (OrderReturnValue)logic.DoBusinessLogic(param);
    
        // 結果をGridViewに表示
        this.gvwOrdersList.DataSource = returnValue.Orders;
        this.gvwOrdersList.DataBind();
    }
    
    protected override void UOC_FormInit_PostBack()
    {
    }
  7. GridView の各行のボタンをクリックしたときに、注文情報詳細画面に遷移するためのメソッドを OrdersList.aspx.cs に追加する。

    protected string UOC_gvwOrdersList_RowCommand(FxEventArgs eventArgs)
    {
        // 選択された行のインデックスを取得する
        int RowIndex = int.Parse(eventArgs.PostBackValue);
    
        // GridViewから、選択された行のOrderIdを取得する
        string OrderId = this.gvwOrdersList.Rows[RowIndex].Cells[1].Text;
    
        // OrderIdをセッションに格納する
        Session["OrderId"] = OrderId;
    
        // SCDefinitions.xml に定義したラベルをもとに画面遷移を行う
        return "Detail";
    }

4.7.4 注文情報詳細画面の画面コードクラス (OrderDetails.aspx.cs) の作成

  1. Visual Studio のソリューション エクスプローラーで、Aspx\sample\OrderDetails.aspx.cs ファイルを開きます。

  2. 4.7.3 項と同じように、OrderDetails.aspx.cs についても、Open 棟梁の「画面親クラス 2」を継承させ、UOC_FormInit メソッド、UOC_FormInit_PostBack メソッドを作成します。

  3. 自動生成された Page_Load メソッドを削除します。

  4. 画面ロード時に OrderId を元に注文の詳細情報を取得するよう、以下のように UOC_FormInit メソッドをオーバーライドします。なお、ポストバック時の処理はないため、UOC_FormInit_PostBack メソッドから throw new NotImplementedException(); を削除し、空の状態にします。

    protected override void UOC_FormInit()
    {
        // セッションから、OrderIdの値を取得
        string OrderId = Session["OrderId"].ToString();
    
        // 引数クラスを生成
        // (F層クラスでUOC_GetOrderByIdメソッドを呼び出すように、パラメータとして"GetOrderById"を渡す)
        OrderParameterValue param = new OrderParameterValue(this.ContentPageFileNoEx, "", "GetOrderById", "SQL", this.UserInfo);
    
        // 検索条件としてOrderIdを渡す
        param.OrderId = OrderId;
    
        // 戻り値クラスを生成
        OrderReturnValue returnValue;
    
        // B層呼出し
        OrdersLogic logic = new OrdersLogic();
        returnValue = (OrderReturnValue)logic.DoBusinessLogic((BaseParameterValue)param);
    
        // 注文情報をセッションに格納する
        Session["Orders"] = returnValue.Orders;
        Session["OrderDetails"] = returnValue.OrderDetails;
    
        // 結果をグリッドに表示
        this.gvwOrderSummary.DataSource = returnValue.Orders;
        this.gvwOrderSummary.DataBind();
        this.gvwOrderDetails.DataSource = returnValue.OrderDetails;
        this.gvwOrderDetails.DataBind();
    }
    
    protected override void UOC_FormInit_PostBack()
    {
    }
  5. Visual Studio のソリューション エクスプローラーで、Aspx\sample\OrderDetails.aspx ファイルを開きます。

  6. 注文情報 (サマリ) を表示するための gvwOrderSummary コントロールを選択し、プロパティウィンドウの「イベント」アイコンをクリックします。

  7. イベントの一覧から、RowEditing RowCancelingEdit イベントをダブルクリックします。

  8. OrderDetails.aspx.csgvwOrderSummary_RowEditing メソッド、gvwOrderSummary_RowCancelingEdit メソッドが生成されますので、以下のように実装します。

    protected void gvwOrderSummary_RowEditing(object sender, GridViewEditEventArgs e)
    {
        // 注文情報(サマリ)を編集モードに切り替える
        this.gvwOrderSummary.EditIndex = e.NewEditIndex;
        this.gvwOrderSummary.DataSource = (System.Data.DataTable)Session["Orders"];
        this.gvwOrderSummary.DataBind();
    
        // 主キー、外部キー列は編集不可とする
        ((TextBox)this.gvwOrderSummary.Rows[e.NewEditIndex].Cells[1].Controls[0]).Enabled = false;
        ((TextBox)this.gvwOrderSummary.Rows[e.NewEditIndex].Cells[2].Controls[0]).Enabled = false;
        ((TextBox)this.gvwOrderSummary.Rows[e.NewEditIndex].Cells[3].Controls[0]).Enabled = false;
    }
    
    protected void gvwOrderSummary_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        // 注文情報(サマリ)を読み取り専用モードに切り替える
        this.gvwOrderSummary.EditIndex = -1;
        this.gvwOrderSummary.DataSource = (System.Data.DataTable)Session["Orders"];
        this.gvwOrderSummary.DataBind();
    }

    【注意】
    Open 棟梁の P 層イベント処理機能は、GridView コントロールの RowEditing イベント、RowCancelingEdit イベントをサポートしていません。このため、これらのイベントについては、.NET 標準のイベントハンドラ機能を使用します。この時、Open 棟梁によるフロー制御機能 (イベント前処理・後処理制御、例外処理制御) が利用できません。これらのイベントについても、Open 棟梁のフロー制御機能を利用したい場合は、「画面親クラス 1」または「画面親クラス 2」のカスタマイズが必要になります。(詳しくは Open 棟梁の利用ガイド (共通編) をご覧ください)

  9. 注文情報 (サマリ) の修正内容を保存するためのメソッドを OrderDetails.aspx.cs に追加します。

    protected string UOC_gvwOrderSummary_RowUpdating(FxEventArgs eventArgs, GridViewUpdateEventArgs e)
    {
        // 注文情報(サマリ)の修正内容を保存する
        System.Data.DataTable Orders = (System.Data.DataTable)Session["Orders"];
        foreach (string key in e.NewValues.Keys)
        {
            Orders.Rows[0][key] = e.NewValues[key];
        }
    
        // 注文情報(サマリ)を読み取り専用モードに切り替える
        this.gvwOrderSummary.EditIndex = -1;
        this.gvwOrderSummary.DataSource = (System.Data.DataTable)Session["Orders"];
        this.gvwOrderSummary.DataBind();
    
        // 空文字を返す (画面遷移しない)
        return string.Empty;
    }
  10. 同様に、注文情報 (明細) を表示するための gvwOrderDetails コントロールについても、RowEditing イベント、RowCancelingEdit イベント、UOC_gvwOrderDetails_RowUpdating メソッドを追加し、それぞれ以下のように実装します。

    protected void gvwOrderDetails_RowEditing(object sender, GridViewEditEventArgs e)
    {
        // 注文情報(明細)を編集モードに切り替える
        this.gvwOrderDetails.EditIndex = e.NewEditIndex;
        this.gvwOrderDetails.DataSource = (System.Data.DataTable)Session["OrderDetails"];
        this.gvwOrderDetails.DataBind();
    
        // 主キー、外部キー列は編集不可とする
        ((TextBox)this.gvwOrderDetails.Rows[e.NewEditIndex].Cells[1].Controls[0]).Enabled = false;
        ((TextBox)this.gvwOrderDetails.Rows[e.NewEditIndex].Cells[2].Controls[0]).Enabled = false;
    }
    
    protected void gvwOrderDetails_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        // 注文情報(明細)を読み取り専用モードに切り替える
        this.gvwOrderDetails.EditIndex = -1;
        this.gvwOrderDetails.DataSource = (System.Data.DataTable)Session["OrderDetails"];
        this.gvwOrderDetails.DataBind();
    }
    
    protected string UOC_gvwOrderDetails_RowUpdating(FxEventArgs eventArgs, GridViewUpdateEventArgs e)
    {
        // 編集した値で注文情報(サマリ)を更新する
        System.Data.DataTable OrderDetails = (System.Data.DataTable)Session["OrderDetails"];
        foreach (string key in e.NewValues.Keys)
        {
            OrderDetails.Rows[e.RowIndex][key] = e.NewValues[key];
        }
    
        // 注文情報(明細)を読み取り専用モードに切り替える
        this.gvwOrderDetails.EditIndex = -1;
        this.gvwOrderDetails.DataSource = (System.Data.DataTable)Session["OrderDetails"];
        this.gvwOrderDetails.DataBind();
    
        // 空文字を返す (画面遷移しない)
        return string.Empty;
    }
  11. 修正内容を DB に反映させるためのメソッドを OrderDetails.aspx.cs に追加する。

    protected string UOC_btnUpdateOrder_Click(FxEventArgs eventArgs)
    {
        // グリッドの値をセッションから取得する
        System.Data.DataTable orderTable = (System.Data.DataTable)Session["Orders"];
        System.Data.DataTable orderDetailTable = (System.Data.DataTable)Session["OrderDetails"];
    
        // 引数クラスを生成
        OrderParameterValue param = new OrderParameterValue(this.Title, "", "UpdateOrder", "SQL", this.UserInfo);
    
        // 業務ロジックに引数としてグリッドの値を渡す
        param.Orders = orderTable;
        param.OrderDetails = orderDetailTable;
    
        // 戻り値クラスを生成
        OrderReturnValue returnValue;
    
        // B層呼出し
        OrdersLogic logic = new OrdersLogic();
        returnValue = (OrderReturnValue)logic.DoBusinessLogic(param);
    
        // 空文字を返す (画面遷移しない)
        return string.Empty;
    }

4.8 その他

4.8.1 アプリケーション構成ファイル (Web.config) の設定内容の確認

  1. Visual Studio のソリューション エクスプローラーで、web.config ファイルを開きます。

  2. connectionStrings セクションを確認し、"ConnectionString_SQL" という名前の接続文字列設定が、Northwind データベースを指していることを確認します。

    <connectionStrings>
        <!-- SQL Server / SQL Client用 -->
        <add name="ConnectionString_SQL" connectionString="Data Source=localhost\sqlexpress;Initial Catalog=Northwind;Integrated Security=True;"/>
    </connectionStrings>

4.9 動作確認

4.9.1 ASP.NET 状態サービスの開始

  1. スタートメニューの「プログラムとファイルの検索」ボックスで services.msc を実行します。

  2. サービス画面から「ASP.NET 状態サービス」を右クリックし、「開始」を選択します。

  3. 「ASP.NET 状態サービス」の状態が「開始」になったことを確認します。

4.9.2 イントラネット セキュリティ設定の変更

  1. スタートメニューの「プログラムとファイルの検索」ボックスで inetcpl.cpl を実行します。

  2. インターネットのプロパティダイアログで、「セキュリティ」タブを選択します。表示されたゾーンの中で、「ローカル イントラネット」を選択し、「サイト」ボタンをクリックします。

  3. ローカル イントラネットダイアログで、以下のように設定し、「OK」ボタンを押下クリックします。

    • イントラネットのネットワークを自動的に検出する: チェックなし
    • 上記以外: チェックあり
  4. 「OK」ボタンをクリックし、インターネット オプションダイアログを閉じます。

4.9.3 Visual Studio によるデバッグ実行

  1. Visual Studio のソリューション エクスプローラーで、Aspx\start\menu.aspx を右クリックし、「スタート ページに設定」を選択します。

  2. Visual Studio でサンプルプログラムをデバッグ実行します。

  3. ブラウザが起動し、ログイン画面が表示されますので、以下のように値を入力し、「ログイン」ボタンを押下します。

    • ユーザID: 空でない任意の文字列
    • パスワード: 任意の文字列 (空でもよい)
  4. メニュー画面が表示されるので、「注文情報の一覧を取得」リンクを押下します。

  5. OrdersList.aspx に遷移し、注文情報の一覧が表示されることを確認し、任意の行の「選択」ボタンを押下します。

  6. OrderDetails.aspx に遷移し、注文情報の詳細が表示されることを確認し、修正したい行の「編集」リンクをクリックします。

  7. 「編集」リンクをクリックした行が編集モードになりますので、任意の値に修正します。修正が完了したら、「更新」リンクをクリックして修正内容を保存します。

  8. 「修正内容を反映」ボタンを押下して、修正した内容を DB に反映させます。

  9. 以下のコマンドを実行し、修正した内容で DB の値が更新されていることを確認します。なお、以下のコマンドの中で【選択した注文番号】の箇所は、先ほど選択した注文番号 (OrderID) に置き換えてください。

    "C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S localhost\SQLExpress -E -d Northwind -Q "Select * From Orders Inner Join [Order Details] On Orders.OrderId=[Order Details].OrderId Where Orders.OrderId=【選択した注文番号】"
  10. 「メニュー画面」リンクをクリックして、メニュー画面に戻ります。

  11. 「モーダルダイアログを表示」リンクをクリックします。

  12. ダイアログ画面上で PDF ファイルが表示されることを確認し、ダイアログを閉じます。

  13. ブラウザのアドレスバーに http://localhost:9999/WebForms_Sample/Aspx/sample/OrdersList.aspx と入力し、実行します。

  14. Open 棟梁のエラーメッセージが表示されることを確認します。

    【注意】
    このエラーメッセージは、OrdersList.aspx に対する Get メソッドでの画面遷移が許可されていないことを示している。これは、4.3.2 項で注文情報一覧画面・詳細画面を SCDefinitions.xml に定義したとき、directLink=”deny” と定義したためです。(詳しくは Open 棟梁の利用ガイド (各機能編) をご覧ください)

4.9.4 トレースログの確認

  1. C:\root\files\resource\Log\ACCESS.yyyy-mm-dd.log をメモ帳などで開きます。(yyyy-mm-dd には、実行日付が入ります)

  2. 各画面へのアクセスがトレースログとして記録されていることを確認します。(以下はトレースログを抜粋したものです。OrderList 画面、OrderDetails 画面がそれぞれトレースされていることが分かります)

    [2017/04/10 11:36:32,663],[DEBUG],[5],,-,127.0.0.1,-----↓,Global.asax,Application_OnPreRequest
    [2017/04/10 11:36:32,664],[INFO ],[5],,user01,127.0.0.1,init,OrdersList
    [2017/04/10 11:36:32,670],[INFO ],[5],,user01,127.0.0.1,----->>,OrdersList,,GetOrders,
    [2017/04/10 11:36:32,892],[INFO ],[5],,user01,127.0.0.1,<<-----,OrdersList,,GetOrders,,221,0
    [2017/04/10 11:36:32,935],[DEBUG],[5],,-,127.0.0.1,-----↑,Global.asax,Application_OnPostRequest,-,-,271,63
    [2017/04/10 11:36:46,756],[DEBUG],[18],,-,127.0.0.1,-----↓,Global.asax,Application_OnPreRequest
    [2017/04/10 11:36:46,814],[INFO ],[18],,user01,127.0.0.1,postback,OrdersList
    [2017/04/10 11:36:46,815],[INFO ],[18],,user01,127.0.0.1,----->,OrdersList,gvwOrdersList
    [2017/04/10 11:36:46,816],[INFO ],[18],,user01,127.0.0.1,<-----,OrdersList,gvwOrdersList,,1,0
    [2017/04/10 11:36:46,912],[DEBUG],[17],,-,127.0.0.1,-----↓,Global.asax,Application_OnPreRequest
    [2017/04/10 11:36:46,914],[INFO ],[17],,user01,127.0.0.1,init,OrderDetails
    [2017/04/10 11:36:46,914],[INFO ],[17],,user01,127.0.0.1,----->>,OrderDetails,,GetOrderById,
    [2017/04/10 11:36:47,044],[INFO ],[17],,user01,127.0.0.1,<<-----,OrderDetails,,GetOrderById,,129,0
    [2017/04/10 11:36:47,055],[DEBUG],[17],,-,127.0.0.1,-----↑,Global.asax,Application_OnPostRequest,-,-,142,0
    [2017/04/10 11:36:50,343],[DEBUG],[5],,-,127.0.0.1,-----↓,Global.asax,Application_OnPreRequest
    [2017/04/10 11:36:50,344],[INFO ],[5],,user01,127.0.0.1,postback,OrderDetails
    [2017/04/10 11:36:50,345],[INFO ],[5],,user01,127.0.0.1,----->,OrderDetails,gvwOrderDetails
    [2017/04/10 11:36:50,345],[INFO ],[5],,user01,127.0.0.1,<-----,OrderDetails,gvwOrderDetails,,0,0
    [2017/04/10 11:36:50,350],[DEBUG],[5],,-,127.0.0.1,-----↑,Global.asax,Application_OnPostRequest,-,-,4,0
    [2017/04/10 11:36:55,690],[DEBUG],[5],,-,127.0.0.1,-----↓,Global.asax,Application_OnPreRequest
    [2017/04/10 11:36:55,692],[INFO ],[5],,user01,127.0.0.1,postback,OrderDetails
    [2017/04/10 11:36:55,693],[INFO ],[5],,user01,127.0.0.1,----->,OrderDetails,gvwOrderDetails
    [2017/04/10 11:36:55,693],[INFO ],[5],,user01,127.0.0.1,<-----,OrderDetails,gvwOrderDetails,,0,0
    [2017/04/10 11:36:55,693],[INFO ],[5],,user01,127.0.0.1,----->,OrderDetails,gvwOrderDetails
    [2017/04/10 11:36:55,694],[INFO ],[5],,user01,127.0.0.1,<-----,OrderDetails,gvwOrderDetails,,1,0
    [2017/04/10 11:36:55,695],[DEBUG],[5],,-,127.0.0.1,-----↑,Global.asax,Application_OnPostRequest,-,-,4,0
    [2017/04/10 11:36:57,281],[DEBUG],[9],,-,127.0.0.1,-----↓,Global.asax,Application_OnPreRequest
    [2017/04/10 11:36:57,283],[INFO ],[9],,user01,127.0.0.1,postback,OrderDetails
    [2017/04/10 11:36:57,283],[INFO ],[9],,user01,127.0.0.1,----->,OrderDetails,btnUpdateOrder
    [2017/04/10 11:36:57,286],[INFO ],[9],,user01,127.0.0.1,----->>,,,UpdateOrder,
    [2017/04/10 11:36:57,362],[INFO ],[9],,user01,127.0.0.1,<<-----,,,UpdateOrder,,76,16
    [2017/04/10 11:36:57,372],[INFO ],[9],,user01,127.0.0.1,<-----,OrderDetails,btnUpdateOrder,,88,16
    [2017/04/10 11:36:57,373],[DEBUG],[9],,-,127.0.0.1,-----↑,Global.asax,Application_OnPostRequest,-,-,91,16
  3. C:\root\files\resource\Log\SQLTRACE.yyyy-mm-dd.log をメモ帳などで開きます。(yyyy-mm-dd には、実行日付が入ります)

  4. Orders テーブル・Order Details テーブルに対する SQL 文がトレースとして記録されていることを確認します。(以下は SQL トレースログから、SELECT 文の実行ログを抜粋したものです)

    [2017/04/10 11:36:32,892],[INFO ],[5],19,0,[commandText]:SELECT Orders.OrderID, Customers.CompanyName, Customers.ContactName, Employees.LastName As EmployeeLastName, Employees.FirstName As EmployeeFirstName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID    [commandParameter]:
    [2017/04/10 11:36:46,983],[INFO ],[17],3,0,[commandText]: -- DaoOrders_D2_Select -- 2012/8/6 日立 太郎 SELECT [OrderID], [CustomerID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry] FROM [Orders] WHERE [OrderID] = @OrderID    [commandParameter]:OrderID=10248,
    [2017/04/10 11:36:47,043],[INFO ],[17],1,0,[commandText]: -- DaoOrder_Details_D2_Select -- 2012/8/6 日立 太郎 SELECT [OrderID], [ProductID], [UnitPrice], [Quantity], [Discount] FROM [Order Details] WHERE [OrderID] = @OrderID    [commandParameter]:OrderID=10248,
Clone this wiki locally