-
Notifications
You must be signed in to change notification settings - Fork 55
Tutorial_2CS_CSharp.ja
2014年11月27日
本チュートリアルでの演習に沿ってサンプルプログラムを開発することで、Open 棟梁を用いた場合の開発の流れ・クラスの作成方法・各種定義ファイルの作成方法・ツールの使用方法・実行結果の確認方法等を習得することを目的としています。
Open 棟梁を用いた 2 層 C/S アプリケーション開発を検討している SE・開発者
本チュートリアルでは、Open 棟梁テンプレート・ベース (Visual Studio 2015 用) に付属のサンプルプログラムを題材とし、Open 棟梁を用いた場合の開発の流れを、順を追って説明します。
本ドキュメントに記載の会社名・商品名は、各社の商標または登録商標です。
本ドキュメントは、クリエイティブ・コモンズ CC BY 2.1 JP ライセンスの下で利用可能です。
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 アクセスクラスの作成方法を、順を追って説明します。
本チュートリアルでは、以下の環境を前提としています。
- 開発環境
- IDE
- Visual Studio 2015 (Express Edition も利用できます)
- アプリケーション フレームワーク
- Open 棟梁テンプレート・ベース (Visual Studio 2015 用)
- IDE
- 実行環境
- ランタイム
- .NET Framework 4.6
- DB
- SQL Server Express 2008 R2
- ランタイム
- その他
- OS
- Windows 7
- 開発言語
- C#
- OS
あらかじめ、マイクロソフトのサイトなどを参考に、Visual Studio をインストールしておいてください。
次に、Open 棟梁テンプレート・ベース、データベースをセットアップします。
-
GitHub で [Download ZIP] ボタンを押下して OpenTouryoTemplates.zip を入手し、これを解凍して Open 棟梁テンプレート・ベース (Visual Studio 2015 用) を取得します。
-
root_VS2015 フォルダにある Readme.md の手順に従って、Open 棟梁テンプレート・ベースとサンプルデータベースのセットアップを行います。
本チュートリアルでは、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 サンプルプログラムの画面遷移図
Open 棟梁を用いた開発の流れを、順を追って説明します。
-
C:\root\programs\C#\Samples\2CS_sample\2CSClientWin_sample\2CSClientWin_sample.sln
を開きます。 -
Visual Studio が起動し、Open 棟梁テンプレート・ベース(Visual Studio 2015 用)に付属のサンプルプログラムが開かれていることを確認してください。
-
Visual Studio のツールバーから、「プロジェクト(P)」-「Windows フォームの追加(F)」を選択します。
-
OrdersForm.cs
という名前の、新しい Windows フォームを追加します。 -
OrdersForm.cs
に、以下の図のように Button コントロールと DataGridView コントロールを追加します。追加した Button と DataGridView には、それぞれ以下のようにプロパティを設定します。
- Button
- Name: btnShowOrderDetail
- Text: 注文情報の詳細を表示する
- DataGridView
- AllowUserToAddRows: false
- AllowUserToDeleteRows: false
【注意】コントロール名のプレフィックス (”btn” など) を適切に設定しないと、Open 棟梁からコントロールが正しく認識されません。(詳しくは Open 棟梁の利用ガイド (纏め者編) をご覧ください)
- Button
-
4.2.1 項と同じように、注文の詳細情報を表示する Windows フォームを作成します。ここでは、フォームの名前は
OrderDetailsForm.cs
としてください。 -
OrderDetailsForm.cs
に、以下の図のように Label コントロールを 2 つ、DataGridView コントロールを 2 つ、Button コントロールを 1 つ追加します。追加したコントロールには、それぞれ以下のようにプロパティを設定します。
- Label (上部)
- Text: 注文情報 (サマリ)
- Label (下部)
- Text: 注文情報 (明細)
- Button
- Name: btnUpdateOrder
- Text: 修正内容を反映
- DataGridView (2 つとも)
- AllowUserToAddRows: false
- AllowUserToDeleteRows: false
- Label (上部)
-
Visual Studio のソリューション エクスプローラーで
Common
フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。 -
OrderParameterValue.cs
という名前のクラスを追加します。 -
以下のコードを
OrderParameterValue.cs
に追加し、Open 棟梁が提供するクラスをインポートします。using Touryo.Infrastructure.Business.Util; using Touryo.Infrastructure.Business.Common;
-
OrderParameterValue
クラスの宣言部分を以下のように修正し、Open 棟梁の「引数親クラス 2」を継承させます。public class OrderParameterValue : MyParameterValue
-
OrderParameterValue
クラスのコンストラクタを以下のように修正します。public OrderParameterValue(string screenId, string controlId, string methodName, string actionType, MyUserInfo user) : base(screenId, controlId, methodName, actionType, user) { }
-
画面から業務ロジックに渡す値として、
OrderParameterValue
クラスに以下のフィールドを追加します。/// <summary>注文 ID</summary> public string OrderId; /// <summary>注文情報(サマリ)</summary> public System.Data.DataTable Orders; /// <summary>注文情報(明細)</summary> public System.Data.DataTable OrderDetails;
-
4.3.1 項と同じように、
Common
フォルダに、OrderReturnValue.cs
という名前のクラスを追加します。 -
以下のコードを
OrderReturnValue.cs
に追加し、Open 棟梁が提供するクラスをインポートします。using Touryo.Infrastructure.Business.Common;
-
OrderReturnValue
クラスの宣言部分を以下のように修正し、Open 棟梁の「戻り値親クラス 2」を継承させます。public class OrderReturnValue : MyReturnValue
-
画面に返す値として、
OrderReturnValue
クラスに以下のフィールドを追加します。/// <summary>注文情報(サマリ)</summary> public System.Data.DataTable Orders; /// <summary>注文情報(明細)</summary> public System.Data.DataTable OrderDetails;
-
Visual Studio のソリューション エクスプローラーから、
Program.cs
ファイルを開きます。 -
以下のコードを
Program.cs
に追加し、Open 棟梁が提供するクラスをインポートします。using Touryo.Infrastructure.Framework.RichClient.Business;
-
サンプルプログラムでは、共通例外ハンドラとして
Application_ThreadException
メソッドが用意されています。ここに、共通例外処理として、データベース トランザクションをロールバックする処理を追記します。public static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { // DB のトランザクションをロールバックする (DB に接続していない場合は何もしない) BaseLogic2CS.RollbackAndClose(); ShowErrorMessage(e.Exception, "Application_ThreadExceptionによる例外通知です。"); }
テーブル・ビューに対する単純な CRUD 処理を行うデータアクセスクラス、SQL ファイルについては、Open 棟梁付属の D 層自動生成ツールで自動生成が可能です。
-
C:\root\programs\C#\Frameworks\DaoGen_Tool\bin\Debug\DaoGen_Tool.exe
を実行し、D 層自動生成ツールを起動します。 -
以下のように値を設定し、「取得」ボタンをクリックします。
- データプロバイダ: SQL Server Client
- 接続文字列: Data Source=localhost\SQLExpress;Initial Catalog=Northwind;Integrated Security=true;
- プルダウン: 概要情報
-
接続文字列等の情報に誤りがなければ、「DBMSのスキーマ情報の表示(概要情報)ダイアログ」が表示されます。
本ダイアログが表示されたことを確認し、「閉じる」ボタンをクリックして、ダイアログを閉じます。
-
「テーブル一覧の取得」ボタンをクリックします。
テーブル名称に関する注意を促すダイアログが表示されますが、「OK」ボタンをクリックして閉じてください。
-
Northwind データベース内のテーブル/ビューがリストに表示されます。本チュートリアルでは Orders テーブルと Order Details テーブルのみ使用しますので、Orders テーブル、Order Details テーブル以外を選択して、「削除」ボタンをクリックします。
-
リスト内の項目が、Orders テーブルと Order Details テーブルのみになったことを確認し、「ロード」ボタンをクリックします。
-
「D層定義情報を生成」ボタンが活性化されますので、出力エンコーディングとして「utf-8」を選択し、「D層定義情報を生成」ボタンをクリックします。
D 層定義情報ファイルの保存ダイアログが表示されますので、
C:\root\Info.csv
にファイルを保存します。 -
D 層定義情報ファイルが正常に生成できたことを示すダイアログが表示されますので、「OK」ボタンをクリックして閉じます。
-
「STEP2へ遷移」ボタンをクリックします。
-
「ステップ2」画面が表示されますので、以下のように値を設定し、「プログラムを生成する」ボタンをクリックします。
- D 層定義情報ファイル: C:\root\Info.csv
- ソーステンプレートフォルダ: C:\root\files\tools\DGenTemplates
- 出力ファイル: C:\root
- 上記以外はデフォルトのまま
-
Dao、SQL ファイルが正常に生成できたことを示すダイアログが表示されますので、「OK」ボタンをクリックして閉じます。
-
C:\root
フォルダ以下に、Dao ファイル、SQL ファイルが生成されていることを確認します。【注意】Open 棟梁では、SQL ファイルとして、拡張子が
.sql
のファイルと、.xml
のファイルがあります。(詳しくは Open 棟梁の説明書をご覧ください) -
自動生成した Dao クラスをサンプルプログラムに含めるため、Visual Studio でサンプルプログラムを開き、
Dao
フォルダを選択し、ツールバーの「プロジェクト(P)」-「既存の項目の追加(G)」を選択します。 -
既存項目の追加ダイアログで、
C:\root\DaoOrders.cs
とC:\root\DaoOrder_Details.cs
ファイルを選択し、「追加(A)」ボタンをクリックします。 -
C:\root
フォルダ直下に生成された SQLファイル・XMLファイルを、C:\root\files\resource\Sql
フォルダに移動します。 -
D 層自動生成ツールを終了します。
D 層自動生成ツールでは、単純な CRUD 処理を行う Dao クラスや SQL ファイルを生成できます。しかし、複数のテーブルを結合 (JOIN) させる SQL など、単純な CRUD 処理ではない SQL は、個別に作成する必要があります。
-
C:\root\files\resource\Sql
フォルダに、SelectOrders.sql
ファイルを作成します。 -
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
本チュートリアルでは、以下の 3 つの Dao クラスを使用します。
- DaoOrders
- Orders テーブルへのアクセス用
- DaoOrder_Details
- Order Details テーブルへのアクセス用
- CmnDao (Open 棟梁の共通 Dao)
- 4.5.2 項で作成した SQL ファイルを使用したアクセス用
これらの Dao クラスの呼び出しを制御し、業務ロジッククラス (B 層クラス) に対する窓口 (ファサード) となる、DAO 集約クラスを作成します。
-
Visual Studio のソリューション エクスプローラーで、
Dao
フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。 -
ConsolidatedLayerD.cs
という名前のクラスを追加します。 -
以下のコードを
ConsolidatedLayerD.cs
に追加し、Open 棟梁が提供するクラス、および 4.3 節で作成した引数・戻り値クラスをインポートします。// Open棟梁 using Touryo.Infrastructure.Business.Dao; using Touryo.Infrastructure.Public.Db; // 引数・戻り値クラス using _2CSClientWin_sample.Common;
-
ConsolidatedLayerD
クラスの宣言部分を以下のように修正し、Open 棟梁の「DAO 集約親クラス」を継承させます。public class ConsolidatedLayerD : BaseConsolidateDao
-
ConsolidatedLayerD
クラスに、以下のようにコンストラクタを作成します。public ConsolidatedLayerD(BaseDam dam) : base(dam) { }
-
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; }
-
同様に、注文 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; }
-
同様に、画面で入力した注文情報を 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; }
-
Visual Studio のソリューション エクスプローラーで、
Business
フォルダを選択し、ツールバーの「プロジェクト(P)」-「クラスの追加(C)」を選択します。 -
OrdersLogic.cs
という名前のクラスを追加します。 -
以下のコードを
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 _2CSClientWin_sample.Common; // DAO クラス using _2CSClientWin_sample.Dao;
-
OrdersLogic
クラス宣言部分を以下のように修正し、Open 棟梁の「業務親クラス 2」を継承させます。public class OrdersLogic : MyFcBaseLogic2CS
-
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」である
MyFcBaseLogic2CS
クラスを継承した B 層クラスでは、P 層から呼び出されるメソッド名はUOC_xx
(xx は任意) とする必要があります。P 層から ”xx” の部分をパラメータとして渡すことで、Open 棟梁によりUOC_xx
メソッドに処理が振り分けられます。(後述)
-
Visual Studio のソリューション エクスプローラーで、
OrdersForm.cs
ファイルを右クリックし、「コードの表示(C)」を選択します。 -
以下のコードを
OrdersForm.cs
に追加し、Open 棟梁が提供するクラス、引数・戻り値クラス、B 層クラスをインポートします。// 業務フレームワーク 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.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.Business; 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 _2CSClientWin_sample.Common; // B 層クラス using _2CSClientWin_sample.Business;
-
OrdersLogic
クラス宣言部分を以下のように修正し、Open 棟梁の「画面親クラス 2」を継承させます。public partial class OrdersForm : MyBaseControllerWin
-
画面起動時に注文情報の一覧を表示させるため、
OrdersForm
クラスのUOC_FormInit
メソッドを以下のようにオーバーライドします。protected override void UOC_FormInit() { // 引数クラスを生成 OrderParameterValue param = new OrderParameterValue(this.Name, "", "GetOrders", "SQL", MyBaseControllerWin.UserInfo); // 戻り値クラスを生成 OrderReturnValue returnValue; // B層呼出し OrdersLogic logic = new OrdersLogic(); returnValue = (OrderReturnValue)logic.DoBusinessLogic(param); // DataGridView をクリア this.dataGridView1.DataSource = null; if (returnValue.ErrorFlag == true) { // エラーメッセージを表示する MessageBox.Show("ErrorMessageID:" + returnValue.ErrorMessageID + "\r\n" + "ErrorMessage:" + returnValue.ErrorMessage + "\r\n" + "ErrorInfo:" + returnValue.ErrorInfo + "\r\n"); } else { // 注文情報一覧を DataGridView に表示する this.dataGridView1.DataSource = returnValue.Orders; // DataGridView を編集不可にする this.dataGridView1.ReadOnly = true; } // DBとの接続を閉じる BaseLogic2CS.CommitAndClose(); }
-
次に、ボタン押下時に注文情報詳細画面を表示するためのメソッドを追加します。
protected void UOC_btnShowOrderDetail_Click(RcFxEventArgs eventArgs) { if (this.dataGridView1.SelectedRows.Count == 0) { // DataGridView の行が選択されていない場合は、エラーメッセージを表示する MessageBox.Show("行が選択されていません"); return; } // 注文情報詳細画面を生成する OrderDetailsForm orderDetailsForm = new OrderDetailsForm(); // 注文情報一覧画面に、注文情報詳細画面を所有させる orderDetailsForm.Owner = this; // 注文情報詳細画面を表示する orderDetailsForm.Show(); }
-
注文情報一覧から、選択されている注文 ID を返すプロパティを作成します。
public string SelectedOrderId { get { if (this.dataGridView1.SelectedRows.Count == 0) { // 行が選択されていない場合は null を返す return null; } else { // 選択されている注文 ID を返す return this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString(); } } }
-
4.7.1 項を参考に、注文情報詳細画面 (
OrderDetailsForm
) も、必要な型情報をインポートし、Open 棟梁の「業務親クラス 2」を継承させます。 -
画面起動時に注文情報の詳細を表示させるため、
OrderDetailsForm
クラスのUOC_FormInit
メソッドを以下のようにオーバーライドします。protected override void UOC_FormInit() { // 引数クラスを生成 OrderParameterValue param = new OrderParameterValue(this.Name, "", "GetOrderById", "SQL", MyBaseControllerWin.UserInfo); param.OrderId = ((OrdersForm)this.Owner).SelectedOrderId; // 戻り値クラスを生成 OrderReturnValue returnValue; // B層呼出し OrdersLogic logic = new OrdersLogic(); returnValue = (OrderReturnValue)logic.DoBusinessLogic(param); // DataGridView をクリア this.dataGridView1.DataSource = null; this.dataGridView2.DataSource = null; if (returnValue.ErrorFlag == true) { // エラーメッセージを表示する MessageBox.Show("ErrorMessageID:" + returnValue.ErrorMessageID + "\r\n" + "ErrorMessage:" + returnValue.ErrorMessage + "\r\n" + "ErrorInfo:" + returnValue.ErrorInfo + "\r\n"); } else { // 注文情報(サマリ)の表示 this.dataGridView1.DataSource = returnValue.Orders; // 特定の列を編集不可にする this.dataGridView1.Columns["OrderId"].ReadOnly = true; this.dataGridView1.Columns["CustomerId"].ReadOnly = true; this.dataGridView1.Columns["EmployeeId"].ReadOnly = true; // 注文情報(明細)の表示 this.dataGridView2.DataSource = returnValue.OrderDetails; // 特定の列を編集不可にする this.dataGridView2.Columns["OrderId"].ReadOnly = true; this.dataGridView2.Columns["ProductId"].ReadOnly = true; } // DBとの接続を閉じる BaseLogic2CS.CommitAndClose(); }
-
次に、ボタン押下時に注文情報を DB に反映させるためのメソッドを追加します。
protected void UOC_btnUpdateOrder_Click(RcFxEventArgs eventArgs) { // グリッドの値を取得する DataTable orderTable = (DataTable)this.dataGridView1.DataSource; DataTable orderDetailTable = (DataTable)this.dataGridView2.DataSource; // 引数クラスを生成 OrderParameterValue param = new OrderParameterValue(this.Name, "", "UpdateOrder", "SQL", MyBaseControllerWin.UserInfo); // 業務ロジックに引数としてグリッドの値を渡す param.Orders = orderTable; param.OrderDetails = orderDetailTable; // 戻り値クラスを生成 OrderReturnValue returnValue; // B層呼出し OrdersLogic logic = new OrdersLogic(); returnValue = (OrderReturnValue)logic.DoBusinessLogic(param); if (returnValue.ErrorFlag == true) { // トランザクションをロールバックする BaseLogic2CS.RollbackAndClose(); // エラーメッセージを表示する MessageBox.Show("ErrorMessageID:" + returnValue.ErrorMessageID + "\r\n" + "ErrorMessage:" + returnValue.ErrorMessage + "\r\n" + "ErrorInfo:" + returnValue.ErrorInfo + "\r\n"); } else { // トランザクションをコミットする BaseLogic2CS.CommitAndClose(); // 結果(正常系) MessageBox.Show("正常に DB を更新しました。"); } }
-
Visual Studio のソリューション エクスプローラーで、
app.config
ファイルを開きます。 -
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>
サンプルプログラムを起動すると、既定ではサンプルプログラムが提供している画面が表示されます。これを、注文情報一覧画面 (OrdersForm.cs
) が表示されるように変更します。
-
Visual Studio のソリューション エクスプローラーで、
Program.cs
ファイルを開きます。 -
Program.cs
で、Application.Run
メソッドを実行している箇所を検索し、その部分を、以下のように注文情報一覧画面が起動時に表示されるようにします。// 業務画面の表示(業務の開始) Application.Run(new OrdersForm());
-
Visual Studio でサンプルプログラムをデバッグ実行します。
-
スプラッシュ画面が表示された後、ログイン画面が表示されますので、以下のように入力し、「ログイン」ボタンをクリックします。
- 上部のテキストボックス: 空でない任意の文字列
- 下部のテキストボックス: 任意の文字列 (空でもよい)
-
注文情報一覧画面が表示され、注文情報がグリッドに表示されていることを確認します。どこかの行を選択し、「注文詳細の情報を表示する」ボタンをクリックします。
-
注文情報の詳細が表示されますので、画面上で修正したい箇所を編集します。(ただし、OrderId 列、CustomerId 列、Employee 列、ProductId 列は編集できません) 編集終了後、「修正内容を反映」ボタンをクリックします。
-
正常にDBを更新したというメッセージが表示されることを確認し、「OK」ボタンをクリックします。
-
以下のコマンドを実行し、修正した内容で 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=【選択した注文番号】"
-
C:\root\programs\C#\Samples\2CS_sample\2CSClientWin_sample\bin\Debug\ACCESS_2CS.yyyy-mm-dd.log
をメモ帳などで開きます。(yyyy-mm-dd には、実行日付が入ります) -
OrdersForm
、OrderDetailsForm
へのアクセスがトレースとして記録されていることを確認します。(以下はトレースログを抜粋したものです。Login
画面、OrdersForm
画面、OrderDetailsForm
画面がそれぞれトレースされていることが分かります)[2017/04/06 11:24:54,043],[INFO ],[9],Splash [2017/04/06 11:24:54,058],[INFO ],[10],Splash [2017/04/06 11:24:57,084],[INFO ],[9],,-,-,Login,Form_Load [2017/04/06 11:25:00,060],[INFO ],[9],,-,----->,Login,btnButton1 [2017/04/06 11:25:00,065],[INFO ],[9],,user01,-,Login,Form_Closed [2017/04/06 11:25:00,076],[INFO ],[9],,user01,<-----,Login,btnButton1,16,0 [2017/04/06 11:25:00,099],[INFO ],[9],,user01,-,OrdersForm,Form_Load [2017/04/06 11:25:00,667],[INFO ],[9],,user01,pc01,----->>,OrdersForm,,GetOrders, [2017/04/06 11:25:03,008],[INFO ],[9],,user01,pc01,<<-----,OrdersForm,,GetOrders,,2341,203 [2017/04/06 11:28:46,964],[INFO ],[9],,user01,----->,OrdersForm,btnShowOrderDetail [2017/04/06 11:28:46,983],[INFO ],[9],,user01,-,OrderDetailsForm,Form_Load [2017/04/06 11:28:46,986],[INFO ],[9],,user01,pc01,----->>,OrderDetailsForm,,GetOrderById, [2017/04/06 11:28:49,486],[INFO ],[9],,user01,pc01,<<-----,OrderDetailsForm,,GetOrderById,,2501,31 [2017/04/06 11:28:49,537],[INFO ],[9],,user01,<-----,OrdersForm,btnShowOrderDetail,2573,109 [2017/04/06 11:36:09,282],[INFO ],[9],,user01,----->,OrderDetailsForm,btnUpdateOrder [2017/04/06 11:36:09,456],[INFO ],[9],,user01,pc01,----->>,OrderDetailsForm,,UpdateOrder, [2017/04/06 11:36:10,000],[INFO ],[9],,user01,pc01,<<-----,OrderDetailsForm,,UpdateOrder,,543,47 [2017/04/06 11:39:11,799],[INFO ],[9],,user01,<-----,OrderDetailsForm,btnUpdateOrder,182512,125 [2017/04/06 11:39:13,542],[INFO ],[9],,user01,-,OrderDetailsForm,Form_Closed [2017/04/06 11:39:15,232],[INFO ],[9],,user01,-,OrdersForm,Form_Closed
-
C:\root\programs\C#\Samples\2CS_sample\2CSClientWin_sample\bin\Debug\SQLTRACE_2CS.yyyy-mm-dd.log
をメモ帳などで開きます。(yyyy-mm-dd には、実行日付が入ります) -
Orders テーブル・Order Details テーブルに対する SQL 文がトレースとして記録されていることを確認します。(以下は SQL トレースログから、SELECT 文の実行ログを抜粋したものです)
[2017/04/06 11:25:03,006],[INFO ],[9],207,16,[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/06 11:28:49,335],[INFO ],[9],51,16,[commandText]: -- DaoOrders_D2_Select -- 2012/7/30 日立 太郎 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/06 11:28:49,486],[INFO ],[9],150,0,[commandText]: -- DaoOrder_Details_D2_Select -- 2012/7/30 日立 太郎 SELECT [OrderID], [ProductID], [UnitPrice], [Quantity], [Discount] FROM [Order Details] WHERE [OrderID] = @OrderID [commandParameter]:OrderID=10248,