![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транзакция в АДО? [D5, MSSQL]
kvit © (2004-04-30 07:14:00)Проблема примера заключается в том, что в случае, если срабатывает условие (cbPlita.KeyValue>0), то нет записи в таблицу KVARTIRA. Если убрать блок обработки транзакции, то все Ок. Но мне нужен блок обработки транзакции.
Из таблицы KVARTIRA поле identity считывается с правильным значением.
Для более подробного наглядного пособия предоставляю полный код:
try
DM.LUES.BeginTrans;
//--------------------- KVARTIRA ----------------------
DM.Temp.Close;
DM.Temp.SQL.Clear;
DM.Temp.SQL.Add('insert into KVARTIRA (ID_dom, Kvart, FIO_Kvart, Lic_sch, cnt_komn, debet, kredit, saldo)');
DM.Temp.SQL.Add('values (:ID_dom, :Kvart, :FIO_Kvart, :Lic_sch, :cnt_komn, 0, 0, 0)');
DM.Temp.Parameters.ParamByName('ID_DOM').Value:=DM.DOM.FieldByName('ID_DOM').asInteger;
DM.Temp.Parameters.ParamByName('Kvart').Value:=trim(edKvart.text);
DM.Temp.Parameters.ParamByName('FIO_Kvart').Value:=trim(edFIO_Kvart.text);
DM.Temp.Parameters.ParamByName('Lic_Sch').Value:=trim(edLic_Sch.text);
DM.Temp.Parameters.ParamByName('Cnt_komn').Value:=edCnt_komn.Value;
DM.Temp.ExecSQL;
//---------
DM.Temp1.Close;
DM.Temp1.SQL.Clear;
DM.Temp1.SQL.Add('select distinct(@@identity) as ID_kvart from KVARTIRA');
DM.Temp1.Open;
ID_kvart:=DM.Temp1.FieldByName('ID_kvart').asInteger;
//-------------------- PLITA -----------------------
if (cbPlita.KeyValue>0) then
begin
DM.Temp2.Close;
DM.Temp2.SQL.Clear;
DM.Temp2.SQL.Add('insert into PLITA (ID_Kvart, plita_data, plita, plita_tarif)');
DM.Temp2.SQL.Add('values (:ID_Kvart, :plita_data, :plita, 0)');
DM.Temp2.Parameters.ParamByName('ID_Kvart').Value:=ID_Kvart;
DM.Temp2.Parameters.ParamByName('plita_data').Value:=dPLITA.Date;
DM.Temp2.Parameters.ParamByName('plita').Value:=cbPlita.KeyValue;
DM.Temp2.ExecSQL;
end;
//------------------------------------------------
DM.LUES.CommitTrans;
except
DM.LUES.RollbackTrans;
ShowError('Îøèáêà çàïèñè äàííûõ.');
exit;
end;
sniknik (2004-04-30 10:41:00) [1]> select @@identity as ID_kvart
> выдает не одну строку, а несколько одиннаковых
такой запрос несколько записей выдавать не может! вот тот что у тебя с привязкой к таблице без дистинкта вытаст по количеству записей в таблице. неужели не разглядел разницу в двух запросах? -> [5]
> Транзакции на сервере точно работают, это уже проверено в другой части программы.
почему же раньше не сказал что проверял? а это не вопрос просто расследование определенного метода работы?
отношение было бы другое.
kvit (2004-04-30 09:10:00) [2]Транзакции на сервере точно работают, это уже проверено в другой части программы.
Но меня раздирает вопрос почему ADOConnection.BeginTrans и .CommitTrans не дают такого же результата , ведь под BDE данный код работает????
kvit (2004-04-30 09:07:00) [3]Дело в том, что иногда бывает так, что просто
select @@identity as ID_kvart
выдает не одну строку, а несколько одиннаковых, по-этому не зная почему так проиисходит (этот процесс без закономерности) я стал себя перестраховывать и писать с оператором distinct
sniknik (2004-04-30 08:54:00) [4]а транзакзакцию на сервере sql командами как я говорил пробовал?
и вот это
select distinct(@@identity) as ID_kvart from KVARTIRA
бред
то же самое без задействования таблици
select @@identity as ID_kvart
kvit (2004-04-30 08:44:00) [5]KVARTIRA:
ID_kvart int (identity 1,1)
ID_dom int
Kvart varchar(6)
FIO_kvart varchar(100)
Lic_sch varchar(10)
cnt_komn int
debet Numeric(12,5)
kredit Numeric(12,5)
saldo Numeric(12,5)
PLITA:
ID_kvart int
plita_data datetime
plita int
plita_tarif numeric(12,5)
Почему без блока DM.LUES.BeginTrans, CommitTrans - Все отлично пишет, а с ними - только запись в последнюю таблицу.
В BDE такой номер работал? Может я неправильно уровни изоляции транзакции указал в ADOConnection (=ilCursorStability)?
sniknik (2004-04-30 08:34:00) [6]зачем повторятся?
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1083214133&n=1
тем более без изменений, от повторов того же самого лутше не станет.
рекомендаций не выполнил (советовал делать командами sql на сервере, да и вообще все можно в один блок запихнуть (необязательно процедуру но всетаки связанные данные нужно ложить в одном, максимально быстро без задержек между командами зависящих от клиента)), возникших вопросов не прояснил.. (со структурой к примеру, поле действительно автоинкремент?)
kvit (2004-04-30 08:06:00) [7]Соединение все через один ADOConnection
Hooch (2004-04-30 07:34:00) [8]во-первых BeginTrans до try, т.е.
BeginTrans
try
Commin
except
Rollback
end;
а коннекшин у Temp1 и Temp2 одинаковые ?