Пример #1
0
        /// <summary>
        /// 各並列処理の終了時に、例外が発生していた場合の処理
        /// </summary>
        /// <param name="ar">非同期実行結果</param>
        static void CopyTableCallback(IAsyncResult ar)
        {
            AsyncResult  aResult = ar as AsyncResult;
            CopyTableDgt dgt     = aResult.AsyncDelegate as CopyTableDgt;

            try
            {
                dgt.EndInvoke(ar);
            }
            catch (Exception ex)
            {
                string tableName = ar.AsyncState as string;

                //TODO エラーログ出力
                Trace.TraceError(tableName + " : " + ex.Message);

                //throw;
            }
        }
Пример #2
0
        /// <summary>
        /// データベースの内容を複製する。
        /// ただし、以下を前提とする。
        /// (1)コピー先に対象のデータベースは存在している
        /// (2)コピー先テーブルのスキーマは、コピー元の同名テーブルと同じ
        ///
        /// データベース名はDB接続文字列(Initial Catalog)で指定する。
        /// </summary>
        /// <param name="srcConnStr">コピー元DB接続</param>
        /// <param name="destConnStr">コピー先DB接続</param>
        public void CopyDataBase(string srcConnStr, string destConnStr)
        {
            // コピー元のテーブル一覧を取得する
            List <string> srcTableNames = GetTableNames(srcConnStr);

            // コピー先のテーブル一覧を取得する
            List <string> destTableNames = GetTableNames(destConnStr);

            List <IAsyncResult> results = new List <IAsyncResult>();

            foreach (string destTableName in destTableNames)
            {
                if (!srcTableNames.Contains(destTableName))
                {
                    // DropされたテーブルをDropする
                    //TODO ログ出力(destTableName, "drop");
                    Trace.TraceInformation("drop " + destTableName);

                    string sql = MakeDropTableSql(destTableName);
                    counts[SqlType.Drop] -= ExecuteNonQuery(destConnStr, sql);
                }
                else
                {
                    // コピー先にあるテーブルを差分Updateする。
                    // この処理は、非同期に実行する。
                    //TODO ログ出力(destTableName, "update");
                    Trace.TraceInformation("update " + destTableName);

                    CopyTableDgt copyTableDgt = new CopyTableDgt(CopyTable);
                    IAsyncResult result       = copyTableDgt.BeginInvoke(srcConnStr, destConnStr, destTableName,
                                                                         new AsyncCallback(CopyTableCallback), destTableName);
                    results.Add(result);
                }
            }

            // 並列処理の終了を待つ
            foreach (IAsyncResult result in results)
            {
                result.AsyncWaitHandle.WaitOne();
            }

            results.Clear();

            foreach (string srcTableName in srcTableNames)
            {
                if (!destTableNames.Contains(srcTableName))
                {
                    // CreateされたテーブルをCreateする。
                    string sql = MakeCreateTableSql(srcConnStr, srcTableName);
                    counts[SqlType.Create] -= ExecuteNonQuery(destConnStr, sql);

                    // Createされたテーブルにデータを全件Insertする。
                    //TODO ログ出力(srcTableName, "insert");
                    Trace.TraceInformation("insert " + srcTableName);

                    CopyTableDgt copyTableDgt = new CopyTableDgt(CopyTable);
                    IAsyncResult result       = copyTableDgt.BeginInvoke(srcConnStr, destConnStr, srcTableName,
                                                                         new AsyncCallback(CopyTableCallback), srcTableName);
                    results.Add(result);
                }
            }

            // 並列処理の終了を待つ
            foreach (IAsyncResult result in results)
            {
                result.AsyncWaitHandle.WaitOne();
            }
        }