Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

При закрытии приложения появляется двойная запись в БД [D7, IB6.x]


ProgC ©   (2004-09-22 06:44:00) 

Когда добавляю запись в БД, делаю коммит, то все прекрасно. Но стоит мне закрыть приложение, и если в IBTransaction действие по умолчанию стоит "Commit", то в базе появляется еще одна (такая же) запись. Что это и как избавиться?


ProgC   (2004-09-22 11:54:00) [1]

Ладно вечером проверю, потом напешу.


Rule   (2004-09-22 11:36:00) [2]

Rule ©   (22.09.04 11:35) [10]
а главное узнаешь когда он происходит ... и кто его вызвал


Rule   (2004-09-22 11:35:00) [3]

а ты поставь в событие автерпост showmessage и узнаешь сколько раз у тебя пост происходит


Johnmen   (2004-09-22 11:26:00) [4]

Чтобы не откравыть заново НД после коммита, делай CommitRetaining.


ProgC   (2004-09-22 11:20:00) [5]

Ладно, учту советы. После добавления вызывается

procedure TDataModule1.ActiveConnectBD();
var
 i: integer;
begin
 For i:=0 to IBDatabase_Main.DataSetCount-1 Do
   Begin
     IBDatabase_Main.DataSets[i].Active:=true;
   end;
end;

после этого выполнение программы пожно заканчивать.


Johnmen   (2004-09-22 11:08:00) [6]

И всё-таки чудес не бывает...:)
Попутно возникают вопросы.
Почему бы не сделать просто запрос INSERT INTO вместо вставки записи в набор данных ?
Если уж НД необходим, то почему бы не использовать IBDataSet, для этого предназначенный ? Ведь IBQuery несколько для др. целей.
А что делается после выполнения Commit'а ? Ведь НД после него будет закрыт.


ProgC   (2004-09-22 10:36:00) [7]


> Ну так программа твоя 2 (два) раза добавляет. Других вариантов
> нет. Чудес не бывает.


Запись появляется только если в IBTransaction действие по умолчанию Commit. Не должен он так себя вести, ведь транзакцию я уже подтвердил.


Johnmen   (2004-09-22 10:31:00) [8]

>ProgC   (22.09.04 10:05) [2]
>Для этого я и обратился в форум

Ну так программа твоя 2 (два) раза добавляет. Других вариантов нет. Чудес не бывает.


ProgC   (2004-09-22 10:31:00) [9]

Ладно:

 DataModule1.IBQuery_FieldInfo.Insert;
 DataModule1.IBQuery_FieldInfo.Fields[1].Value:=Tab.Fields[index].Name;
 DataModule1.IBQuery_FieldInfo.Fields[2].Value:=Tab.Fields[index].Caption;
 DataModule1.IBQuery_FieldInfo.Fields[3].Value:=Tab.Fields[index].FieldType;
 DataModule1.IBQuery_FieldInfo.Fields[4].Value:=Tab.Fields[index].FieldLength;
 DataModule1.IBQuery_FieldInfo.Fields[5].Value:=Tab.Fields[index].ValueType;
 DataModule1.IBQuery_FieldInfo.Fields[6].Value:=Tab.Fields[index].Dicsr;
 DataModule1.IBQuery_TableInfo.Locate('name', Tab.Name, []);
 DataModule1.IBQuery_FieldInfo.Fields[7].Value:=
 DataModule1.IBQuery_TableInfo.FieldValues['ID'];
 DataModule1.IBQuery_FieldInfo.Post;
 DataModule1.IBQuery_FieldInfo.Transaction.Commit;

где Tab - мой собственный класс

При выполнении этого кода добаляется запись в БД. Закрываем приложение, в БД, появляется еще одна идентичная запись.


Anatoly Podgoretsky   (2004-09-22 10:09:00) [10]

ProgC   (22.09.04 10:05) [2]
конкретное место - 17 строка.


ProgC   (2004-09-22 10:05:00) [11]

Во всем уже разобрался. Это мое не первое приложение с использованием БД. До этого было написанно полноценное приложение документооборота. Но на этот раз, что то не так. Можно ли указать конкретное место моей ошибки или не разобраное понятие?

З.Ы.


> Johnmen ©   (22.09.04 09:11) [1]
> 2. Разобраться с добавлением. Двойным добавлением !


Для этого я и обратился в форум


Johnmen   (2004-09-22 09:11:00) [12]

1. Разобраться с понятиями "база данных" и "таблица".
2. Разобраться с добавлением. Двойным добавлением !
3. Разобраться с транзакциями и их применением.


Наверх

Титульная страница Поиск, карта сайта Написать письмо