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

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

Чем ADO лучше BDE и как с этим бороться?! :((( [D5, MSSQL]


kvit ©   (2004-04-29 08:48:00) 

Я пишу БД под 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-05-20 23:12:00) [1]

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

>> А компоненты прямого доступа к базе еще лучше
> Название привлекательное... а де их взять?
а не существует таких в природе для MSSQL, оно конечно еще как понимать сам "прямой" доступ и к чему.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1084048202&n=1


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


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

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


Vlad   (2004-05-20 21:52:00) [3]


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

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

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


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

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


Nikolay M.   (2004-04-29 10:34:00) [5]


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

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


Andriy Tysh   (2004-04-29 10:18:00) [6]


> 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 {не вставило}


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

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.


kvit   (2004-04-29 09:22:00) [8]

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

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


bushmen   (2004-04-29 09:18:00) [9]

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

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


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

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

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

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


Наверх

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