Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.033 c
3-1083134812
Негодов
2004-04-28 10:46
2004.05.23
Обработка данных перед выводом их в DBGrid


1-1084032461
Мыш
2004-05-08 20:07
2004.05.23
Отрисовка меню


14-1083468735
mfender
2004-05-02 07:32
2004.05.23
Я вижу в нем "американский английский" ! :)


11-1072285336
SAGE
2003-12-24 20:02
2004.05.23
Компиляция KOL 1.88 под FPC???


14-1083579274
Undert
2004-05-03 14:14
2004.05.23
Services