Текущий архив: 2005.11.06;
Скачать: CL | DM;
ВнизПочему при выполнении пишет Transaction is active ? Найти похожие ветки
← →
Fast2 (2005-10-13 19:03) [0]procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
if CanWriteToBD then begin //ф-ю CanWriteToBD см ниже - она проверяет, есть ли запись в таблице
IBTransaction1.StartTransaction;
try
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add("INSERT INTO CLIENT (name) VALUES
("+chr(39)+Edit1.Text+chr(39)+")");
IBQuery1.ExecSQL;
IBTransaction1.Commit;
except
IBTransaction1.Rollback;
end;
end else ShowMessage("Клиент "+Edit1.text+" уже есть в базе данных!"); end;
//ф-ция проверяет наличие клиента по введенному юзером в Edit2 его (клиента) идентиф. коду
function TForm1.CanWriteToBD:boolean;
begin
Result:=false;
IBQuery2.Close;
IBQuery2.SQL.Clear;
IBQuery2.SQL.Add("SELECT ID FROM CLIENT WHERE ID=:P_ID");
IBQuery2.ParamByName("P_ID").AsString:=Edit2.Text;
IBQuery2.Open;
if IBQuery2.RecordCount=0 then result:=true;
IBQuery2.Close;
end;
Когда я не проверяю ф-цией наличие клиента (по его ID), то данные без проблем заносятся в базу. Но как только проверяю функцией (CanWriteToBD), то выдает ошибку "Transaction is active".
← →
Fast2 (2005-10-13 19:37) [1]никто не знает? Помогите, пож.
← →
msguns © (2005-10-14 13:41) [2]Видимо, у тебя IBQuery2 указана в контексте той же транзакции, что и Query1
Когда ты просто выполняешь Q1, транзакция страртует и завершается. Стоит же тебе прдварительно запустить Q2, как он сам неявно запускает эту же транзакцию и не завершает ее. После чего в основном коде у тебя следует попытка:IBTransaction1.StartTransaction;
← →
Fast2 (2005-10-14 14:55) [3]IBQuery2 не указывает ни на какую транзакцию (поле в свойствах IBQuery2.Transaction пустое) и все равно - эта же ошибка.
Ну хорошо, а какие могут быть варианты решения проблемы?
← →
Digitman © (2005-10-14 15:15) [4]
> IBQuery2 не указывает ни на какую транзакцию
а IBQuery1 на какую указывает ?
что за каша вообще ?
взялся явно управлять транзакциями ? так и управляй ими явно ! а не полагайся на дифолты в соотв.свойствах компонентов !
← →
Stakan © (2005-10-14 15:17) [5]Fast2 (14.10.05 14:55) [3]
Запрос может выполняться только в рамках какой-либо транзакции. То есть у тебя IBQuery2 тоже выполняется в рамках транзакции IBTransaction1.
Поставь в код проверкуif not IBTransaction1.InTransaction then
IBTransaction1.StartTransaction
← →
msguns © (2005-10-14 15:30) [6]>Fast2 (14.10.05 14:55) [3]
>IBQuery2 не указывает ни на какую транзакцию (поле в свойствах IBQuery2.Transaction пустое) и все равно - эта же ошибка.
А поле DataBase не пустое ? А если нет, то в TIBDataBase есть DefaultTransaction.
Очевидно, что если в Q2 нет явной ссылки на транзакцию, она использует ту, которая предполагается в коннекте по умолчанию, т.е. Transaction1.
Ни один запрос в ИБ не может быть выполнен вне транзакций. Если бв Q2 не ссылалась прямо или косвенно на какую-нибудь транзакцию, то IBX просто выдал бы соотв. сообщение.
>Ну хорошо, а какие могут быть варианты решения проблемы?
В ИБ можно работать с транзакциями двояко:
1. Неявно, используя механизм, заложенный в методах IBX. Как правило, это удовлетворит клиента, работающего по модели "удаленного" доступа, т.е. когда его изменения не становятся видны другим сразу же, и он сам не видит то, что меняется другими (хорош для однопользовательского варианта). В этом случае, как правило, все запросы "укладываются" в одну единственную транзакцию.
2. Явное управление, когда к приложению предъявляются повышенные требования по интерактивности вносимых изменений. В этом случае одной транзакцией, как правило, не обойдешься. Для правильной организации работы по этой технологии необходимо более детальное знание механизма транзакций, версионности данных и т.д. Т.е. надо читать.
← →
Fast2 (2005-10-14 17:59) [7]Спасибо за ответы <msguns © (14.10.05 15:30) [6] > и <Stakan © (14.10.05 15:17) [5] >
Прошу простить за глупый вопрос - я только начинаю разбираться с транзакциями. Но насколько я знаю, для SELECT не обязательно явно открывать транзакцию, в отличие от INSERT и UPDATE. Это не так?
← →
DiamondShark © (2005-10-14 18:36) [8]ЛЮБОЙ запрос выполняется в контексте какой-либо транзакции, явной или неявной.
Никакой разницы между SELECT, UPDATE или DELETE нет.
← →
Fast2 (2005-10-14 18:47) [9]т.е., если я решил управлять транзакциями ЯВНО, то это надо делать абсолютно для всех "движений" по базе?
Страницы: 1 вся ветка
Текущий архив: 2005.11.06;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.053 c