Текущий архив: 2004.05.23;
Скачать: CL | DM;
ВнизТранзакция в АДО? Найти похожие ветки
← →
kvit © (2004-04-30 07:14) [0]Проблема примера заключается в том, что в случае, если срабатывает условие (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;
← →
Hooch © (2004-04-30 07:34) [1]во-первых BeginTrans до try, т.е.
BeginTrans
try
Commin
except
Rollback
end;
а коннекшин у Temp1 и Temp2 одинаковые ?
← →
kvit © (2004-04-30 08:06) [2]Соединение все через один ADOConnection
← →
sniknik © (2004-04-30 08:34) [3]зачем повторятся?
http://delphimaster.net/view/3-1083214133/
тем более без изменений, от повторов того же самого лутше не станет.
рекомендаций не выполнил (советовал делать командами sql на сервере, да и вообще все можно в один блок запихнуть (необязательно процедуру но всетаки связанные данные нужно ложить в одном, максимально быстро без задержек между командами зависящих от клиента)), возникших вопросов не прояснил.. (со структурой к примеру, поле действительно автоинкремент?)
← →
kvit © (2004-04-30 08:44) [4]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:54) [5]а транзакзакцию на сервере sql командами как я говорил пробовал?
и вот это
select distinct(@@identity) as ID_kvart from KVARTIRA
бред
то же самое без задействования таблици
select @@identity as ID_kvart
← →
kvit © (2004-04-30 09:07) [6]Дело в том, что иногда бывает так, что просто
select @@identity as ID_kvart
выдает не одну строку, а несколько одиннаковых, по-этому не зная почему так проиисходит (этот процесс без закономерности) я стал себя перестраховывать и писать с оператором distinct
← →
kvit © (2004-04-30 09:10) [7]Транзакции на сервере точно работают, это уже проверено в другой части программы.
Но меня раздирает вопрос почему ADOConnection.BeginTrans и .CommitTrans не дают такого же результата , ведь под BDE данный код работает????
← →
sniknik © (2004-04-30 10:41) [8]> select @@identity as ID_kvart
> выдает не одну строку, а несколько одиннаковых
такой запрос несколько записей выдавать не может! вот тот что у тебя с привязкой к таблице без дистинкта вытаст по количеству записей в таблице. неужели не разглядел разницу в двух запросах? -> [5]
> Транзакции на сервере точно работают, это уже проверено в другой части программы.
почему же раньше не сказал что проверял? а это не вопрос просто расследование определенного метода работы?
отношение было бы другое.
Страницы: 1 вся ветка
Текущий архив: 2004.05.23;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.032 c