Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизДобавление записей. Найти похожие ветки
← →
Sapos © (2007-05-04 14:21) [0]День добрый!
Подскажите, пожалуйста, что может быть не так.
Есть база данных из 2-ух таблиц связанных между собой.
Добавляю запись в первую таблицу, сохраняю, затем сразу же додбавляю запись во 2-ую таблицу в сопоставление первой и у меня появляется ошибка: Form1.Dataset1.InsertQuery:
violation oа FOREGN KEY constraint. Если сделать Reconnect к базе, то тогда все нормально - есть возможность в сопоставление внесенной записи в первую таблицу добачить запись во вторую.
Использую набор компонентов FIBPlus
← →
ANB © (2007-05-04 14:48) [1]Скорее всего наборы данных работают в разных коннектах (сессиях). А добавление записи в родительскую таблицу незакоммичено.
← →
Sergey13 © (2007-05-04 15:00) [2]> [0] Sapos © (04.05.07 14:21)
А что ты пишешь в поле связи второй таблицы?
← →
Desdechado © (2007-05-04 15:26) [3]> в разных коннектах (сессиях)
Или транзакциях.
Или FK прямо на лету сделали.
← →
Sapos © (2007-05-04 15:46) [4]
> Скорее всего наборы данных работают в разных коннектах (сессиях).
> А добавление записи в родительскую таблицу незакоммичено.
>
Вообще должно быть закоммичено, использую сво-во AutoCommit в компоненте Transaction библиотеки FIBPlus.
← →
Sapos © (2007-05-04 15:47) [5]
> А что ты пишешь в поле связи второй таблицы?
значение я беру из первой таблицы и пишу его во вторую.
← →
Sapos © (2007-05-04 16:34) [6]
> Или FK прямо на лету сделали.
Да, сделан на лету: в первой таблице он генерится с помощью GEN_ID после чего он вставляется во вторую атоматом (из первой).
Подскажите способы решения?
← →
Sergey13 © (2007-05-04 16:47) [7]> [6] Sapos © (04.05.07 16:34)
> вставляется во вторую атоматом
Хотелось бы посмотреть на конструкцию этого автомата. 8-)
Проверь перед записью что ты туда (в поле связи) реально пишешь. Потом проверь что пишется после рестарта проги.
Обычно при вставке в М-Д связанные таблицы получают новое значение ключа ПЕРЕД вставкой.
← →
Desdechado © (2007-05-04 16:54) [8]> Или FK прямо на лету сделали.
Здесь имелось в виду не значение поля, а само ограничение.
Метаданные кэшируются при подключении, поэтому если делать винегрет из команд DDL и DML, то проблемы обеспечены.
← →
Sapos © (2007-05-04 16:59) [9]
> Хотелось бы посмотреть на конструкцию этого автомата. 8-
> )
> Проверь перед записью что ты туда (в поле связи) реально
> пишешь. Потом проверь что пишется после рестарта проги.
>
> Обычно при вставке в М-Д связанные таблицы получают новое
> значение ключа ПЕРЕД вставкой.
INSERT INTO NE(
NE_ID,
NENAME
)
VALUES(
:NE_ID,
:NENAME
)
перед вставкой (Before Insert) работает триггер:
NEW.NE_ID=GEN_ID(GEN_NE,1);
Если у меня не завершается транзакция, я не пойму почему!? FIBDataSet позволяет использовать AutoCommit...
← →
Desdechado © (2007-05-04 17:08) [10]> перед вставкой (Before Insert) работает триггер:
Это здорово, вот только твоя программа об этом триггере знает? Результат присвоения триггером знаяения полю она достает, или ты надеешься, что само подставится?
← →
Sapos © (2007-05-04 17:17) [11]
> Это здорово, вот только твоя программа об этом триггере
> знает? Результат присвоения триггером знаяения полю она
> достает, или ты надеешься, что само подставится?
По моему достает:
INSERT INTO ALARMS(
NE_ID,
ALARM_ID,
ALARMTEXT,
DESCRIPTION,
REQACT
)
VALUES(
:MAS_NE_ID, - берем из мастер таблицы
:ALARM_ID,
:ALARMTEXT,
:DESCRIPTION,
:REQACT
)
Я посмотрел, после поста новой записи в Мастер таблицу поле NE_ID принимает новое значение.
← →
Desdechado © (2007-05-04 17:30) [12]> берем из мастер таблицы
Каким боком? Кода не видно.
← →
Sapos © (2007-05-04 17:34) [13]
> Каким боком? Кода не видно
Не понял... Не видно что?
MAS_ - говорит о том, что я беру значение из мастер таблицы. В Мастер таблице оно уже есть.
← →
Desdechado © (2007-05-04 17:35) [14]> я беру значение из мастер таблицы
Это слова. Где код?
← →
Val © (2007-05-04 17:36) [15]>говорит о том
судя по возникшему топику - не говорит.
← →
Sapos © (2007-05-04 17:41) [16]Вот он:
VALUES(
:MAS_NE_ID, - берем из мастер таблицы
:ALARM_ID,
:ALARMTEXT,
:DESCRIPTION,
:REQACT
)
← →
Sapos © (2007-05-04 17:42) [17]В мастер и детэйл таблицах это поле называется одинаково.
← →
ANB © (2007-05-04 17:51) [18]
> :MAS_NE_ID, - берем из мастер таблицы
Кто сказал, что триггер что то знает о твоих параметрах и пытается их заполнять ?
Посмотри отладчиком, что конретно идет на запись в детал-табличку.
Скорее всего, твоя конструкция с триггером неработоспособна. Нужно дергать генератор не из триггера а из делфового клиента. До вставки в мастер-таблицу.
← →
Sapos © (2007-05-04 17:58) [19]
> Кто сказал, что триггер что то знает о твоих параметрах
> и пытается их заполнять ?
О каком тригере ты говоришЬ? В мастер таблицу значение этого триггера уже попало и сохранилось. Таблица Детэйл берет значение уже из мастер таблицы с помощью префикса MAS_.
Я склоняюсь к тому, что у меня не завершается транзакция, но как ее завершить используя FIBPlus я никак не пойму...
← →
Sapos © (2007-05-04 18:21) [20]Пока нашел выход: делаю реконнект к базе после вставки записи в Мастер таблицу... Неужели по-другому никак!?((((
← →
Desdechado © (2007-05-04 18:49) [21]> Таблица Детэйл берет значение уже из мастер таблицы с помощью префикса MAS_.
Чего-чего? Как таблица может что-то брать, да еще и с помощью какого-то префикса? Что, если я назову поле "TUDIT_EGO_V_KACHEL", что у меня мастер-детальной связки не получится?
Ты бы почитал теорию, что ли. FK означает всего лишь контроль целостности данных, проверку наличия вставляемого в детальную таблицу значения в мастер-таблице. Но FK не вставляет ничего самостоятельно, потому как ни сервер, ни FK не имеет ни малейшего представления, какое из сотен тысяч первичных ключей в мастер-таблице нужно использовать для твоего нового детального запроса.
← →
Johnmen © (2007-05-05 13:13) [22]
> Пока нашел выход: делаю реконнект к базе после вставки записи
> в Мастер таблицу...
Самое бредовое "решение" из всех возможных.
Срочно читать теорию! Потом программировать...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.042 c