Syniti Data Replication (旧DBMoto)でのスクリプトの書き方⑤:フィールドマッピング関数の書き方


このタイプの関数ではレプリケーションを定義する際の、フィールド(カラム)マッピングのソース列とターゲット列を識別するために使用できます。デフォルトでの動作はソーステーブルとターゲットテーブルのカラムの一致する名前を対応付けします。

マッピングルールの実装

  1. グローバルスクリプトを作成するメタデータを選択します。
  2. マウスの右ボタンメニューから、[グローバルスクリプト]を選択します。
  3. グローバルスクリプトエディタで、マッピング・ルールを以下に追加します。
    VB.NET: Public Class MappingRule : Inherits IMappingRule
    C#: public class MappingRule : IMappingRule
  4. MappingRuleAttribute定義します。この定義はフィールドをマッピングを指定するレプリケーションウィザードやレプリケーションプロパティのマッピングで表示されます。一つ目の文字列はカスタムマッピングのサブメニューで表示されるテキスト、二つ目の文字列は関数のツールチップの説明として表示されます。
  5. 以下の例のように、関数を記述します。関数のパラメーターは、以下の例のパラメーターと一致する必要があります。これらのパラメーターは、関数で使用できます。
  6. グローバルスクリプトをコンパイルして、関数が正しくコンパイルされることを確認します。正しくコンパイルされた場合にのみ、[自動マッピング]メニューで使用できます。

フィールドマッピング関数の例

以下の例ではソーステーブル、ターゲットテーブルのカラムいずれかに4文字の接頭辞が使用されている場合に、その接頭辞をスキップし、名前を比較するための関数を作成しています。

VB.NETの例

Public Class MappingRule : Inherits IMappingRule
	<MappingRuleAttribute("Match By Target Prefix", "ターゲットの接頭辞'fld_'を考慮して名前を一致")>
	Public Function CustomMapping_ByNameTPrefixed (
			ByVal sSourceName As String,
			ByVal iSourceOrdinal As Integer,
			ByVal sTargetName As String,
			ByVal iTargetOrdinal As Integer) As Boolean
           If sTargetName.Length >= 4 Then
		Return (String.Compare(sSourceName, sTargetName.SubString(4), True) = 0)
	    Else
		Return False
	    End If
	End Function
      
	<MappingRuleAttribute("Match By Source Preffix", "ソースの接頭辞'fld_'を考慮して名前を一致")>
	Public Function CustomMapping_ByNameSPrefixed (
			ByVal sSourceName As String,
			ByVal iSourceOrdinal As Integer,
			ByVal sTargetName As String,
			ByVal iTargetOrdinal As Integer) As Boolean
	   If sSourceName.Length >= 4
		Return (String.Compare(sSourceName.SubString(4), sTargetName, True) = 0)
	   Else
		Return False
	   End If
	End Function    
 
	<MappingRuleAttribute("Match Custom", "特定のカスタムルールを考慮して名前を一致")>
	Public Function MyCustomMapping (
			ByVal bIsForth As Boolean,
			ByVal sSourceName As String,
			ByVal iSourceOrdinal As Integer,
			ByVal sSourceType As String,
			ByVal sTargetName As String,
			ByVal iTargetOrdinal As Integer,
			ByVal sTargetType As String,
			ByRef sExpression As System.Text.StringBuilder) As Boolean
			///     ...
	End Function
	<MappingRuleAttribute("Match Custom Extended Params", "特定のカスタムルールを考慮して名前を一致")>
	Public Function MyCustomMapping (
			ByVal bIsForth As Boolean,
			ByVal sSourceName As String,
			ByVal iSourceOrdinal As Integer,
			ByVal sSourceType As String,
			ByVal bIsSourcePrimaryKey As Boolean,
			ByVal bIsSourceNullable As Boolean,   
			ByVal iSourceSize As Integer,
			ByVal sSourcePrecision As Short,
			ByVal sSourceScale As Short,
			ByVal sTargetName As String,
			ByVal iTargetOrdinal As Integer,
			ByVal sTargetType As String,
			ByVal bIsTargetPrimaryKey As Boolean,
			ByVal bIsTargetNullable As Boolean,
			ByVal iTargetSize As Integer,
			ByVal sTargetPrecision As Short,
			ByVal sTargetScale As Short,
			ByRef sExpression As System.Text.StringBuilder) As Boolean
			///     ...
	End Function
End Class		

C#の例

using System;
using System.Data;
using DBMotoPublic;
using DBMotoScript;
namespace DBRS
{
   public class GlobalScript : IGlobalScript
   {
   }
   public class MappingRule : IMappingRule
   {
     [MappingRuleAttribute("Match By Target Prefix", "ターゲットの接頭辞'fld_'を考慮して名前を一致")]
     public bool CustomMapping_ByNameTPrefixed (String sSourceName, int iSourceOrdinal, String sTargetName, int iTargetOrdinal)
	{
	   if (sTargetName.Length >= 4)
	      {
		return (String.Compare(sSourceName, sTargetName.Substring(4), true) == 0);
	       }
	   else
	       {
		return false;
	        }
	}
    
	[MappingRuleAttribute("Match By Source Prefix", "ソースの接頭辞'fld_'を考慮して名前を一致")]
	public bool CustomMapping_ByNameSuffixed (String sSourceName, int iSourceOrdinal, String sTargetName, int iTargetOrdinal)
	{
	   if (sSourceName.Length >= 4)
		{
		   return (String.Compare(sSourceName.Substring(4), sTargetName, true) == 0);
		}
	   else
		{
		   return false;
		}
	  }
	[MappingRuleAttribute("Match Custom", "特定のカスタムルールを考慮して名前を一致")]
	public bool MyCustomMapping(bool bIsForth, String sSourceName, int iSourceOrdinal, String sSourceType, 
          String sTargetName, int iTargetOrdinal, String sTargetType, ref System.Text.StringBuilder sExpression)
	{
	  //      ...
	  return true;
	}
   }
   public class GlobalEvents : IGlobalEvents
   {
   }
}

パラメータ一覧

関数で利用できるパラメータは以下の通りです。

パラメータ説明
bIsForth シンクロナイゼーションにおけるマッピングで順方向であれば、TRUE、逆方向であればFALSEを使用。
たとえば、bIsForthがTrueの場合、名前でマッピングを適用、bIsForthがFalseの場合は、別のルールを適用するというように、これにより、マッピングの両方向を処理するスクリプトを作成でき、
sSourceName ソースカラムの名前
iSourceOrdinalソースカラムの順序位置(整数)
sSourceType ソースカラムのタイプ(元のデータベースタイプ)。
たとえば、すべてのVARCHAR列のマッピングにTrim関数を適用するといったように、これを使用して、特定のデータ型で機能するカスタムマッピングルールを作成できます。
bIsSourcePrimaryKey ソースフィールドが主キーであるかどうか
bIsSourceNullable ソースフィールドでNULLが許可されているかどうか
iSourceSize 整数で表されるソースフィールドのサイズ
sSourcePrecision short型で表されるソースフィールドの精度
sSourceScaleshort型で表されるソースフィールドのスケール
sTargetName ターゲットカラムの名前
iTargetOrdinal カラムの順序位置(整数)
sTargetType ターゲットカラムのタイプ(元のデータベースタイプ)
blsTargetPrimaryKey ターゲットフィールドが主キーであるかどうか
bIsTargetNullable ターゲットフィールドでNULLが許可されているかどうか
ターゲットフィールドでNULLが許可されているか確認し、許可されていない場合に、NULL値がターゲットに渡されるケースを回避できます。
iTargetSize 整数で表されるターゲットフィールドのサイズ
sTargetPrecision short型で表されるターゲットフィールドの精度
sTargetScale short型で表されるターゲットフィールドのスケール
sExpression 関数からSyniti DRへ返すことができる参照パラメータ
これにより、特定の式をマッピングに適用できます。
以下の例ではVARCHARのすべてのターゲットカラムに対してグローバル関数MyGlobalFunctionを呼び出す式を定義しています。
If sTargetType = “VARCHAR” Then
sExpression.Append( “MyGlobalFunction([” + sSourceName + “])”)
End If

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください