次の方法で共有


チュートリアル:データベースおよび .NET のファクトの使用

ここでは、ビジネス ルール作成ツールを使用して、データベースおよび .NET のファクトを使用するポリシーを作成する手順について説明します。

前提条件

チュートリアルを実行する前に、 StaticSupport レジストリ キーの値を 1 または 2 に設定する必要があります。 これによって、クライアントにクラスのインスタンスをアサートするように要求しなくても、ポリシーで .NET クラスの静的メソッドを呼び出すことができるようになります。 詳細については、「 クラスの静的メンバーの呼び出し」を参照してください。

このチュートリアルの概要

次の表に示すように、このチュートリアルには 5 つの手順が含まれています。

プロシージャのタイトル 手順の説明
TestDB データベースと PO テーブルを作成するには TestDB データベースと PO テーブルを作成する手順について説明します。
POUtility コンポーネントを作成するには POUtility コンポーネントを作成する手順について説明します。
ProcessPurchaseOrderDbNet ビジネス ポリシーを作成するには ProcessPurchaseOrderDbNet ポリシーを作成する手順について説明します。
ビジネス ルール作成ツールを使用して ProcessPurchaseOrderDbNet ポリシーをテストするには ビジネス ルール作成ツールを使用して ProcessPurchaseOrderDbNet ポリシーをテストする手順について説明します。
Policy.Execute メソッドを使用して ProcessPurchaseOrderDbNet ポリシーをテストするには Policy.Execute メソッドを使用して ProcessPurchaseOrderDbNet ポリシーをテストする手順について説明します。

TestDB データベースと PO テーブルを作成するには

  1. SQL Server Management Studio を開きます。

  2. サーバー名と認証を確認し、[ 接続] をクリックします。

  3. 左側のオブジェクト エクスプローラー ウィンドウで、コンピューター名を右クリックし、[新しいクエリ] をクリックします。

  4. 次の SQL ステートメントをクエリ ウィンドウにコピーします。

    CREATE DATABASE [TestDB]  
    GO  
    
    Use TestDB  
    CREATE TABLE [dbo].[PO]([PONumber] [nvarchar](50) NOT NULL,  
    [Quantity] [int] NOT NULL,  
    [Status] [nchar](10) NULL  
    CONSTRAINT [PK_PO] PRIMARY KEY CLUSTERED ([PONumber] ASC))   
    GO  
    
    INSERT INTO PO VALUES ('PO1', 400, NULL)  
    INSERT INTO PO VALUES ('PO2', 700, NULL)  
    GO  
    
  5. F5 キーを押して、SQL クエリを実行します。

  6. [オブジェクト エクスプローラー] ウィンドウで、コンピューター名を展開し、[データベース] を展開して、TestDB が存在することを確認します。

  7. [TestDB] を展開し、[テーブル] を展開して、その dbo を確認します。PO が存在します。

  8. dbo を右クリックします 。PO をクリックし、[ テーブルを開く ] をクリックして、テーブルに次のデータが存在することを確認します。

    発注番号 Quantity Status
    PO1 400 NULL
    PO2 700 NULL

POUtility コンポーネントを作成するには

  1. Microsoft Visual Studio を起動します

  2. Visual Studio の [ ファイル ] メニューの [ 新規作成] をポイントし、[ プロジェクト] をクリックします。

  3. [新しいプロジェクト] ダイアログ ボックスで、次の操作を行います。

    プロパティ 目的
    プロジェクト タイプ [ Visual C#] をクリックします
    テンプレート [ クラス ライブラリ] をクリックします。
    名前 POUtilityLib」と入力します。
    場所 C:\BRE-Walkthroughs を場所として指定します。
    [ソリューション名] POUtilitySol」と入力します
    ソリューションのディレクトリを作成する ソリューション ファイルのディレクトリを作成するには、このチェック ボックスをオンにします。
  4. [OK] をクリックします。 POUtilityLib プロジェクトは、ソリューション エクスプローラーに表示されます。 ソリューション エクスプローラーが表示されない場合は、[表示] メニューの [ソリューション エクスプローラー] をクリックします。

  5. プロパティ ウィンドウで、ファイルの名前 Class1.csPOUtility.cs に変更します。

  6. 次のコードに示すように、パブリック コンストラクターをクラスに追加します。

    public POUtility()  
    {  
    }  
    
  7. 次のコードに示すように、 GetMaxAllowed という名前の静的メソッドを POUtility クラスに追加します。

    public static int GetMaxAllowed()  
    {  
    return 500;  
    }   
    
  8. Visual Studio コマンド プロンプトを起動します

  9. ディレクトリを C:\BRE-Walkthroughs\POUtilitySol に変更し、次のコマンドを実行します。

    Sn -k POUtility.snk

  10. Visual Studio のソリューション エクスプローラーで、[プロパティ] を展開し、[AssemblyInfo.cs] をダブルクリックします。

  11. 最後に AssemblyInfo.cs ファイルに次のステートメントを追加します。

    [assembly: AssemblyKeyFile(@"C:\BRE-Walkthroughs\POUtilitySol\POUtility.snk")]  
    
  12. ソリューション エクスプローラー ウィンドウで、[POUtilityLib] を右クリックし、[ビルド] をクリックします。

  13. Visual Studio コマンド プロンプトで、ディレクトリを C:\BRE-Walkthroughs\POUtilitySol\POUtilityLib\Bin\Debug に変更し、次のコマンドを実行して POUtility コンポーネントを GAC (グローバル アセンブリ キャッシュ) に登録します。 コマンド プロンプトが開かない場合は、手順 8 に従って開きます。

    Gacutil -i POUtilityLib.dll

ProcessPurchaseOrderDbNet ビジネス ポリシーを作成するには

  1. [ スタート ] メニューの [ ビジネス ルール作成ツール] を開きます。 ビジネス ルール作成ツールを既に開いている場合は、F5 キーを押して更新します。

    Note

    ユーザー アカウント制御 (UAC) をサポートするシステムでは、管理者特権を使用してこのツールを実行することが必要な場合があります。 これを行うには、アプリケーションを右クリックし、[ 管理者として実行] を選択します。

  2. [ファクト エクスプローラー] ウィンドウで、[データベース] をクリックします。

  3. [ サーバー] を右クリックし、[ 参照] をクリックします。

  4. サーバーと認証情報を確認し、[OK] をクリック します

  5. [TestDB] を展開し、[PO] を展開します。

  6. [ファクト エクスプローラー] ウィンドウで、[.NET クラス] をクリックします。

  7. を右クリックします 。NETAssemblies、 [ 参照] の順にクリックします。

  8. [ POUtility] を選択し、[OK] をクリック します

  9. [クラス 1] を展開します。

  10. [ポリシー エクスプローラー] ウィンドウで、[ポリシー] を右クリックし、[新しいポリシーの追加] をクリックします。

  11. ポリシーの名前を Policy1 から ProcessPurchaseOrderDbNet に変更し、Enter キーを押します。 ポリシーの名前は [プロパティ] ウィンドウで変更することもできます。

  12. [バージョン 1.0] を右クリックし、[追加][新規][ルール] の順にクリックします。

  13. ルールの名前を Rule1 から ApprovalRule に変更し、Enter キーを押します。 ルールの名前は [プロパティ] ウィンドウで変更することもできます。

  14. 右側の [IF] ペイン (上部) で、[ 条件] を右クリックし、[ 述語] をクリックし、[ LessThanEqual] をクリックします。

  15. [ファクト エクスプローラー] ウィンドウで、[データベース] をクリックします。

  16. [ファクト エクスプローラー] ウィンドウから [数量] ノードを IF ペインの argument1 にドラッグします。

  17. [ファクト エクスプローラー] ウィンドウで、[.NET クラス] をクリックします。

  18. GetMaxAllowed ノードを [ファクト エクスプローラー] ウィンドウから IF ペインの argument2 にドラッグします。

  19. [ファクト エクスプローラー] ウィンドウで、[データベース] をクリックします。

  20. [ファクト] エクスプローラー ウィンドウの [状態] ノードを、ビジネス ルール作成ツールの右下にある [THEN] ウィンドウにドラッグします。

  21. [THEN] ペインで、[値>を入力] をクリックし、「承認済み」と入力します<

  22. [ファクト エクスプローラー] ウィンドウで、ProcessPurchaseOrderDbNet[バージョン 1.0] を右クリックし、[追加][新しいルール] の順にクリックします。

  23. ルールの名前を Rule1 から DeniedRule に変更し、Enter キーを押します。 ルールの名前は [プロパティ] ウィンドウで変更することもできます。

  24. 右側の [IF] ペイン (上部) で、[ 条件] を右クリックし、[ 述語] をクリックして、[ GreaterThan] をクリックします。

  25. [ファクト エクスプローラー] ウィンドウで、[データベース] をクリックします。

  26. [ファクト エクスプローラー] ウィンドウから [数量] ノードを IF ペインの argument1 にドラッグします。

  27. [ファクト エクスプローラー] ウィンドウで、[.NET クラス] をクリックします。

  28. GetMaxAllowed ノードを [ファクト エクスプローラー] ウィンドウから IF ペインの argument2 にドラッグします。

  29. [ファクト エクスプローラー] ウィンドウで、[データベース] をクリックします。

  30. [ファクト] エクスプローラー ウィンドウから [ビジネス ルール作成ツール] の右下にある [THEN] ウィンドウに [状態] ノードをドラッグします。

  31. [THEN] ペインで、[値>を入力] をクリック<し、「Denied」と入力します。

  32. [ポリシー エクスプローラー] ウィンドウで、[バージョン 1.0 (保存されていません)] を右クリックし、[保存] をクリックします。

ビジネス ルール作成ツールを使用して ProcessPurchaseOrderDbNet ポリシーをテストするには

  1. [ スタート ] メニューの [ ビジネス ルール作成ツール] を開きます。 ビジネス ルール作成ツールを既に開いている場合は、F5 キーを押して更新します。

  2. [ポリシー エクスプローラー] ウィンドウで、[ポリシー] を展開し、[ProcessPurchaseOrderDbNet] を展開し、[バージョン 1.0] を右クリックし、[テスト ポリシー] をクリックします。

  3. [ TestDB:PO (データ接続)] をクリックし、[ インスタンスの追加] をクリックします。

  4. [SQL Serverへの接続] ダイアログ ボックスで、サーバー名と認証情報を確認し、[OK] をクリックします

  5. [ バインドの選択 ] ダイアログ ボックスで、[ TestDB] を展開し、[ PO] をクリックし、[OK] をクリック します

  6. [Test] をクリックします。

  7. [出力] ウィンドウで、 ApprovalRuleDeniedRule の両方が起動していることを確認します。

  8. SQL Server Management Studioで、dbo を右クリックします。PO をクリックし、[テーブルを開く] をクリックします。

  9. 最初のレコードの [状態] フィールドの値が [承認済み] に設定されていることを確認します。

  10. 2 番目のレコードの [状態] フィールドの値が [拒否] に設定されていることを確認します。

    Note

    [状態] フィールドの値が NULL のまま表示される場合は、データを含むリストを右クリックし、[SQL の実行] をクリックしてビューを更新します。

  11. SQL Server Management Studio は開いたままにしておきます。

Policy.Execute メソッドを使用して ProcessPurchaseOrderDbNet ポリシーをテストするには

  1. Microsoft Visual Studio を起動します

  2. Visual Studio の [ ファイル ] メニューの [ 新規作成] をポイントし、[ プロジェクト] をクリックします。

  3. [新しいプロジェクト] ダイアログ ボックスで、次の操作を行います。

    プロパティ 目的
    プロジェクト タイプ [ Visual C#] をクリックします
    テンプレート [コンソール アプリケーション] をクリックします。
    名前 「TestProcessPODbNet」と入力します。
    場所 場所として C:\BRE-Walkthroughs を指定します。
    [ソリューション名] 「TestProcessPODbNetSol」と入力します。
    ソリューションのディレクトリを作成する ソリューション ファイルのディレクトリを作成するには、このチェック ボックスをオンにします。
  4. [OK] をクリックします。 TestProcessPODbNet プロジェクトは、ソリューション エクスプローラーに表示されます。 ソリューション エクスプローラーが表示されない場合は、[表示] メニューの [ソリューション エクスプローラー] をクリックします。

  5. ソリューション エクスプローラーで、[参照] を右クリックし、[参照の追加] をクリックします。

  6. [ 参照] をクリックし、 \Program Files\Common Files\Microsoft BizTalk を参照し、[ Microsoft.RuleEngine.dll] をダブルクリックします。

  7. 既存usingのステートメントの後に Program.cs ファイルの先頭に次のコードを追加します。

    //To use the SQLConnection class  
    using System.Data.SqlClient;  
    
    //To use the Policy and DataConnection classes  
    using Microsoft.RuleEngine;  
    
  8. 次のコードを Main 関数に追加して、 SQLConnection オブジェクトを作成して開きます。

    SqlConnection cn = new SqlConnection("Data Source=(local);Initial Catalog=TestDB;Integrated Security=SSPI");  
    cn.Open();  
    
  9. 最後に Main 関数に次のコードを追加して、前の手順で作成した SQLConnection オブジェクトに基づいて DataConnection オブジェクトを作成します。

    DataConnection dc = new DataConnection("TestDB", "PO", cn);  
    
  10. 最後に Main 関数に次のコードを追加して 、Policy オブジェクトを作成し、ポリシーを実行します。

    Policy policy = new Policy("ProcessPurchaseOrderDbNet");  
    policy.Execute(dc);  
    
  11. データベースを更新するには、最後に Main 関数に次のコードを追加します。

    dc.Update();  
    
  12. 次のコードを最後の Main 関数に追加して、データベースへの接続を閉じます。

    cn.Close();  
    
  13. Main メソッドで生成された例外をキャッチする try-catch ブロックを追加します。

  14. Main 関数の完全なコードが次のコードに示すようになっていることを確認します。

    try  
    {  
    SqlConnection cn = new SqlConnection("Data Source=(local);Initial Catalog=TestDB;Integrated Security=SSPI");  
    cn.Open();  
    DataConnection dc = new DataConnection("TestDB", "PO", cn);  
    Policy policy = new Policy("ProcessPurchaseOrderDbNet");  
    policy.Execute(dc);  
    dc.Update();  
    cn.Close();  
    }  
    catch (Exception ex)  
    {  
    Console.WriteLine(ex.Message);  
    }  
    
  15. [ ビルド ] メニューの [ TestProcessPODbNet のビルド] をクリックします。

  16. ビジネス ルール作成ツールで、[ ポリシー] を展開し、[ ProcessPurchaseOrderDbNet] を展開し、[ バージョン 1.0] を右クリックし、[ 発行] をクリックします。

  17. [バージョン 1.0 - 発行済み] を右クリックし、[デプロイ] をクリックします。

  18. SQL Server Management Studioで、両方の PO レコードの [状態] フィールドの値を NULL に設定します。

  19. Visual Studio で Ctrl キーを押しながら F5 キーを押して 、TestProcessPODbNet アプリケーションを実行します。

  20. 任意のキーを押してコマンド プロンプト ウィンドウを閉じます。

  21. SQL Server Management Studioで、PO レコードを含むテーブルを右クリックし、[SQL の実行] をクリックします。

  22. 最初のレコードの [状態] フィールドの値が [承認済み] に設定されていることを確認します。

  23. 2 番目のレコードの [状態] フィールドの値が [拒否] に設定されていることを確認します。

説明

  • ポリシーで .NET クラスの非静的メソッドを使用する場合は、ポリシーをビジネス ルール作成ツールでテストするために .NET クラスのインスタンスをアサートするファクト作成コンポーネントを使用する必要があります。

  • ビジネス ルール Composer によって DataConnection オブジェクトのインスタンスが作成され、ルール エンジンの動作メモリに自動的にアサートされることを覚えておくことは非常に重要です。 ただし、クライアント (BizTalk または BizTalk 以外の) アプリケーションからポリシーを呼び出すと、 DataConnection オブジェクトは自動的に作成されません。 クライアントは DataConnection オブジェクトを作成し、それをパラメーターまたはファクトとしてルール エンジンに渡してポリシーを実行する必要があります。

  • DebugTrackingInterceptor クラスを使用して、ポリシー実行の詳細を追跡できます。 次のサンプル コードは、 DebugTrackingInterceptor クラスのインスタンスを作成し、ポリシーの実行時にそれを使用する方法を示しています。

    DebugTrackingInterceptor dti = new DebugTrackingInterceptor("c:\\Trace.txt");  
    policy.Execute(dc, dti);  
    
  • SqlTransaction クラスを使用すると、トランザクション方式で ProcessPODbNet ポリシーからデータベースを更新できます。 次のコードは、トランザクションを開始し、トランザクションをパラメーターとして DataConnection オブジェクトに渡し、データベースの変更をコミットする方法を示しています。 詳しくは、「トランザクションのサポート」をご覧ください。

    SqlConnection cn = new SqlConnection("Data Source=(local);Initial Catalog=TestDB;Integrated Security=SSPI");  
    cn.Open();  
    //Begin the transaction  
    SqlTransaction  tn = cn.BeginTransaction();  
    //Pass the transaction object to the DataConnection constructor  
    DataConnection dc = new DataConnection("TestDB", "PO", cn, tn);  
    Policy policy = new Policy("ProcessPurchaseOrderDbNet");  
    DebugTrackingInterceptor dti = new DebugTrackingInterceptor("c:\\Trace.txt");  
    policy.Execute(dc, dti);  
    dc.Update();  
    //Commit the database transaction  
    tn.Commit();  
    cn.Close();  
    

参照

ファクトの選択