今回はスクリプトの例として、レプリケーション結果を比較してデータに差異がないか、差異があった場合にデータの同期をとる、レプリケーション結果比較機能をAPIで実行する方法を紹介します。
SynitiではC#やVBの各APIを使用してレプリケーションを制御することが可能です。
開発環境の準備については以下をご参照ください。
API(C#, VB, C++)の開発環境構築手順
参考:外部からレプリケーションやグループを開始・停止するサンプルC#プログラム
参考:APIからリフレッシュを実行するサンプルスクリプト[C#]
参考:APIからレプリケーションの最新の実行件数を取得するサンプルスクリプト[C#]
実行時にDBへの接続が必要なことから、ドライバに関する情報(configフォルダ)を参照するため、C:\Program Files\Syniti\Data Replication V9でEXEファイルを実行する必要があります。
using System;
using System.Collections.Generic;
using System.Text;
using HiTSoftware.DBMoto.Application;
using HiTSoftware.DBMoto.ObjectModel;
namespace APISamples
{
public class SampleVerifier
{
public static void Main()
{
// 使用する変数の定義
DBMotoApplication dbmApp = null;
IServer dbmServer = null;
IMetadata currentMetadata = null;
Verifier verifier = null;
try
{
// サーバの接続部分の設定
dbmApp = DBMotoApplication.Instance;
dbmServer = dbmApp.Servers["local"];
dbmServer.Connect();
// カレントメタデータのロード
currentMetadata = dbmServer.Metadatas.DefaultMetadata;
currentMetadata.Load(true);
// 単一のレプリケーションを検証
// IReplication repl = currentMetadata.Replications["EMPLOYEE"]; //レプリケーション名
// verifier = new Verifier(repl);
// 複数レプリケーションを検証
List<IReplication> replList = new List<IReplication>(currentMetadata.Replications);
verifier = new Verifier(replList);
// イベント登録
verifier.OnDifference += new Verifier.Difference(verifier_OnDifference);
verifier.OnError += new Verifier.Error(verifier_OnError);
// キャッシュする設定
verifier.EnableCaching = true;
// 検証結果を保持する変数
VerifierResult[] verResults = null;
// 検証を実行
bool bSuccess = verifier.Verify(out verResults);
// 整合を実行
verifier.ReconcileData();
// 差異があったレコードの件数を表示
if (bSuccess) // 差異がない場合
{
Console.WriteLine("差異がない");
}
else // 差異がある場合
{
// レプリケーション結果の変数の中の配列を確認
for (int i = 0; i < verResults.Length; i++)
{
Console.WriteLine(replList[i].Name);
// verResults[i]の値を確認
if (!verResults[i].IsEqual)
{
// 例外かどうか処理
if (verResults[i].Exception != null)
{
}
// 件数を出力
if (verResults[i].DifferentRecords != 0 ||
verResults[i].NumRecordsOnlyOnSource != 0 ||
verResults[i].NumRecordsOnlyOnTarget != 0)
{
Console.WriteLine("差異のあるレコード数 =" + verResults[i].DifferentRecords);
Console.WriteLine("ソースのみのレコード数 =" + verResults[i].NumRecordsOnlyOnSource);
Console.WriteLine("ターゲットのみのレコード数 =" + verResults[i].NumRecordsOnlyOnTarget);
}
}
}
}
}
// エラー処理・検証設定の破棄
catch (Exception e)
{
Console.WriteLine(e.Message);
}
// 終了処理
finally
{
if (currentMetadata != null)
currentMetadata.Unload();
if (dbmServer != null)
dbmServer.Disconnect();
if (verifier != null)
{
verifier.OnDifference -= new Verifier.Difference(verifier_OnDifference);
verifier.OnError -= new Verifier.Error(verifier_OnError);
verifier.Dispose();
}
if (dbmApp != null)
dbmApp.Dispose();
}
Console.WriteLine("何か入力してください");
Console.ReadLine();
}
// 検証の際のエラーイベント
static void verifier_OnError(IReplication repl, Exception ex)
{
// Manage the exception
Console.WriteLine(ex.Message);
}
// 検証の際、差異のあったレコードの検出をトリガーとするイベント
static void verifier_OnDifference(IReplication repl, object[] srcAfterMapValues, object[] trgValues, System.Collections.ArrayList indexDifferences, DifferenceType diffRecordType)
{
Console.WriteLine("差異を検出");
}
}
}
関連したトピックス
- APIからレプリケーションの最新の実行件数を取得するサンプルスクリプト[C#] [Syniti DR (DBMoto)]
- APIからリフレッシュを実行するサンプルスクリプト[C#] [Syniti DR (DBMoto)]
- [DBMoto API]外部からレプリケーションやグループを開始・停止するサンプルC#プログラム
- レプリケーションの際にnullを特定の値に変換する方法 その1【リアルタイムレプリケーションツールDBMoto】
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方③:グローバルスクリプト用の関数とイベント
- Syniti Data Replication (旧DBMoto)でのスクリプトの書き方②:グローバルスクリプト
- [Ritmo/i] AS/400接続用サンプルC#プログラム
- [HiT JDBC/400] AS/400データ登録・更新・削除用サンプルJavaプログラム(JDBCドライバ)
- [HiT JDBC/400]AS/400接続用サンプルJavaプログラム(JDBCドライバ)
- レプリケーションの際にnullを特定の値に変換する方法 その2【リアルタイムレプリケーションツールDBMoto】