レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】


以前ののブログ記事で紹介した「レプリケーションの際に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

——————————

関連したトピックス