Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > IBTransaction


Автор: rOOxus 10.2.2008, 13:27
На форме клиентского приложения имеються компоненты IBDatabase IBTransaction IBTable DataSource DBGrid.
Для записи изменений в таблицу БД использую метод IBTransaction->Commit() но не все изменения попадают в таблицу!
Если например я добавил несколько записей через IBTable->Insert(), потом несколько из этих же записей удалил IBTable->Delete(), а потом выполнил IBTransaction->Commit(), то удаление не выполняеться так как будто я и не выполнял IBTable->Delete(), а только IBTable->Insert().
В чем тут может быть дело?  smile 

P.S.: Использую свойства всех компонентов по-умолчанию.

Автор: ksili 11.2.2008, 08:27
Так он их не удаляет наверно потому что их ещё там нету (вы же их ещё не прокоммитили!)
Попробуйте выполнить всё это в одном скрипте в IBExpert'e, вот увидите, что на эти delet'ы он вернёт ошибку

Автор: rOOxus 11.2.2008, 09:00
Я первым делом попробовал выполнить эти же действия в сетке редактирования данных таблицы IBExpertа: добавил пять записей, потом три удалил и закоммитил... все корректно осталось две, а в моей программе остаються все пять  smile.
У меня такое чуство, что я где-то аццки протупил, но где не могу понять... это же должго быть поще пареной репы  smile 

Автор: ksili 12.2.2008, 12:44
Ну просто IBExpert несколько умнее, чем кажется. Когда там вручную запись добавляешь, это не выполняется запрос, а просто в гриде добавляется строка. Запрос выполняется только когда нажимаете коммит, он видит две стоки в гриде, вот их и коммитит.

Повторяю: нельзя удалить то, чего ещё нет

Автор: jsa 13.2.2008, 09:12
rOOxus, ес-но будет так, все данные будут в буфере базы, а реальные изменения будут после переконекта, если хочешь сразу, делай так:
IBTransaction.StartTransaction;
...... // insert or update
IBTransaction.Commit;

Автор: rOOxus 13.2.2008, 10:05
Господа, я прошу прощения, но мне кажеться вы не о том толкуем...
Вчера под впечатлением от таких событий пошел к товарищу и вместе мы произвели такой вот тест:
  • Создаеться база данных (ну например 001.fdb) с помощью IBExpert.
  • В ней делаеться табличка TAB01 с полями ID INTEGER, TXT VARCHAR(10)
  • Создаеться элементарное клиентское приложение, в котором присутствует связка IBDatabasу->IBTransaction->IBTable->DataSource->DBGrid (ну и еще DBNavigator) у транзакции не устанавливаються никакие свойства! Все по-умолчанию.
  • Выполняються следущие действия: в TAB01 добавляються записи методом Insert:
    ID TXT
    1 NULL
    2 NULL
    3 NULL
    4 NULL
    Потом методом Delete удаляються записи
    ID TXT
    1 NULL
    2 NULL
  • Выполняються методы 
    Код

    IBTransaction.Commit;
    IBTable.Open;

Результат:

На моем Ноуте

ID TXT
1 NULL
2 NULL
3 NULL
4 NULL

А У ТОВАРИЩА  smile :

ID TXT
3 NULL
4 NULL

Не поленитесь проделайте это эксперемент у себя. Интересно что получиться?





Автор: Deniz 13.2.2008, 11:17
rOOxus, а если сделать такой же тест у тебя? Именно с созданием новой БД и нового клиента?
Еще укажи полные версии Delphi, IBX, FireBird/InterBase.
PS: Можешь прилепить сюда свои исходники.

Автор: rOOxus 13.2.2008, 14:54
Сервер - FB 1.5.3.4870-0
IDE - C++ Builder 6
IBX - 2007.07.20
Создал новую базу в ней табличку... написал элементарное клиентское приложение... вроде все работает нормально.  Добавляю, удаляю, коммичу... все корректно.
Короче дело явно в старой БАЗЕ.  Что же с ней то не так было?
Старую базу рисовал в Дизайнере БД, потом экспортировал в скрипт и запускал его... Может в скрипте что-то не так... (он кстати прилагаеться)

Автор: Deniz 13.2.2008, 15:06
Ты прикалываешься, там список таблиц кошмарный (слишком много), или у тебя со всеми так?
Проверь права на удаление.
Возможно в программе есть события на удаление.

Автор: rOOxus 14.2.2008, 09:19
В программе нет никаких событий вообще... Заметил что глюк возникает именно с теми записями, где есть пустные поля

Автор: ksili 14.2.2008, 09:34
Цитата(rOOxus @  13.2.2008,  18:54 Найти цитируемый пост)
Короче дело явно в старой БАЗЕ.  Что же с ней то не так было?

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

Автор: rOOxus 14.2.2008, 17:30
Вот собсно пример того как глючит. Если с помощью DBGrid добавить несколько записей с пустым полем TXT, потом удалить и нажать кнопочку, которая коммитит транзакцию, то удаленные записи не исчезнут.

Автор: Deniz 15.2.2008, 06:54
Цитата(rOOxus @  13.2.2008,  17:54 Найти цитируемый пост)
Сервер - FB 1.5.3.4870-0
не открывается твоя база(у меня fb 1.5.3), в какой версии делал?

Автор: rOOxus 15.2.2008, 09:31
Ну и у меня firebird 1.5.3... делел IBExpert'ом 2007.07.20...

Автор: Akella 15.2.2008, 11:00
Цитата(ksili @  12.2.2008,  12:44 Найти цитируемый пост)
Когда там вручную запись добавляешь, это не выполняется запрос, 

выполняет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)