예제 #1
0
        /// <summary>
        /// Обновление информации о сотруднике
        /// </summary>
        /// <param name="id"></param>
        /// <param name="data"></param>
        /// <param name="session"></param>
        public void UpdateOfficer(int id, OfficerDataIn data, string session)
        {
            try
            {
                using (var _connection = new NpgsqlConnection(MainConnection.GetConnectionString()))
                {
                    _connection.Open();

                    var _transaction = _connection.BeginTransaction();

                    try
                    {
                        var sqlQueryOfficer = string.Format(@"UPDATE {0}officer SET firstname = @firstname, surname = @surname, patronymic = @patronymic, birthdate = @birthdate
                                                               WHERE id = @id
                                                           RETURNING ID", MainConnection.GetSQLNamespace());

                        using (var _postgreCommand = new NpgsqlCommand(sqlQueryOfficer, _connection))
                        {
                            _postgreCommand.Parameters.AddWithValue("id", id);
                            _postgreCommand.Parameters.AddWithValue("firstname", data.Name);
                            _postgreCommand.Parameters.AddWithValue("surname", Utils.NoNullValue(data.SurName));
                            _postgreCommand.Parameters.AddWithValue("patronymic", Utils.NoNullValue(data.Patronymic));
                            _postgreCommand.Parameters.AddWithValue("birthdate", data.BirthDate);

                            _postgreCommand.ExecuteNonQuery();
                        }

                        DeleteLink(id, session, _connection);

                        if (data.Posts != null && data.Posts.Count() > 0)
                        {
                            foreach (var post in data.Posts)
                            {
                                CreateOfficerPost(id, post.ID, session, _connection);
                            }
                        }

                        _transaction.Commit();
                    }
                    catch (Exception e)
                    {
                        _transaction.Rollback();
                        throw;
                    }
                }
            }
            catch (Exception e)
            {
                throw new Exception("Ошибка обновления данных сотрудника в БД.", e);
            }

            if (_setting.Value.ChachedEmployee)
            {
                try
                {
                    _cache.EditOfficer(id, data, session);
                }
                catch (Exception e)
                {
                    // Логгирование ошибки, работа продолжится через БД
                    // Необходимо изменить состояние кэша не невалидное, чтобы избежать чтение из неверного кэша
                    //throw new Exception("Ошибка обновления данных сотрудника в кэше.", e);
                }
            }
        }