APIからレプリケーション結果の検証やデータ整合を実行するサンプルスクリプト[C#] [Syniti DR (DBMoto)]


今回はスクリプトの例として、レプリケーション結果を比較してデータに差異がないか、差異があった場合にデータの同期をとる、レプリケーション結果比較機能を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("差異を検出");
        }

    }
}

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。

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