Problem z polami Blob w procedurach składowanych

0

Mam problem z zapisywaniem danych typu MEMO w polach Blob z wykorzystaniem procedur składowanych w Interbase. W niektórych procedurach (ale nie wszystkich) podczas próby zapisu pojawia się błąd: "Invalid BLOB ID". Zapisanie tego samego bez korzystania z procedury składowanej (instrukcją INSERT) przebiega bezproblemowo. Jeżeli ktoś miał podobne doświadczenia proszę o poradę, jak sobie z tym problemem poradzić.
Szukałem w tematach forum, ale niestety nie nic nie znalazłem na ten temat.
Z góry dziękuję za pomoc :-)

0

Najlepiej pokaż fragment procki przez który jest wylotka.

0

Oto fragment procedury:

with DataModule1 do begin
IBStoredProc1.StoredProcName:= 'NEW_KONTRPOZ';
try
for i:= 0 to High(aPoz) do
if aPoz[i].toSave then begin
aPoz[i].ktrid:= ktr;
if aPoz[i].id = 0 then with IBQuery1 do begin
Prepare;
....
ParamByName('ftermin').AsDate:= aPoz[i].termin;
ParamByName('fnote').Assign(aPoz[i].note);
ParamByName('ftyp').AsInteger:= aPoz[i].typ;
....
UnPrepare;
ExecProc; <---- tu się wywala
aPoz[i].id:= ParamByName('fid').AsInteger;
end;
end;
except
on E: Exception do begin
ErrorMessage('KtrObject.TKontrakt_Poz.Save; błąd - '+E.Message,
'Nieudana próba zapisania pozycji kontraktu',2);
end;
end;

0

A co to jest aPoz[i].note ? Jeśli to zwykły string, a pole fnote to BLOB SUB_TYPE 1 to użyj AsString.

0

Oczywiście "aPoz[i].note" to pole typu TStringList, a pole "fnote" to BLOB SUB_TYPE 1, więc typy pól sa odpowiednie. Zreszta jak wspomniałem wcześniej, przy zapisie bezpośrednio za pomocą instrukcji INSERT lub UPDATE wszystko gra i nie ma błędów. Ta sama kombinacja w niektórych innych tablicach działa bez zarzutu również w procedurach składowanych. Na razie obchodze problem używając INSERT, ale jest to dla mnie mało wygodne w przypadkach, kiedy zwrotnie potrzebuję identyfikatora nowo wstawionego rekordu.

0

No to spróbuj:

ParamByName('fnote').AsString := aPoz[i].note.Text;

Jakoś nie przywykłem do robienia Assign, choć może to powinno i działać, a może brakuje Ci sprawdzania czy aPoz[i].note nie jest przypadkiem nil'em.

0

Dzięki serdeczne!!!

Poszło bez problemu. Ja dotychczas zawsze posługiwałem się metodą Assign, ale jak widać w tym wypadku lepsze jest potraktowanie listy jako jednego ciągu znakowego. Nie przyszło mi to do głowy, a bawię się w te klocki juz parę ładnych lat. Co prawda Interbasem zacząłem posługiwać się dopiero w tym roku. Jeszcze raz dziękuję za pomoc. :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1