Firebiard2.5+Delphi+IBObjects - invalid transaction handle (expecting explicit transaction start)

Рейтинг: 0Ответов: 1Опубликовано: 02.06.2023

Есть простенький проект на 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)

Свойства всех компонентов выставлены по умолчанию.

Ответы

▲ 0

Решилось просто: удалением IB_Transaction с формы и сознанием новой IB_Transaction c тем же самым Name и с теми же всеми остальными свойствами, которые, как и в изначальном варианте, были все по умолчанию.

Итого: Если компонент ведёт себя "странно", имеет смысл пересоздать его.