Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 TFDCommand и BLOB  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10493
TFDCommand возвращает одну запись с блобом. Как этот блоб можно оптимально записать в TStream?

Что делаю
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
13 июн 18, 18:42    [21489277]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10493
Нашел такой перегруженный метод
function TFDDatSRow.GetData(const AColumn: Integer; AVersion:
  TFDDatSRowVersion; var ABuff: Pointer; ABuffLen: LongWord; var ADataLen:
  LongWord; AByVal: Boolean): Boolean;
сейчас попробую его
13 июн 18, 18:46    [21489280]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29045

а так, шо не работает?
    BStream := FDCommand1.CreateBlobStream(FDCommand1.FieldByName('Data'), bmRead);
    FStream := TFileStream.Create(FileName, fmCreate or fmShareExclusive);
    FStream.CopyFrom(BStream);

Posted via ActualForum NNTP Server 1.5

13 июн 18, 18:56    [21489305]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10493
Мимопроходящий
а так, шо не работает?
BStream := FDCommand1.CreateBlobStream(FDCommand1.FieldByName('Data'), bmRead);
Нет, конечно. TFDCommand - это не TDataSet

Вот так заработало
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 вместо удобоваримого сообщения
13 июн 18, 19:10    [21489324]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9585
Это по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC
13 июн 18, 19:46    [21489374]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10493
Dmitry Arefiev
Это по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC
Это видел. Но там FDQuery. А мне обвязка датасета не нужна
14 июн 18, 13:47    [21490925]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
L_argo
Member

Откуда:
Сообщений: 292
_Vasilisk_
Dmitry Arefiev
Это по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC
Это видел. Но там FDQuery. А мне обвязка датасета не нужна
А чо так ? Датасеты более стандартны. Им не нужны сабжевые пляски с бубном.
15 июн 18, 09:18    [21492740]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9585
_Vasilisk_
Но там FDQuery. А мне обвязка датасета не нужна

Там все идет через параметры. Поэтому FDQuery или FDCommand - значения не имеет.
15 июн 18, 09:45    [21492821]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10493
L_argo
А чо так ? Датасеты более стандартны.
И более тормознутые. Когда скорость не важна - можно хоть ADO использовать

Dmitry Arefiev
Там все идет через параметры.
Вот этой конструкции
автор
 FDQuery.SQL.Text := 'select :p = data.PathName() from FSTab where id = :id';
не увидел. Спасибо, будем знать.
15 июн 18, 14:19    [21493867]     Ответить | Цитировать Сообщить модератору
 Re: TFDCommand и BLOB  [new]
L_argo
Member

Откуда:
Сообщений: 292
И более тормознутые.
В данном случае - голословно.
Разница будет скорее теоретическая. Если она вообще будет.
15 июн 18, 14:24    [21493883]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить