Текущий архив: 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.51 MB
Время: 0.027 c