Задать вопрос
@beduin01

Хак предотвращающий повторную вставку данных в PostgreSQL?

Есть очень кривой проект. В нем из веб-формы отправляется запрос на вставку данных в БД PostgreSQL.

После выполнения: ` command.ExecuteNonQuery(); ` почему-то в БД оказывается два экземпляра данных, хотя функция один раз вызывается.

public void Start()
{
            NpgsqlConnection conn = new NpgsqlConnection("Server=localhost;Port=5432;User Id=postgres;Password=123;Database=test;");
            conn.Open();

            NpgsqlCommand command = new NpgsqlCommand("insert into zayav.\"REQUESTS\"  (time_beg, time_end, sol_angle_min, sol_angle_max, priority, fl_ready, prod_type_id, customer_id) values(" + "'" + Beg_Planir_s + "','" + End_planir_s + "','" + Sol_angl_min_s + "','" + Sol_angl_max_s + "','" + Priority_s + "','" + Fl_ready_s + "','" + Prod_type_id_s + "','" + Customer_id_s + "')", conn);
            command.ExecuteNonQuery();
                    
            conn.Close();
}


Почему это происходит совершенно не понятно.
Интересует любой самый грязный хак который помог бы выполнить отправку данных только один раз. Можно на стороне БД, можно в самом Шарпе.

Просто идей почему этот метод работает не так нет. Нужно просто как-то обойти эту проблему.

P.S. На перфоманс и тд пофигу. Требуется тупо для отчета. Там весь проект такой кривой. Там проще с нуля переделать. Т.е. варианты любых костылей полностью устраивают.
  • Вопрос задан
  • 366 просмотров
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
pi314
@pi314
Президент Солнечной системы и окрестностей
Что конкретно значит "помог бы"? Однозначного хака, который сам собой все решит, скорее всего нет. Самый грязный хак, какой можно навскидку придумать - в БД добавить constraint на уникальность комбинации всех вставляемых полей, типа:
CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    UNIQUE (a, c)
);

Подробности: Раз - Два.

Это исключит на уровне БД саму возможность повторной вставки, однако, сильно просадит перформанс вставок вообще (и, заодно, может полoмать другие кривые места, если такие есть). "Поможет" ли это - вопрос неоднозначный, т.к., если проблема действительно в повторной вставке, в коде наверняка где-то (скорее всего, в недрах NpgsqlCommand), всплывет Exception (constraint violation). Возможно, это поможет найти кривое место :) Заодно это поможет выяснить, нет ли в БД уже дубликатов, т.к. если они есть, добавить constraint просто не удастся до тех пор, пока их не вычистить.

А кроме того, "в БД оказывается два экземпляра данных" cамо по себе требует уточнения. Если Вы смотрите в БД какой-нибудь независимой тулзой, то это одно, а если с помощю самого "кривого проекта", то проблема запросто может быть на самом деле не в БД, a в запросе, которым он выбирает данные из БД, или вообще в архитектуре (когда второй экземпляр появляется не из БД, а из какого-нибудь внутреннего списка, куда он тупо вставляется). В таком случае добавление constraint ничего не даст, но, опять же, этим и поможет локализовать проблему.

UPD: В любом случае, самое правильное - с помощью этого (или подобного) хака найти проблему, после чего хак убрать! :)

UPD2: Судя по тому, как передаются значения полей для вставки (в конструктор), этот "проект" - Эльдорадо для любителей SQL Injection. Так что, не удивляйтесь, когда в один не самый прекрасный день хакеры пришлют вам поздравительную открытку :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@ComodoHacker
Я бы посоветовал не искать грязные хаки, а найти причину и устранить ее. Для начала вставьте логирование в метод.

P.S. Какой ужасный код.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы