前回に引き続き、 Syniti Data Replication (旧DBMoto) でのスクリプトの書き方をご紹介させていただきます。今回はその中でも特にグローバルスクリプトの基本的な使用方法をご紹介します。
グローバルスクリプトは関数やグローバルイベントに対する制御の定義を行うグローバルクラスを定義する共通モジュールです。レプリケーションスクリプトまたは関数スクリプト内で呼び出す必要があるユーザー関数を定義するためにも使用できます。
グローバルスクリプトでは以下の関数セットを使用または定義できます。
- Microsoft C#ライブラリ:グローバルスクリプトエディタで選択したスクリプト言語に基づいて、C#またはVB.NETを使用し、スクリプトおよびスクリプトで使用する関数を定義
- Microsoft Visual Basic名前空間関数: [Strings] Left, Mid, Right, Instr; [Math] Cos, Arc, PowerなどのVisual Basic 6関数を利用可能にする.NET Frameworkクラスライブラリ
- グローバル関数:DBMotoの一部として関数を実装
- グローバルスクリプトイベント:全てのレプリケーションに適用するイベント
- ユーザー関数:レプリケーションスクリプトで使用するための関数をグローバルスクリプトダイアログ内でユーザが定義
- テーブル作成ルールまたは関数:ターゲットテーブルウィザードでのテーブル作成の仕方をカスタマイズするための関数
- フィールドマッピングルールまたは関数:レプリケーションでソースとターゲットのカラムをどのように対応付けするか決定するための関数
グローバルスクリプトエディタを使用して、多くの場合、レプリケーションスクリプトおよびマッピングで使用する関数を作成します。
たとえば、以下のように、いくつかのレプリケーションスクリプトで使用する変換関数があるとします。 レプリケーションスクリプトごとに変換関数を繰り返し記述する代わりに、グローバルスクリプトで変換関数を定義し、レプリケーションスクリプトや関数マッピングで呼び出すことができます。
1.Syniti Data Replication (旧DBMoto)コンソールにてメタデータを右クリックし、グローバルスクリプトを選択します。デフォルトで言語にはC#が選択されています。
using System; using System.Data; using DBMotoPublic; using DBMotoScript; namespace DBRS { public class GlobalScript : IGlobalScript { } public class MappingRule : IMappingRule { } public class GlobalEvents : IGlobalEvents { } }
2. GlobalScriptクラスで、次の例のように関数を宣言します
public static DateTime DateConvert(int intDate){ int cyy; int yyyy; int mm; int dd; cyy = (int)(intDate / 10000); mm = (int)((intDate - cyy * 10000) / 100); dd = intDate % 100; if (cyy < 100) yyyy = 1900 + cyy; else yyyy = 2000 + (cyy % 100); DateTime dc = new DateTime(yyyy, mm, dd); return dc; }
3.コンパイルボタンを使用し、スクリプトの構文チェックを行います。スクリプトに問題があった場合、別のダイアログで表示されます。レプリケーションを実行する前にコンパイルを行い、問題がないか確認してください。

4.このようにグローバルスクリプトで定義した関数を各レプリケーションのマッピング時などに利用できます。

※関数を定義する際にレプリケーションまたは関数スクリプト内でその関数を使用する場合、下記のようにpublicの後にstaticキーワードを追加します。
public static object GetQueryValue(IDbConnection objConnection, String strQuery)
※ Record_OnExecuteErrorイベントでは下記のように、イベントハンドラを宣言します。属性GlobalEventAttributeを指定することを忘れないでください。
[GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event EventName")] public void MyErrorHandler(String sReplOrGroupName, DBMotoPublic.IRecord recTarget, Exception e, ref Boolean bRetryExecute, ref int iSleep, int iIteration) { }
※ライブラリをスクリプト内のインポートのリストに追加する場合、下記のようにリファレンスダイアログから追加可能です。

このようにグローバルスクリプトを活用したサンプルを本ブログサイトでもいくつかご紹介しています。