/// <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; } }
/// <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(); } }