Работа с БД Firebird через Delphi

AlexanderP77
Дата: 24.11.2007 17:18:30
Господа, подскажите решение следующей задачи.
Есть сервер Firebird, есть несколько клиентов написанных на Delphi.
Каждый пользователь, вводит много записей в таблицу (через IBQuery), возможно когда-нибудь разные пользователи добавят одинаковую запись и возникнет ошибка.
Я пробовал перед добавлением новой записи, делать запрос на существовании этой в БД, и если записи нет то добавлял новую, но в результате экспериментов, выяснил что всё равно возникает ошибка.
Подскажите пожалуйста, как перед вставкой новой записи проверить её существование, и если эта запись уже существует, то делать только обновление.
И всё это должно работать в многопользовательском обращении к БД.
Если можно, то дайте несколько примеров.
Anatoly Podgoretsky
Дата: 24.11.2007 17:24:43
Это не возможно при наличии ограничений, а делать проверку бессмысленно во многопользовательской среде.
AlexanderP77
Дата: 24.11.2007 17:40:48
Anatoly Podgoretsky
Это не возможно при наличии ограничений, а делать проверку бессмысленно во многопользовательской среде.


А как же тогда быть?
То есть ошибки на ввод одинаковых записей разными пользователями быть не может?
Artemiy
Дата: 24.11.2007 17:49:08
При попытке создания записи - перехватывать ошибку, обрабатывать и в нормальном виде показывать пользователю. Все просто.
Гаджимурадов Рустам
Дата: 24.11.2007 17:52:55

AlexanderP77
Каждый пользователь, вводит много записей в таблицу (через IBQuery), возможно когда-нибудь разные пользователи
добавят одинаковую запись и возникнет ошибка.
Я пробовал перед добавлением новой записи, делать запрос на существовании этой в БД, и если записи нет то добавлял новую, но в
результате экспериментов, выяснил что всё равно возникает ошибка.

Такие вещи (проверки) нужно делать на уровне БД - ограничениями (constraints, ключи и т.д.).



AlexanderP77
Подскажите пожалуйста, как перед вставкой новой записи проверить её
существование, и если эта запись уже существует, то делать только обновление.
И всё это должно работать в многопользовательском обращении к БД.

Никак. Делайте попытку добавить запись, в случае возникновения
исключения (ошибки) ловите и обрабатывайте его.


Posted via ActualForum NNTP Server 1.4

AlexanderP77
Дата: 24.11.2007 18:01:01
Вот так правильно будет?

 with (IBDataSet1) do
   with (IBDataSet2) do
     with (IBDataSet3) do
  begin
    try
        Database.ApplyUpdates([IBDataSet1, IBDataSet2, IBDataSet3]);
        //.................
    except
     IBDataSet1.CancelUpdates;
     IBDataSet2.CancelUpdates;
     IBDataSet3.CancelUpdates;
    end;

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
Гаджимурадов Рустам
Дата: 24.11.2007 18:32:45

Нет. Неправильно все. Абсолютно все.


Posted via ActualForum NNTP Server 1.4

Док
Дата: 25.11.2007 00:56:12
Вообще-то, имхо, этот вопрос уместнее спросить на соответствующем форуме. Там ответ дадут быстрее.

Насколько я помню, вот тут лежит FAQ по ФИБам (там замечательная статья "Работа с транзакциями и их использование в FIBPlus." особенно часть 2) Если не обращать внимание на слово "FIBPlus", то может быть найдете ответ.

Док.
Kotъ-Begemotъ
Дата: 25.11.2007 02:43:12
Гаджимурадов Рустам

Нет. Неправильно все. Абсолютно все.


Posted via ActualForum NNTP Server 1.4


+1. Ведь для этого прдуман и реализован целый механизм ТРАНЗАКЦИЙ!!! RTFM!
Johnmen
Дата: 25.11.2007 03:28:52
AlexanderP77
Господа, подскажите решение следующей задачи.
Есть сервер Firebird, есть несколько клиентов написанных на Delphi.
Каждый пользователь, вводит много записей в таблицу (через IBQuery), возможно когда-нибудь разные пользователи добавят одинаковую запись и возникнет ошибка.
Я пробовал перед добавлением новой записи, делать запрос на существовании этой в БД, и если записи нет то добавлял новую, но в результате экспериментов, выяснил что всё равно возникает ошибка.
Подскажите пожалуйста, как перед вставкой новой записи проверить её существование, и если эта запись уже существует, то делать только обновление.
И всё это должно работать в многопользовательском обращении к БД.
Если можно, то дайте несколько примеров.

Ё-моё!
И для чего разработчики БД морщили мОзги много-много десятков лет! Неужели для того, чтобы пришел очередной чукча с севера и начАл задавать вопросы?
Наверное НЕТ!
Наверное, они в тайне надеялись, что те, кто будут использовать разработанные технологии, прочитают хоть что-нибудь, хоть малую толику исходного материала, чтобы быть в теме.
Неужели их чаяния напрасны, спрашиваем мы? Видимо да, напрасны. Ибо чукча есть чукча, однако...
Нужно ли этому чукче знание? Думается, что нет. А зачем? Тюлений мяса, олений мяса...теперь ещё и чёрный вода из-под земли.... Всё нормально, проблем нет...
...........
...........