powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFDCommand и BLOB
10 сообщений из 10, страница 1 из 1
TFDCommand и BLOB
    #39660456
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TFDCommand возвращает одну запись с блобом. Как этот блоб можно оптимально записать в TStream?

Что делаю
Код: 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.
function TdmDB.LoadPacket(AID: Integer; AData: TStream): Boolean;
var
  LTable: TFDDatSTable;
  LRow: TFDDatSRow;
begin
  FDCommand1.CommandText := 'SELECT data FROM mytable WHERE id = :id';
  FDCommand1.ParamByName('id').AsInteger := AID;
  LTable := FDCommand1.Define;
  try
    FDCommand1.Open;
    try
      LTable.Clear;
      FDCommand1.Fetch(LTable, False);
      Result := FDCommand1.RowsAffected <> 0;
      if Result then begin
        LRow := LTable.Rows[0];
        {?????????}
      end.
    finally
      FDCommand1.CloseAll;
    end;
  finally
    LTable.Free;
  end;
end;



LRow.GetData возвращает Variant. Рассматривать его как массив байт (varArray or varByte) и забирать данные из него? Или есть другой способ?

FDQuery пока не рассматриваем.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39660457
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел такой перегруженный метод
Код: pascal
1.
2.
3.
function TFDDatSRow.GetData(const AColumn: Integer; AVersion:
  TFDDatSRowVersion; var ABuff: Pointer; ABuffLen: LongWord; var ADataLen:
  LongWord; AByVal: Boolean): Boolean;

сейчас попробую его
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39660464
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так, шо не работает?
Код: pascal
1.
2.
3.
    BStream := FDCommand1.CreateBlobStream(FDCommand1.FieldByName('Data'), bmRead);
    FStream := TFileStream.Create(FileName, fmCreate or fmShareExclusive);
    FStream.CopyFrom(BStream);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39660470
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийа так, шо не работает?
Код: pascal
1.
BStream := FDCommand1.CreateBlobStream(FDCommand1.FieldByName('Data'), bmRead);

Нет, конечно. TFDCommand - это не TDataSet

Вот так заработало
Код: 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.
function TdmDB.LoadPacket(AID: Integer; AData: TStream): Boolean;
var
  LTable: TFDDatSTable;
  LRow: TFDDatSRow;
  LData: Pointer;
  LSize: Cardinal;
begin
  FDCommand1.CommandText := 'SELECT data FROM mytable WHERE id = :id';
  FDCommand1.ParamByName('id').AsInteger := AID;
  LTable := FDCommand1.Define;
  try
    FDCommand1.Open;
    try
      LTable.Clear;
      FDCommand1.Fetch(LTable, False);
      Result := FDCommand1.RowsAffected <> 0;
      if Result then begin
        LRow := LTable.Rows[0];
        LData := nil;
        LSize := 0;
        if LRow.GetData(0, rvDefault, LData, 0, LSize, False) then
          AData.WriteBuffer(LData^, LSize);
      end.
    finally
      FDCommand1.CloseAll;
    end;
  finally
    LTable.Free;
  end;
end;

Только нужно быть очень аккуратным с номером столбца. В методе нет проверки передаваемого индекса и если промахнулся - получаешь AV вместо удобоваримого сообщения
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39660478
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39660760
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievЭто по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC Это видел. Но там FDQuery. А мне обвязка датасета не нужна
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39661075
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Dmitry ArefievЭто по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC Это видел. Но там FDQuery. А мне обвязка датасета не нужнаА чо так ? Датасеты более стандартны. Им не нужны сабжевые пляски с бубном.
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39661096
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Но там FDQuery. А мне обвязка датасета не нужна
Там все идет через параметры. Поэтому FDQuery или FDCommand - значения не имеет.
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39661284
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argoА чо так ? Датасеты более стандартны.И более тормознутые. Когда скорость не важна - можно хоть ADO использовать

Dmitry ArefievТам все идет через параметры.Вот этой конструкции автор
Код: pascal
1.
 FDQuery.SQL.Text := 'select :p = data.PathName() from FSTab where id = :id';

не увидел. Спасибо, будем знать.
...
Рейтинг: 0 / 0
TFDCommand и BLOB
    #39661288
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И более тормознутые.В данном случае - голословно.
Разница будет скорее теоретическая. Если она вообще будет.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFDCommand и BLOB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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