2017-01-16 8 views
0

Preample:Как сохранить blob в базу данных через сервер DATASNAP REST?

Мы используем FireMonkey приложение затем взаимодействовать с DataSnap REST Server. Этот сервер использует базу данных SQLite. На стороне клиента мы используем FireDac Memtable для управления данными. Обычно для обновления данных мы редактируем FDMemTable, затем мы используем функцию ApplyUpdate, которая (в нескольких словах) создает TFDJSONDeltas, а затем передает ее на сервер для применения обновлений. Эта работа хорошо подходит для всех «стандартных» типов данных.

Теперь мы должны хранить blob в базе данных, которая является логотипом предприятия.

Некоторые исследования:

Мы нашли некоторые Exemple, которые используют Params и EXECUTE функцию FDQuery, но мы не имеем FDQuery на стороне клиента. Многие из примеров для FDQuery, мы не видим выборки для FDMemTable. FDMemtable не имеет функции ExecSQL.

Мы также видим много алго с TBlobStream (но если мы не пропустим правильную декларацию блока), этот объект, похоже, не будет реализован на стороне Firemonkey.

Вопрос:

Существует способ, чтобы выполнить эту задачу с помощью FDMemTable или лучше сначала загрузить изображение на сервер, а затем позволить серверу выполнить задачу, чтобы добавить изображение в области больших двоичных объектов?

ответ

3

Я могу отправить большое двоичные объекты поле DataSnap REST сервер с чем-то вроде этого:

сторона клиента:

var 
    mes: TMemoryStream; 
    FDMemUp: TFDMemTable; 
    LDeltaList: TFDJSONDeltas; 
    begin 
    mes:= TMemoryStream.Create; 

    FDMemUp:= TFDMemTable.Create(nil); 
    FDMemUp.CachedUpdates:= true; 
    FDMemUp.FieldDefs.Add('IMAGE',ftBlob); 
    FDMemUp.FieldDefs.Add('ID',ftInteger); 
    FDMemUp.CreateDataSet; 

    //append one record with blob field filled from stream 
    FDMemUp.Append; 
    (FDMemUp.FieldByName('ID') as TIntegerField).AsInteger:= 106; 
    (FDMemUp.FieldByName('IMAGE') as TBlobField).LoadFromStream(mes); 
    FDMemUp.Post; 

    //send dataset to server 
    try 
    try 
     LDeltaList:= TFDJSONDeltas.Create; 
     TFDJSONDeltasWriter.ListAdd(LDeltaList, 'INFOLOGO', FDMemUp); 
     Result:= DM.ServerCoreClient.SendData(LDeltaList); 
    except 
     Result:= nil; 
    end; 
    finally 
    FreeAndNil(FDMemUp); 
    FreeAndNil(mes); 
    end; 

Затем обрабатывают данные на стороне сервера:

function TDMCore.SendData(const ADeltaList: TFDJSONDeltas): boolean; 
var 
LApply: IFDJSONDeltasApplyUpdates; 
mes: TMemoryStream; 
begin 
LApply:= TFDJSONDeltasApplyUpdates.Create(ADeltaList); 
if (LApply.Values[0].RecordCount > 0) then 
    begin 
    mes:= TMemoryStream.Create; 
    LApply.Values[0].First; 
    while not LApply.Values[0].Eof do 
    begin 
    mes.Clear; 
    //read stream data from blob field 
    (LApply.Values[0].Fields[1] as TBlobField).SaveToStream(mes); 
    mes.Position:= 0; 
    //Use stream to insert in a database or create a image or whatever the stream represent 
    LApply.Values[0].Next; 
    end; 
    result:= true; 
    end else result:= false; 
end; 
+0

Спасибо Г-н Форнес, код строки, который мы искали, это: {(FDMemUp.FieldByName ('IMAGE') как TBlobField) .LoadFromS Tream (MES);} –

Смежные вопросы