Ejemplo n.º 1
0
        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));
                }
            }
        }