Obsługa pola BLOB w zestawieniu ZEOS + StoredProc

Obsługa pola BLOB w zestawieniu ZEOS + StoredProc
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Delphi v.13
Firebird v.5
ZEOS v.8
pole GRAFIKA tabeli GRAFIKI typu BLOB (binary)

Następująca konstrukcj działa OK (przepisuje grafikę do Image1)

Kopiuj
var
  SS: TStringstream;

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select GRAFIKA from GRAFIKI where ID = 5');
Query1.Open;

SS := TStringstream.Create(Query1.FieldByName('GRAFIKA').AsString);
Image1.Picture.LoadFromStream(SS);

Natomiast konstrukcja z wykorzystaniem StoredProc wykonuje się z błędami

Kopiuj
StoredProc1.StoredProcName := 'NAZWA_PROCEDURY';
StoredProc1.Params.Clear;

StoredProc1.Params.AddParam(StoredProc1.Params.CreateParam(ftInteger, 'ID', ptInput));
StoredProc1.ParamByName('ID').AsInteger := 5;

StoredProc1.Params.AddParam(StoredProc1.Params.CreateParam(ftBlob, 'GRAFIKA', ptOutput));

StoredProc1.ExecProc;

SS := TStringstream.Create(StoredProc1.ParamByName('GRAFIKA').AsString);
Image1.Picture.LoadFromStream(SS);

Dlaczego tak się dzieje ?
Sama procedura wykonuje się prawidłowo.
Powyższe wersje przy użyciu UNIDAC wykonywały się prawidłowo !

GS
  • Rejestracja: dni
  • Ostatnio: dni
1

masz bloba typu binary (subtype 0) , a czytasz z niego (.asstring) jak ze znakowego (subtype 1)

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1623
0

Sprawdziłem w moim kodzie i prócz tego na zeosach musisz na komponencie bazodanowym w operacjach na plikach binarnych zmienić:

Kopiuj
TransactIsolationLevel := tiReadCommitted;

a po operacji wrócić do

Kopiuj
finally
      mem.Free;
      dm.db.TransactIsolationLevel := tiNone;
    end;

ja mam coś takiego mniej więcej:

Kopiuj
try
  dm.db.TransactIsolationLevel := tiReadCommitted;
...
  mem.Position := 0;
  spRaportyEdit.ParamByName('aszablon').LoadFromStream(mem,ftBlob);
  spRaportyEdit.ExecProc;
...
finally
  mem.Free;
  dm.db.TransactIsolationLevel := tiNone;
end;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.