Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

Чем 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.106 c
6-1082779446
Aplay
2004-04-24 08:04
2004.06.13
мак адрес по ip в сети


3-1085461631
korvin
2004-05-25 09:07
2004.06.13
Синтаксис серверных процедур.


9-1075981475
Hex0DesiMaL
2004-02-05 14:44
2004.06.13
Трейнеры


1-1085842810
Yaguar
2004-05-29 19:00
2004.06.13
Может есть какая функция для работы с дин. массивом?


4-1083927471
Vadim S
2004-05-07 14:57
2004.06.13
Подскажите работающий Browse Folder для D5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский