Firedac StoredProcedure output paraméter értéke NULL
2019-02-20T14:43:33+01:00
2019-02-25T15:24:31+01:00
2022-08-11T10:35:31+02:00
aszamosNEW
Sziasztok!

A problémám akövetkező lenne:

Adott egy tárolt eljárás mySQL ben
BEGIN
 SET inout_a=inout_a+1;
 SET out_b=in_test;
 INSERT INTO _executed_queries (DongleId, ThreadId, ExecDay, ExecTime, SPName, Parameter) VALUES   (7180, -1, 15, 0, 'Test1', in_test);
END
Parameters: IN in_test varchar(20),INOUT inout_a INT, OUT out_b Varchar(50)

ill egy delphi kód:

begin try testsp:=TFDStoredproc.Create(nil); try DAC.ConnectionIntf.Tracing:=True; testsp.Connection:=DAC; TestSp.FetchOptions.Items:=TestSp.FetchOptions.Items - [fiMeta]; testsp.StoredProcName:='test1'; testsp.Name:='testsp'; testsp.Params.Clear; with testsp.params.Add do begin name:='p1'; paramtype:=ptInput; datatype:=ftString; end; with testsp.params.Add do begin name:='p2'; paramtype:=ptInputOutput; datatype:=ftInteger; end; with testsp.params.Add do begin name:='p3'; paramtype:=ptOutput; datatype:=ftString; Size:=50; end; testsp.Prepare; testsp.ParamByName('p1').asString:='Első'; testsp.ParamByName('p2').asInteger:=0; testsp.ExecProc; ShowMessage(IntToStr(testsp.ParamByName('p2').AsInteger) +' '+testsp.ParamByName('p3').AsString); testsp.ParamByName('p1').asString:='Második'; testsp.ParamByName('p2').asInteger:=testsp.ParamByName('p2').AsInteger; testsp.ExecProc; ShowMessage(IntToStr(testsp.ParamByName('p2').AsInteger) +' '+testsp.ParamByName('p3').AsString); finally testsp.Free; end; except on e:exception do begin ShowMessage(e.Message); end; end;
A gond a következő:
az első execproc után a p2 és a  p3 paraméter üres 
a második execproc már elszáll ost connection during query hibával.

érdekeség hogy a Firedac elődjével, AnyDac -el ez lemegy valamit a 10.1 Berlin verzióval is 
Először delphi 10.2 nél tapasztaltam ezért gondoltam hogy bug lehet amit javítottak delphi 10.3 ban de sajnos avval se megy, így most arra gondolok, hogy valamit rosszul csinálok. 
Ha lenne valakinek használható ötlete azt megköszönném.

  Üdv:
    Aszamos
Mutasd a teljes hozzászólást!
Megoldódott:

Az FDConnection.ResourceOptions.AutoReconnect et TRUE ra kell állítani.

Amit javalsolnak
  FetchOption.mode:=fmAll;
  FetchOption.RowSetSize:=200-300;
  FetchOption.AutoClose:=True; <---Ez a default is 
  TxOption.AutoCommit:=true;
  ResourceOptions.AutoReconnect:=True;

Köszönöm Mindenkinek a segedelmet!
Mutasd a teljes hozzászólást!

  • Szia.
    Én nem vagyok nagy delphi tudású, de ha jól tudom, a paraméterek megadása után kellene a 
    Prepared.
    Mutasd a teljes hozzászólást!
  • Szia
    A leírás szerint prepare vagy prepared=true de az ott is vsn
    Mutasd a teljes hozzászólást!
  • Lehet, hogy a prepare felülírja az input/output direction-t? Esetelg próbáld utána beállítani...
    Üdv
    KGy
    Mutasd a teljes hozzászólást!
  • Sajnos volt az már minden helyen de nem segített :(
    Mutasd a teljes hozzászólást!
  • Ha ezt a két sort felcseréled ?
     TestSp.FetchOptions.Items:=TestSp.FetchOptions.Items - [fiMeta];
     testsp.StoredProcName:='test1';

     Tárolt eljárásod nevének megadásával kezdenéd ...
     testsp.StoredProcName:='test1';
     TestSp.FetchOptions.Items:=TestSp.FetchOptions.Items - [fiMeta];
    Mutasd a teljes hozzászólást!
  • Megpróbáltam de sajnos ez sem a megoldás :(
    Mutasd a teljes hozzászólást!
  • Nos a felét megoldottam, leírom hátha valaki belefut (hozzáteszem hogy ez csak a 10.2 től megy így a 10.1 és a firedac elődje (anydac) nál nem, ott működött a témaindító példa)
    Amit tapasztaltam, hogy ugyanazokat a neveket kell használni @ nélkül mint az SP ben és ennek érdekében a resourceoptions.unifyparams property -t false ra kell állítani.
    Így az első showmessage kiírja amit visszakap az SP től de a második exexproc már lost connection al elszáll. Erre kellene még valami magyarázat ha van valakinek valami a tarsolyban.

    testsp:=TFDStoredproc.Create(nil); try testsp.ResourceOptions.UnifyParams:=False; testsp.Close; testsp.Connection:=DAC; testsp.StoredProcName:='test1'; testsp.Name:='testsp'; TestSp.FetchOptions.Items:=TestSp.FetchOptions.Items - [fiMeta]; testsp.Params.Clear; testsp.Params.Add('in_test', ftString,50,ptInput); testsp.Params.Add('inout_a', ftInteger,7,ptInputOutput); testsp.Params.Add('out_b', ftString,50,ptOutput); testsp.ParamByName('in_test').asString:='Első'; testsp.ParamByName('inout_a').asInteger:=0; testsp.ExecProc; ShowMessage(IntToStr(testsp.ParamByName('inout_a').AsInteger) +' '+testsp.ParamByName('out_b').AsString); testsp.ParamByName('in_test').asString:='Második'; testsp.ParamByName('inout_a').asInteger:=testsp.ParamByName('inout_a').AsInteger; testsp.ExecProc; ShowMessage(IntToStr(testsp.ParamByName('inout_a').AsInteger) +' '+testsp.ParamByName('out_b').AsString); finally testsp.Free; end; except on e:exception do begin ShowMessage(e.Message); end; end;
    Mutasd a teljes hozzászólást!
  • Végeztem 1-2 kísérletet és ha az első execproc után egy szimpla lekérdezést futtatok le akkor is lost connection van. 
    Ha egy Insert SQL t és egy select SQL t futtatok le majd egy exeproc -ot  t akkor is minden rendben van. Viszont execproc után már semmit sem lehet. Természetesen az első execproc után a connection connected de amint valamin open, execsql, exeproc kerül lefuttatásra lost connection van.
    Persze a 10.1 el nincs ilyen probléma ugyan evvel a kóddal.
    Mutasd a teljes hozzászólást!
  • Megoldódott:

    Az FDConnection.ResourceOptions.AutoReconnect et TRUE ra kell állítani.

    Amit javalsolnak
      FetchOption.mode:=fmAll;
      FetchOption.RowSetSize:=200-300;
      FetchOption.AutoClose:=True; <---Ez a default is 
      TxOption.AutoCommit:=true;
      ResourceOptions.AutoReconnect:=True;

    Köszönöm Mindenkinek a segedelmet!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd