Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как IBSQL (IBX 2.4) записывает блобы? / 25 сообщений из 34, страница 1 из 2
02.07.2021, 11:35
    #40081330
tantico2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Не удаётся записать в базу блоб при помощи IBSQL.
Вот два фрагмента кода:

1. Чтение из базы - проходит на ура:
Код: plaintext
1.
2.
3.
4.
5.
6.
  with IBSLQ1 do
  begin
    SQL.Text:='select blob_field from tab1 where id=1;';
    Transaction.StartTransaction;
    ExecQuery;
    FieldByName('blob_field').AsBlob.SaveToFile('image.bin');
    .....

2. Запись в базу - вылетает с ошибкой External: SIGSEGV в момент Param...LoadFromFile
Код: plaintext
1.
2.
3.
4.
5.
  with IBSQL1 do
  begin
    SQL.Text:='update tab1 set blob_field=:blob_field where id=1;';
    Transaction.StartTransaction;
    ParamByName('blob_field').AsBlob.LoadFromFile('image.bin');
   .....

Что не так во втором случае? И как это надо сделать правильно?
...
Рейтинг: 0 / 0
02.07.2021, 11:45
    #40081338
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
02.07.2021 11:35, tantico2 пишет:
> Что не так во втором случае? И как это надо сделать правильно?

у TIBSQL метод ParamByName('blob_field') возвращает объект класса TIBXSQLVAR.
изначально у TIBXSQLVAR не было проперти AsBlob.
но был метод LoadFromFile(const FileName: string).
чо там сейчас накрутил бешенный англосакс - х.з.
трассируй, смотри.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 12:08
    #40081348
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Что такое IBX 2.4? Это что-то времен Delphi 5? Сейчас в Rio IBX 19.19.

Далее, у TIBXSQLVAR свойства AsBlob никогда не было. Есть AsQuad, а LoadFromFile/SaveToFile - это методы самого TIBXSQLVAR.

С чем вы работаете - не понятно
...
Рейтинг: 0 / 0
02.07.2021, 12:12
    #40081349
tantico2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Мимопроходящий,
Помню, что раньше (в fibplus) так и делал: param ... LoadFromStream или File...
А сейчас в IBSQL нет у них такого метода.

Если идти по стеку при вызове ParamByName('blob_field').AsBlob то доходишь до

Код: plaintext
1.
2.
3.
4.
5.
function TIBSQLData.GetAsBlob: IBlob;
begin
  CheckActive;
  result := FIBXSQLVAR.GetAsBlob(AsQuad,nil);
end;

которая выдаёт nil что, в общем-то ожидаемо.
Но тогда должен быть способ сделать ему Create. Пробовал через создание MemorySream и BlobField подкопаться, но этот ParamByName('blob_field') ничего не принимает. Может сейчас это как-то по-новому делается?
...
Рейтинг: 0 / 0
02.07.2021, 12:13
    #40081350
tantico2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
_Vasilisk_,
https://mwasoftware.co.uk/ibx
Это самый свежий на сегодня, с поддержкой fb4. У меня lazarus, возможно в delphi другая нумерация
...
Рейтинг: 0 / 0
02.07.2021, 12:19
    #40081351
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
02.07.2021 12:08, _Vasilisk_ пишет:
> Что такое IBX 2.4?

это форк от бешенного англосакса.
надысь в форуме IB/FB обсуждали патчи к нему.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 12:34
    #40081359
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
tantico2Что не так во втором случае? И как это надо сделать правильно?

Use TIBBlobStream, Luke. Потом Quad из него присваивай полю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 12:41
    #40081365
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
02.07.2021 12:34, Dimitry Sibiryakov пишет:
> Use TIBBlobStream, Luke. Потом Quad из него присваивай полю.

нет там поля
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 12:46
    #40081369
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Пофиг, AsQuad есть же?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 12:51
    #40081370
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
02.07.2021 12:46, Dimitry Sibiryakov пишет:
>
> AsQuad есть же?..

в оригинальном IBX есть.
а вот то, что там наглосакс накрутил - х.з.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 13:00
    #40081376
tantico2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Dimitry Sibiryakov

Use TIBBlobStream, Luke. Потом Quad из него присваивай полю.

Вот на такое
Код: plaintext
1.
b:=TIBBlobStream.Create;
    ParamByName('blob_field').AsQuad:=b;
говорит: Incompatible type for arg no. 1: Got "TIBBlobStream", expected "TGDS_QUAD"
А метода b.AsQuad не существует.

Или я неправильно понял идею?
...
Рейтинг: 0 / 0
02.07.2021, 13:07
    #40081380
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
tantico2А метода b.AsQuad не существует.

А мозг существует?..

http://docwiki.embarcadero.com/Libraries/Sydney/en/IBX.IBBlob.TIBBlobStream.BlobID
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 13:08
    #40081382
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
tantico2, попробуй вместо TIBSQL заюзать TIBQuery.
(надеюсь что хоть там этот "творец" не накосячил)
...
Рейтинг: 0 / 0
02.07.2021, 13:10
    #40081383
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Dimitry Sibiryakov
tantico2А метода b.AsQuad не существует.
А мозг существует?..

http://docwiki.embarcadero.com/Libraries/Sydney/en/IBX.IBBlob.TIBBlobStream.BlobID у него совсем не тот IBX.
с вариантом от дебаркадера почти ничего общего.
...
Рейтинг: 0 / 0
02.07.2021, 13:10
    #40081384
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
const BufSize = 8 * 1024;

function TFBBlob.LoadFromStream(S: TStream): IBlob;
var Buffer: array [0..BufSize-1] of char;
    BytesRead: integer;
begin
  CheckWritable;
  S.Position := 0;
  repeat
    BytesRead := S.Read(Buffer,BufSize);
    Write(Buffer,BytesRead);
  until BytesRead = 0;
  Close;
  Result := GetIntf;
end;

Есть подозрение, что Close здесь таки лишний
...
Рейтинг: 0 / 0
02.07.2021, 13:37
    #40081394
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Мимопроходящийс вариантом от дебаркадера почти ничего общего.

Да пофиг, это свойство было ещё в FIBC от Дица. Весь TIBBlobStream, можно сказать,
существует исключительно ради него.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 14:07
    #40081401
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Мимопроходящий
у него совсем не тот IBX.

Надо тот как-то официально обозвать
...
Рейтинг: 0 / 0
02.07.2021, 14:17
    #40081406
tantico2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
_Vasilisk_
Есть подозрение, что Close здесь таки лишний

Туда даже не доходит. Где-то раньше облом.

С BlobID выходит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    
b:=TIBBlobStream.Create;
b.Mode := bmWrite;
b.Database := Database1;
b.Transaction := Transaction1;
b.LoadFromFile('image.bin');
ParamByName('blob_field').AsQuad:=b.BlobID; 

Стейтмент отрабатывает, но в blob_field прилетает мусор:
<Error - invalid BLOB ID [SQLState:42000, ISC error code:335544329]>

А мозг существует?
За советы спасибо, но держи себя в руках, Люк.
Не у всех меч такой лазерный как у тебя.

попробуй вместо TIBSQL заюзать TIBQuery
Да, держу как запасной вариант. Но хочелось с этим разобраться: то ли я отстал от модных трендов, то Томми не доглядел.
Тогда напишу ему...
...
Рейтинг: 0 / 0
02.07.2021, 14:48
    #40081417
tantico2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Забодал таки это блоб...

Код: plaintext
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.
function SaveToDB(AFile: String): Boolean;
const BufSize = 8 * 1024;
var
  b: TIBBlobStream;
  m: TMemoryStream;
  Buffer: array [0..BufSize-1] of char;
  BytesRead: integer;
begin
  Result := False;

  m := TMemoryStream.Create;
  m.LoadFromFile(AFile);
  m.Position:=0;

  b:=TIBBlobStream.Create;
  b.Mode := bmWrite;

  repeat
    BytesRead := m.Read(Buffer,BufSize);
    b.Write(Buffer,BytesRead);
  until BytesRead = 0;
  
  b.Finalize;

  with IBSQL1 do
  begin
    ParamByName('blob_field').AsQuad := b.BlobID;  
    ExecQuery;
    Result := RowsAffected > 0;
    Transaction.Commit;
    b.Free;
  end;
end;    

Но это, конечно, костыль и вряд ли такова была базовая идея автора фреймворка
...
Рейтинг: 0 / 0
02.07.2021, 15:25
    #40081423
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
tantico2,

Ну и зачем здесь TMemoryStream (который не плохо было бы удалять), если есть TFileStream и CopyFrom?
...
Рейтинг: 0 / 0
02.07.2021, 15:43
    #40081431
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
tantico2Стейтмент отрабатывает, но в blob_field прилетает мусор:

Finalize надо вызывать. Это кривое поделие уже содержит в себе TMemoryStream, добавлять
второй - перегонять воздух из пустого в порожнее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 16:11
    #40081438
tantico2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Да, все замечания верны и уместны. Просто второпях перебирал много вариантов - лишь бы заработало)
Всем спасибо за помощь!
...
Рейтинг: 0 / 0
05.07.2021, 15:50
    #40081845
tantico2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
На всякий случай оставлю здесь.
Вот, что ответил сам Тони по поводу этой ситуации:

The problem is that you are using TIBSQL in the way that you would use TIBDataset. However, TIBSQL is working directly with the underlying Firebird interface and that requires a different approach.

The call to ParamByName('blob').AsBlob returns the interface IBlob. The input parameter has not yet been set and so this always returns nil - hence the exception.

To set the value of the blob, you have to create a TIBBlobstream, load it from a file and assign the IBlob interface returned by TIBBlobStream to the param e.g.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
var b:TIBBlobStream;
begin
  b := TIBBlobStream.create;
 try
   b.Database := IBSQL.Database;
  b.Mode := bmWrite;
    b.LoadFromFile(...);
    IBSQL.ParamByName('blob').asBlob := b.blob;
  finally
    b.free;
...
Рейтинг: 0 / 0
05.07.2021, 15:55
    #40081846
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
05.07.2021 15:50, tantico2 пишет:
> The problem is that you are using TIBSQL in the way that you would use TIBDataset.

Проблема в том, что Тони - самовлюблённый надутый индюк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.07.2021, 00:46
    #40082236
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как IBSQL (IBX 2.4) записывает блобы?
Мимопроходящий,

Ага, переходите на IBO и будет вам щастье :)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как IBSQL (IBX 2.4) записывает блобы? / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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