![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
При закрытии приложения появляется двойная запись в БД [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. Разобраться с транзакциями и их применением.