2017-01-16 51 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);} –

相關問題