Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TFDCommand и BLOB / 10 сообщений из 10, страница 1 из 1
13.06.2018, 18:42
    #39660456
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
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
13.06.2018, 18:46
    #39660457
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
Нашел такой перегруженный метод
Код: 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
13.06.2018, 18:56
    #39660464
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
а так, шо не работает?
Код: 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
13.06.2018, 19:10
    #39660470
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
Мимопроходящийа так, шо не работает?
Код: 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
13.06.2018, 19:46
    #39660478
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
Это по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC
...
Рейтинг: 0 / 0
14.06.2018, 13:47
    #39660760
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
Dmitry ArefievЭто по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC Это видел. Но там FDQuery. А мне обвязка датасета не нужна
...
Рейтинг: 0 / 0
15.06.2018, 09:18
    #39661075
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
_Vasilisk_Dmitry ArefievЭто по значению. А это по ссылке:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC Это видел. Но там FDQuery. А мне обвязка датасета не нужнаА чо так ? Датасеты более стандартны. Им не нужны сабжевые пляски с бубном.
...
Рейтинг: 0 / 0
15.06.2018, 09:45
    #39661096
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
_Vasilisk_Но там FDQuery. А мне обвязка датасета не нужна
Там все идет через параметры. Поэтому FDQuery или FDCommand - значения не имеет.
...
Рейтинг: 0 / 0
15.06.2018, 14:19
    #39661284
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TFDCommand и BLOB
L_argoА чо так ? Датасеты более стандартны.И более тормознутые. Когда скорость не важна - можно хоть ADO использовать

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

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


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