Firebiard2.5+Delphi+IBObjects - invalid transaction handle (expecting explicit transaction start)
Есть простенький проект на Delphi7 с компонентами IBO - IB_Connection и IB_DSQL. Если IB_DSQL использовать без IB_Transaction, то всё отрабатывает идеально. Но так делать автор IBO не рекомендует.
А как только я прописываю в свойстве IB_DSQL.IB_Transaction ссылку на компонент IB_Transaction, мой IB_DSQL падает сразу на Prepare по экзцепшну: "invalid transaction handle (expecting explicit transaction start)", даже если я перед Prepare делаю Transaction.StartTransaction {?}. Хотя Transaction.InTransaction показывает true.
Вот фрагмент кода. Строка, на которой падает, помечена {!}.
with dsqlSaveNewOrder do begin
IB_Transaction.StartTransaction; {?}
if not Prepared then
Prepare; {!}
ParamByName('aRef_Id').AsInteger :=ARefId;
ParamByName('aName').AsString := AName;
ExecSQL;
if FieldByName('err').AsInteger <> 0 then begin
IB_Transaction.Rollback;
Result := -1971;
WLog('ERROR: '+FieldByName('msg').AsString);
end
else begin
IB_Transaction.Commit;
Result := FieldByName('oId').AsInteger;
WLog('Order #'+IntToStr(ARefId)+' "'+AName+'" saved in local storage');
end;
end;
Вот SQL, который прописан в IB_DSQL.SQL:
execute procedure saveNewOrder(:aRef_Id,:aName)
Или такой SQL, но с аналогичным результатом:
select oId,err,msg
from saveNewOrder(:aRef_Id,:aName)
Свойства всех компонентов выставлены по умолчанию.
Ответы (1 шт):
Решилось просто: удалением IB_Transaction с формы и сознанием новой IB_Transaction c тем же самым Name и с теми же всеми остальными свойствами, которые, как и в изначальном варианте, были все по умолчанию.
Итого: Если компонент ведёт себя "странно", имеет смысл пересоздать его.