Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird / 22 сообщений из 22, страница 1 из 1
04.12.2021, 22:03
    #40117390
dedRasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Довольно давно использовал такой кусок кода для сохранения шаблона отчета FastReport в БД из дизайнера FastReport (нашел на форуме и практически без изменений пользовал без малого 20 лет, начиная с Delphi, а теперь на Lazarus):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
function TdmIDK.frxDesSaveReport(Report: TfrxReport; SaveAs: Boolean): Boolean;
var
  vBlob1, vblob2: TStream;
  fname: string;
begin
  vBlob1 := nil;
  vBlob2 := nil;
  Result := false;
  fname := ExtractFileName(Report.FileName);
  if SaveAs then
    with sdlgRep do begin
      sdlgRep.FileName := fname;
      if Execute then begin
        Report.FileName := ExtractFileName(sdlgRep.FileName);
        fname := ExtractFileName(Report.FileName);
        Report.SaveToFile(sdlgRep.FileName);
      end;
    end;
  try
    if not fdsReports.Active then
      fdsReports.Open;
    if fdsReports.Locate('Rep_FName',fName,[loCaseInsensitive]) then
    begin
      if MessageDlg('В БД уже имеется такой отчет. Переписать?', mtConfirmation, [mbYes, mbCancel], 0) = mrYes then
        fdsReports.Edit
      else begin
        fdsReports.Close;
        exit;
      end;
    end
    else
    begin
      fdsReports.Append;
      fdsReports.FieldByName('Rep_FName').AsString := fName;
    end;
    fdsReports.FieldByName('Rep_Name').AsString             := Report.ReportOptions.Name;
    //fdsReports.FieldByName('Rep_Author').AsString         := Report.ReportOptions.Author;
    //fdsReports.FieldByName('Rep_CreateDate').AsDateTime   := Report.ReportOptions.CreateDate;
    //fdsReports.FieldByName('Rep_LastChange').AsDateTime   := Report.ReportOptions.LastChange;
    //vBlob1:= fdsReports.CreateBlobStream(fdsReports.FieldByName('Rep_Description'), bmReadWrite);
    //Report.ReportOptions.Description.SaveToStream(vBlob1);
    //vBlob1.Free;

    vBlob2:= fdsReports.CreateBlobStream(fdsReports.FieldByName('Rep_Blob'), bmReadWrite);
    Report.SaveToStream(vBlob2, true, true, true);
    fdsReports.Post;
    //fdsReports.CloseOpen(false);
    Result := True;
  finally
    vBlob2.Free;
  end;
end;


Недавно решил выпилить дублирование параметров шаблона отчета в таблицу и сразу получил ошибку IBX:
Invalid blob ID
на строке
Код: pascal
1.
    fdsReports.Post;


Но когда раскомментировал строки
Код: pascal
1.
2.
3.
    vBlob1:= fdsReports.CreateBlobStream(fdsReports.FieldByName('Rep_Description'), bmReadWrite);
    Report.ReportOptions.Description.SaveToStream(vBlob1);
    vBlob1.Free;


все опять заработало.
Не могу понять, как запись одного блоба в БД влияет на запись другого.

Lazarus 2.0.10
IBX версия Юрия Копнина http://visual-t.ru/
FastReport версия 6.8.5

Modify SQL для fdsReports:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
UPDATE REPORTS
SET
    REP_NAME =           :REP_NAME,
    REP_AUTHOR =         :REP_AUTHOR,
    REP_CREATEDATE =     :REP_CREATEDATE,
    REP_LASTCHANGE =     :REP_LASTCHANGE,
    REP_PICTURE =        :REP_PICTURE,
    REP_DESCRIPTION =    :REP_DESCRIPTION,
    REP_VERSIONBUILD =   :REP_VERSIONBUILD,
    REP_VERSIONMAJOR =   :REP_VERSIONMAJOR,
    REP_VERSIONMINOR =   :REP_VERSIONMINOR,
    REP_VERSIONRELEASE = :REP_VERSIONRELEASE,
    REP_CONNECTIONNAME = :REP_CONNECTIONNAME,
    REP_FNAME = :REP_FNAME,
    REP_BLOB = :REP_BLOB,
    COMMENT = :COMMENT
WHERE
    REP_ID = :OLD_REP_ID


Оба блоба определены как
Код: plsql
1.
BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET WIN1251
...
Рейтинг: 0 / 0
04.12.2021, 22:57
    #40117392
gpi
gpi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Попробуйте использовать
BLOB SUB_TYPE 0
...
Рейтинг: 0 / 0
04.12.2021, 22:59
    #40117393
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
dedRasta,

вообще-то, еще в оригинальном IBX сначала создается блоб, потом туда записывается инфа, потом закрывается блоб, а потом только делается Post.
http://www.ibase.ru/ibx#blob

А чтобы понять в чем проблема, надо посмотреть исходники блобстрима (видимо, достаточно глянуть Free). А мне лениво.
...
Рейтинг: 0 / 0
04.12.2021, 23:01
    #40117394
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
gpi,

это отношения не имеет. Тип 1 - "текстовый" блоб, 0 - бинарный. Однако, тут более корректен тип 0.
А segment size вообще значения не имеет, не надо его указывать или приводить.
(80 - это количество символов строки на алфавитно-цифровом терминале в 70-80-годах).
...
Рейтинг: 0 / 0
04.12.2021, 23:21
    #40117396
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Не надо bmReadWrite. Не бывает такого у Firebird.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2021, 14:23
    #40117454
dedRasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Dimitry Sibiryakov

Не надо bmReadWrite. Не бывает такого у Firebird.


А в IBX вроде есть:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
function TIBCustomDataSet.CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream;
var
  pb: PBlobDataArray;
  fs: TIBBlobStream;
  Buff: PChar;
  bTr, bDB: Boolean;
  ABlobID: TISC_QUAD;
begin
  Buff := GetActiveBuf;
  if Buff = nil then
  begin
    fs := TIBBlobStream.Create;
    fs.Mode := bmReadWrite;
    FBlobStreamList.Add(Pointer(fs));
    result := TIBDSBlobStream.Create(Field, fs, Mode);
    exit;
  end;
  pb := PBlobDataArray(Buff + FBlobCacheOffset);
  if pb^[Field.Offset] = nil then
  begin
    AdjustRecordOnInsert(Buff);
    pb^[Field.Offset] := TIBBlobStream.Create;
    fs := pb^[Field.Offset];
    FBlobStreamList.Add(Pointer(fs));
    fs.Mode := bmReadWrite;
    fs.Database := Database;
    fs.Transaction := Transaction;
    fs.UpdateTransaction := UpdateTransaction;
    fs.AutoStartTransaction := AutoStartTransaction;
    {if (Mode = bmWrite) and (not fs.UpdateTransaction.InTransaction)
       and AutoStartTransaction then
        fs.UpdateTransaction.StartTransaction;}

    ABlobID :=
      PISC_QUAD(@Buff[PRecordData(Buff)^.rdFields[FMappedFieldPosition[Field.FieldNo - 1]].fdDataOfs])^;
    fs.BlobID := ABlobID;
    if (CachedUpdates) then
    begin
      bTr := not UpdateTransaction.InTransaction;
      bDB := not Database.Connected;
      if bDB then
        Database.Open;
      if bTr then
        UpdateTransaction.StartTransaction;
      fs.Seek(0, soFromBeginning);
      if bTr then
        UpdateTransaction.Commit;
      if bDB then
        Database.Close;
    end;
    WriteRecordCache(PRecordData(Buff)^.rdRecordNumber, Pointer(Buff));
  end else
    fs := pb^[Field.Offset];
  result := TIBDSBlobStream.Create(Field, fs, Mode);
end;

...
Рейтинг: 0 / 0
05.12.2021, 14:31
    #40117455
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
dedRastaА в IBX вроде есть

А, да, я и забыл, что эти изверги сделали промежуточный буфер в виде
TMemoryStream...

Ну, в любом случае сабжевая ошибка это когда блоб пишется в одной транзакции, а запрос, его использующий - в другой. Шерсти.
...
Рейтинг: 0 / 0
05.12.2021, 16:45
    #40117477
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
dedRasta,

Переставить, как уже обращали внимание, Blob2.Free перед Post не пробовал?
...
Рейтинг: 0 / 0
05.12.2021, 17:32
    #40117485
dedRasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Vlad F
dedRasta,

Переставить, как уже обращали внимание, Blob2.Free перед Post не пробовал?


Да, и режим заменил на bmWrite, и тип блоба на binary - результат тот же.

Сейчас попробовал сделать сохранение в отдельном датасете с одной транзакцией:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
  object fdsRep2Db: TIBDataSet
    Database = dbIDK
    Transaction = trWrite
    AutoStartTransaction = True
    AutoCommit = True
    AutoTrim = True
    AutoParamToField = True
    RetFields = False
    BufferChunks = 1000
    CachedUpdates = False
    DeleteSQL.Strings = (
      'DELETE FROM'
      '    REPORTS'
      'WHERE'
      '        REP_ID = :OLD_REP_ID'
    )
    InsertSQL.Strings = (
      'INSERT INTO REPORTS('
      '    REP_ID,'
      '    REP_NAME,'
      '    REP_FNAME,'
      '    REP_BLOB'
      ')'
      'VALUES('
      '    :REP_ID,'
      '    :REP_NAME,'
      '    :REP_FNAME,'
      '    :REP_BLOB'
      ')'
    )
    RefreshSQL.Strings = (
      'SELECT'
      '    REP_ID,'
      '    REP_NAME,'
      '    REP_FNAME,'
      '    REP_BLOB'
      'FROM'
      '    REPORTS'
      ' WHERE'
      '        REPORTS.REP_ID = :OLD_REP_ID'
    )
    SelectSQL.Strings = (
      'SELECT'
      '    REP_ID,'
      '    REP_NAME,'
      '    REP_FNAME,'
      '    REP_BLOB'
      'FROM'
      '    REPORTS'
    )
    ModifySQL.Strings = (
      'UPDATE REPORTS'
      'SET'
      '    REP_NAME = :REP_NAME,'
      '    REP_FNAME = :REP_FNAME,'
      '    REP_BLOB = :REP_BLOB'
      'WHERE'
      '    REP_ID = :OLD_REP_ID'
    )
    GeneratorField.ApplyOnEvent = gaeOnNewRecord
    ParamCheck = False
    DefValueFromServer = False
    DetailConditoins = []
    Left = 440
    Top = 544
  end 


В процедуре:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
    if fdsRep2DB.Locate('Rep_FName',fName,[loCaseInsensitive]) then
    begin
        fdsRep2DB.Edit
	fdsRep2DB.FieldByName('Rep_Name').AsString           := Report.ReportOptions.Name;
	vBlob2:= fdsRep2DB.CreateBlobStream(fdsRep2DB.FieldByName('Rep_Blob'), bmWrite);
	Report.SaveToStream(vBlob2, true, true, true);
	vBlob2.Free;
	fdsRep2Db.Post;
    end;


теперь выдается ошибка тоже на Post, но другая, External SigSegV в модуле IBCustomDataSet.pas на строке 3856:
Код: pascal
1.
2.
3.
  end else if (result = grBOF) then begin
    CopyRecordBuffer(FModelBuffer, Buffer);
    PRecordData(Buffer)^.rdBookmarkFlag := bfBOF;
...
Рейтинг: 0 / 0
05.12.2021, 18:47
    #40117501
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
dedRasta,

Тебе, имхо, надо рассмотреть по исходникам (потрассировать) содержимое его метода Post. И нет ли у него навешанных обработчиков вокруг Post.
...
Рейтинг: 0 / 0
07.12.2021, 18:14
    #40118226
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Я сталкивался с таким, когда в одном экземпляре открывался DBGrid на таблицу
В это время из второго экземпляра запись таблицы с Блобом редактировалась
и при попытке открыть запись из 1-ой получал ошибку.
...
Рейтинг: 0 / 0
07.12.2021, 18:17
    #40118227
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
И дай угадаю: изоляция читающей транзакции была RORC...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.12.2021, 21:25
    #40118280
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Cobalt747,

А что ты имеешь ввиду под "открыть запись из 1-й"? Или тот блоб у тебя там первичным ключом?))
...
Рейтинг: 0 / 0
07.12.2021, 21:34
    #40118282
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Vlad F
Cobalt747,

А что ты имеешь ввиду под "открыть запись из 1-й"? Или тот блоб у тебя там первичным ключом?))

Зачем "первичным"? Обычные "умные" датасеты, которые "автоматически" тянут и содержимое блоба, не только ссылку на него.
...
Рейтинг: 0 / 0
07.12.2021, 21:42
    #40118283
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
ъъъъъ,

Прошу не забегать вперед, пусть ответить.
Товарищ задвигает про какое-то "открытие записи", а не подтягивание собственно блоба по устаревшему ID.
...
Рейтинг: 0 / 0
07.12.2021, 22:27
    #40118290
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Vlad F,

ты чего злой такой?
...
Рейтинг: 0 / 0
10.12.2021, 23:33
    #40119131
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Vlad F
Cobalt747,

А что ты имеешь ввиду под "открыть запись из 1-й"? Или тот блоб у тебя там первичным ключом?))

Из 1-го экземпляра приложения
...
Рейтинг: 0 / 0
11.12.2021, 12:26
    #40119177
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Cobalt747,

Я понял, что из первого, поясни подробнее, что значит "открыть".
...
Рейтинг: 0 / 0
11.12.2021, 15:11
    #40119237
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Vlad F,

чтение блоба
...
Рейтинг: 0 / 0
12.12.2021, 00:23
    #40119373
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Cobalt747
Vlad F,

чтение блоба

Слава богу, раскололся.
Самому понятно почему или рассказать сценарий?
P.S. От уровней изоляции не зависит.
...
Рейтинг: 0 / 0
12.12.2021, 08:38
    #40119380
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Vlad F
Cobalt747
Vlad F,

чтение блоба

Слава богу, раскололся.
Самому понятно почему или рассказать сценарий?
P.S. От уровней изоляции не зависит.

Расскажи, конечно
...
Рейтинг: 0 / 0
13.12.2021, 20:43
    #40119746
dedRasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
dedRasta
Vlad F
dedRasta,

Переставить, как уже обращали внимание, Blob2.Free перед Post не пробовал?


Да, и режим заменил на bmWrite, и тип блоба на binary - результат тот же.

Сейчас попробовал сделать сохранение в отдельном датасете с одной транзакцией:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
  object fdsRep2Db: TIBDataSet
    Database = dbIDK
    Transaction = trWrite
    AutoStartTransaction = True
    AutoCommit = True
    AutoTrim = True
    AutoParamToField = True
    RetFields = False
    BufferChunks = 1000
    CachedUpdates = False
    DeleteSQL.Strings = (
      'DELETE FROM'
      '    REPORTS'
      'WHERE'
      '        REP_ID = :OLD_REP_ID'
    )
    InsertSQL.Strings = (
      'INSERT INTO REPORTS('
      '    REP_ID,'
      '    REP_NAME,'
      '    REP_FNAME,'
      '    REP_BLOB'
      ')'
      'VALUES('
      '    :REP_ID,'
      '    :REP_NAME,'
      '    :REP_FNAME,'
      '    :REP_BLOB'
      ')'
    )
    RefreshSQL.Strings = (
      'SELECT'
      '    REP_ID,'
      '    REP_NAME,'
      '    REP_FNAME,'
      '    REP_BLOB'
      'FROM'
      '    REPORTS'
      ' WHERE'
      '        REPORTS.REP_ID = :OLD_REP_ID'
    )
    SelectSQL.Strings = (
      'SELECT'
      '    REP_ID,'
      '    REP_NAME,'
      '    REP_FNAME,'
      '    REP_BLOB'
      'FROM'
      '    REPORTS'
    )
    ModifySQL.Strings = (
      'UPDATE REPORTS'
      'SET'
      '    REP_NAME = :REP_NAME,'
      '    REP_FNAME = :REP_FNAME,'
      '    REP_BLOB = :REP_BLOB'
      'WHERE'
      '    REP_ID = :OLD_REP_ID'
    )
    GeneratorField.ApplyOnEvent = gaeOnNewRecord
    ParamCheck = False
    DefValueFromServer = False
    DetailConditoins = []
    Left = 440
    Top = 544
  end 


В процедуре:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
    if fdsRep2DB.Locate('Rep_FName',fName,[loCaseInsensitive]) then
    begin
        fdsRep2DB.Edit
	fdsRep2DB.FieldByName('Rep_Name').AsString           := Report.ReportOptions.Name;
	vBlob2:= fdsRep2DB.CreateBlobStream(fdsRep2DB.FieldByName('Rep_Blob'), bmWrite);
	Report.SaveToStream(vBlob2, true, true, true);
	vBlob2.Free;
	fdsRep2Db.Post;
    end;


теперь выдается ошибка тоже на Post, но другая, External SigSegV в модуле IBCustomDataSet.pas на строке 3856:
Код: pascal
1.
2.
3.
  end else if (result = grBOF) then begin
    CopyRecordBuffer(FModelBuffer, Buffer);
    PRecordData(Buffer)^.rdBookmarkFlag := bfBOF;



Оказывается, сам код сохранения шаблона в БД теперь работает нормально, если не использовать отладчик. А при использовании отладчика в программе с использованием FastReport этот самый External SigSegV возникает в самых неожиданных местах. Попробую написать в техподдержку.
Спасибо за помощь!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]