以前ののブログ記事で紹介した「レプリケーションの際にnullを特定の値に変換する方法 その1」は、テーブルのフィールドごとに設定する必要があったため、フィールドの数が多ければ多いほど設定に時間を要するというデメリットがありました。
今回紹介する方法は、同じテーブル内の同じデータタイプであれば、設定を1回で済ますことが可能で、設定に要する時間の短縮化が期待できます。
■スクリプトの準備
以下のスクリプトを準備します。
——————————
Imports System
Imports System.Data
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Namespace DBRS
Public Class GlobalScript : Inherits IGlobalScript
Public Shared Function SetVAL(obj as Object, obj1 as Object) as Object
If obj is DBNull.Value Then
Return obj1
End if
If obj is nothing Then
Return obj
End if
If String.IsNullOrEmpty(obj.ToString()) = True Then
Return obj1
Else
Return obj
End If
End Function
End Class
Public Class MappingRule : Inherits IMappingRule
<MappingRuleAttribute("CheckString", "Set function for NON nullable fields")>
Public Function CheckString (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
If sSourceName = sTargetName Then
If sSourceType = "VARCHAR2" Then
sExpression.Append("SetVal([" + sTargetName + "]," + """NODATA""" + ")")
End If
Return True
Else
Return False
End if
End Function
End Class
Public Class GlobalEvents : Inherits IGlobalEvents
End Class
End Namespace
——————————
■マッピング画面でのスクリプト適用
マッピング画面にて「Custom Mapping」から「CheckString」(グローバルスクリプトで設定した関数名)を選択します。

今まで手動で「Map to Expression」を起動する必要があったものが、自動で一括設定されます。

■データタイプが複数ある場合
今までの設定では1つのテーブルに対して1つのデータタイプのみの場合にしか適用できません。複数のデータタイプに対して設定を行う場合、スクリプトにてIf Elseによる条件分岐にて実現できます。例えば以下のように記述します。
——————————
If sSourceName = sTargetName Then
If sSourceType = "VARCHAR2" Then
sExpression.Append("SetVal([" + sTargetName + "]," +
"""NODATA""" + ")")
Else If sSourceType = "CHAR" Then
sExpression.Append("SetVal([" + sTargetName + "]," +
"""NODATA""" + ")")
Else If sSourceType = "NUMBER" Then
sExpression.Append("SetVal([" + sTargetName + "]," +
"""NODATA""" + ")")
End If
Return True
Else
Return False
End if
——————————
関連したトピックス
- [DBMoto]関数を使用してレプリケーション時のデータを変換する方法(VB/C#言語選択、関数適用、ユーザ関数作成、置換関数、一括設定手順)
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方⑤:フィールドマッピング関数の書き方
- テーブル一括作成やマッピングをカスタマイズ:グローバルスクリプト[Syniti Replicate]
- レプリケーションの際にnullを特定の値に変換する方法 その1【リアルタイムレプリケーションツールDBMoto】
- ジュリアンデートのレプリケーション【リアルタイムレプリケーションツールDBMoto】
- [DBMoto][スクリプト]カラムを結合・分割したレプリケーション
- [Syniti(旧DBMoto)]レコード競合(コンフリクト)発生時のレコード内容を出力する方法
- 複数のテーブルにあるレコードを1つのテーブルへ統合する際の注意点【リアルタイムレプリケーションツールDBMoto】
- 複数の複製元サーバから1つの複製先サーバへの結合レプリケーションもDBMotoで簡単実現
- [DBMoto]「未マッピング使用」機能によるマッピング外のデータを活用したレプリケーション


RSSフィードを取得する