2017-01-16 52 views
0

Preample:如何通过Datasnap REST服务器将blob存储到数据库?

我们用那么Firemonkey应用程序与REST的DataSnap Server进行交互。该服务器使用SQLite数据库。在客户端,我们使用FireDac Memtable来管理数据。通常为了更新数据,我们编辑FDMemTable,然后我们使用一个名为ApplyUpdate的函数(用几句话)创建一个TFDJSONDeltas,然后将它传递给服务器以应用更新。这适用于所有“标准”数据类型。

现在我们必须在数据库中存储一个斑点,这是企业的标志。

一些调查:

我们发现了一些为例使用PARAMS和EXECUTE FDQuery的功能,但我们并没有一个FDQuery在客户端。许多示例都是针对FDQuery的,我们没有看到FDMemTable的示例。 FDMemtable没有ExecSQL功能。

我们也看到了很多算法和TBlobStream(但是除非我们错过了正确的单元声明),这个对象似乎并没有在Firemonkey方面实现。

问:

有执行使用FDMemTable还是最好先上传图片到服务器,然后让服务器执行任务的图像添加到BLOB字段这个任务的方法吗?

回答

3

我可以把BLOB字段用于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

谢谢Fornés先生,我们搜索的行代码是:{(FDMemUp.FieldByName('IMAGE')as TBlobField).LoadFromS tream(MES);} –

相关问题