| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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(). В чем тут может быть дело? P.S.: Использую свойства всех компонентов по-умолчанию. |
| Автор: ksili 11.2.2008, 08:27 |
| Так он их не удаляет наверно потому что их ещё там нету (вы же их ещё не прокоммитили!) Попробуйте выполнить всё это в одном скрипте в IBExpert'e, вот увидите, что на эти delet'ы он вернёт ошибку |
| Автор: rOOxus 11.2.2008, 09:00 |
| Я первым делом попробовал выполнить эти же действия в сетке редактирования данных таблицы IBExpertа: добавил пять записей, потом три удалил и закоммитил... все корректно осталось две, а в моей программе остаються все пять У меня такое чуство, что я где-то аццки протупил, но где не могу понять... это же должго быть поще пареной репы |
| Автор: 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 | ||
| Господа, я прошу прощения, но мне кажеться вы не о том толкуем... Вчера под впечатлением от таких событий пошел к товарищу и вместе мы произвели такой вот тест:
Результат: На моем Ноуте ID TXT 1 NULL 2 NULL 3 NULL 4 NULL А У ТОВАРИЩА 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 14.2.2008, 17:30 |
| Вот собсно пример того как глючит. Если с помощью DBGrid добавить несколько записей с пустым полем TXT, потом удалить и нажать кнопочку, которая коммитит транзакцию, то удаленные записи не исчезнут. |
| Автор: Deniz 15.2.2008, 06:54 |
| не открывается твоя база(у меня fb 1.5.3), в какой версии делал? |
| Автор: rOOxus 15.2.2008, 09:31 |
| Ну и у меня firebird 1.5.3... делел IBExpert'ом 2007.07.20... |
| Автор: Akella 15.2.2008, 11:00 |
выполняет |