Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.13;
Скачать: CL | DM;

Вниз

Чем ADO лучше BDE и как с этим бороться?! :(((   Найти похожие ветки 

 
kvit ©   (2004-04-29 08:48) [0]

Я пишу БД под MS SQL Server 7.0.
Все предыдущие БД я писал под BDE, а теперь делаю прорыв своих познаний и решил написать под ADO, но вот подводные камни с транзакциями:

Пример ситуации:

try
 DM.MyDB.BeginTrans;

 DM.Query1.ExecSQL;  // insert into table1
 DM.Query2.ExecSQL;  // insert into table2
 
 DM.MyDB.CommitTrans;
except
 DM.MyDB.RollbackTrans;
end;

Беда в том, что изменения вносятся только в table2. А  в table1 ничего нет, хотя поле identity читается после вставки в table1 нормально.

Ребята!!! Профи!!!
Есть ли у кого-нибудь хорошая документация по ADO, а куски не законченных статей!


 
sniknik ©   (2004-04-29 09:10) [1]

> Чем ADO лучше BDE
ничем не лутше, оно другое.

> Беда в том, что изменения вносятся только в table2
странно аналогичный код у меня работает как и ожидается. небольшие различися
использую ADOCommand для не возвращающих рекордсет комманд
транзакцию делаю командами SQL - BEGIN TRANSACTION завершение/откат аналогично.
и третье самое важное мой код я знаю. (видел)

> Есть ли у кого-нибудь хорошая документация по ADO, а куски не законченных статей!
в msoffice есть хорошая справка.


 
bushmen ©   (2004-04-29 09:18) [2]

> Беда в том, что изменения вносятся только в table2

На мой взгляд проще использовать хранимые процедуры в этом случае


 
kvit ©   (2004-04-29 09:22) [3]

Я согласен, что нужно делать через хранимую процедуру, но зачем ломать привычные стереотипы??

Для более подробного наглядного пособия предоставляю полный код:
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;


 
Artem03   (2004-04-29 10:14) [4]

1. Использовать BeginTrans, CommitTrans и RollbackTrans в данном случае не обязательно т.к. MS SQL все это делает сам автоматически по умолчанию (в крайнем случае надо делать так: ADOQuery1.SQL.Text:="BEGIN TRAN", ADOQuery1.ExecSQL, затем тоже самое для COMMIT TRAN или ROLLBACK TRAN)
2. @@IDENTITY возвращает ПОСЛЕДНЕЕ значение в базе
(@@IDENTITY Returns the last-inserted identity value), посмотри Help из QueryAnalizer"a.
3. Если поле обозначено, как identity, то MS SQL САМ вставляет в него следующее значение, так что возможная ошибка в том, что ты пытаешься ему явно указать значение.
Так что, тут нужна документация не по ADO, а по MS SQL.


 
Andriy Tysh ©   (2004-04-29 10:18) [5]


> kvit ©   (29.04.04 09:22) [3]

Советую делать проверку:
if DM.Temp.ExecSQL=1 then {good} else {bad};
или
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.SQL.Add("SELECT @@ROWCOUNT INSROWS");
DM.Temp.Open;
if DM.Temp.FieldByName("INSROWS").AsInteger=1 then {вставило} else {не вставило}


 
Nikolay M. ©   (2004-04-29 10:34) [6]


> Я согласен, что нужно делать через хранимую процедуру, но
> зачем ломать привычные стереотипы??

Я тоже с этим согласен и мой стереотип состоит в том, что транзакциям место только на сервере, а управление ими с клиента - лженаука и происки капиталистов.


 
vlbelugin   (2004-05-20 21:50) [7]

ADO тормозит по сравнению даже с BDE. По моему самый лучший движок dbExpress


 
Vlad ©   (2004-05-20 21:52) [8]


> ADO тормозит по сравнению даже с BDE. По моему самый лучший
> движок dbExpress

Лучшая рыба - колбаса.

P.S. А компоненты прямого доступа к базе еще лучше


 
KADAN   (2004-05-20 22:21) [9]


> А компоненты прямого доступа к базе еще лучше

Название привлекательное... а де их взять?


 
sniknik ©   (2004-05-20 23:12) [10]

> ADO тормозит по сравнению даже с BDE. По моему самый лучший движок dbExpress
в обоих случаях реализуется один режим ADO, в dbExpress прямо прописано используется OLE DB драйвер (ADO), BDE в случае его mssql линка - х.з. а в случае с ODBC делает редирект на тот же ADO. делаете анологичные настройки получите то же самое (и даже чуть быстрей, т.к. уберете посредника)

>> А компоненты прямого доступа к базе еще лучше
> Название привлекательное... а де их взять?
а не существует таких в природе для MSSQL, оно конечно еще как понимать сам "прямой" доступ и к чему.
http://delphimaster.net/view/3-1084048202/



Страницы: 1 вся ветка

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.037 c
3-1084970091
nik7777
2004-05-19 16:34
2004.06.13
Ошибка: Invalid Blob ID


1-1086059536
sacred
2004-06-01 07:12
2004.06.13
Вызов процедуры


14-1085565049
Knight
2004-05-26 13:50
2004.06.13
Как вылечить дозвон в Win2k?


1-1086150441
ZHK
2004-06-02 08:27
2004.06.13
ReadCоmponent и WriteComponent


1-1085921536
ilnarab
2004-05-30 16:52
2004.06.13
Функция для выбора файла