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

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

Транзакция в АДО? [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 одинаковые ?


Наверх

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