powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
22 сообщений из 22, страница 1 из 1
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
    #40117390
dedRasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Довольно давно использовал такой кусок кода для сохранения шаблона отчета 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
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
    #40117392
gpi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте использовать
BLOB SUB_TYPE 0
...
Рейтинг: 0 / 0
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
    #40117393
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dedRasta,

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

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

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

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

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

Переставить, как уже обращали внимание, Blob2.Free перед Post не пробовал?
...
Рейтинг: 0 / 0
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
    #40117485
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;
...
Рейтинг: 0 / 0
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
    #40117501
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dedRasta,

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

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

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

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

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

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

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

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

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

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

чтение блоба

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

чтение блоба

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

Расскажи, конечно
...
Рейтинг: 0 / 0
Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
    #40119746
dedRasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка IBX "Invalid blob ID" при сохранении шаблона FastReport в таблицу БД Firebird
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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