public void Run() { // Lấy thông tin cập nhật thay đổi trong DB Sql dựa theo trigger var selectCommand = String.Format("SELECT TOP ({0}) * FROM [LogTable] WHERE Status = {1} ORDER BY LogId", Utility.GetTopQuantity(), (int)Status.NEW); var logs = _sourceAccess.ExcuteRawQuery(selectCommand) as DataTable; var dict = new Dictionary <String, List <String> >(); var updateLogCommand = "UPDATE [LogTable] SET Status = {0} WHERE LogId = {1}"; var deleteLogCommand = "DELETE FROM [LogTable] WHERE LogId = {0}"; foreach (DataRow item in logs.Rows) { //Đánh dấu là trạng thái đang tiến hành đồng bộ var logId = item["LogId"].ToString(); _sourceAccess.ExcuteRawNonQuery(String.Format(updateLogCommand, (int)Status.SYNCED, item["LogId"])); var primaryKeyField = item["PrimaryKeyField"].ToString(); var primaryKeyValue = item["PrimaryKeyValue"].ToString(); var tableName = item["TableName"].ToString().Replace(",", ""); // Tạo câu truy vấn lấy dữ liệu từ CSDL Sql dựa theo khóa chính của từng bảng var selectQuery = item.ToDynamicSelect(primaryKeyField, primaryKeyValue); var dt = _sourceAccess.ExcuteRawQuery(selectQuery) as DataTable; // Với từng trường hợp Insert, Update, Delete tạo câu lệnh tương ứng để excute trên DB Oracle var type = item["Type"].ToString(); var changeCommand = ChangeFactory.CreateCommand(type, dt, tableName, primaryKeyField, primaryKeyValue); var sqlList = changeCommand.Excute(); dict.Add(logId, sqlList); } //Tiến hành đồng bộ sang CSDL Oracle dựa vào câu lệnh sinh ra foreach (var item in dict) { try { foreach (var tmp in item.Value) { _destinationAccess.ExcuteRawNonQuery(tmp); } _sourceAccess.ExcuteRawNonQuery(String.Format(deleteLogCommand, item.Key)); } catch (Exception ex) { Logger.Error(String.Format("Error sync with logId {0}: {1}", item.Key, ex)); _sourceAccess.ExcuteRawNonQuery(String.Format(updateLogCommand, (int)Status.ERROR, item.Key)); } } }