2017-06-08 41 views
1

我使用德爾福柏林。如何複製一個ftBlob與firedc arrayDML

我正在嘗試使用ArrayDML將FireDac查詢(連接到數據庫)的數據複製到另一個FireDac查詢(連接到另一個數據庫)的功能/過程。第一個數據庫是firebird,另一個是MSSQL,但在另一個情況下,兩個數據庫都是Firebird。

到目前爲止,所有的數據類型都工作正常,除了ftBlob。

這裏是函數體:

while not querySource.Eof do begin 
    paramPosition := -1; 
    Inc(mIndex); 

    for i := 0 to querySource.FieldCount - 1 do begin 
    Inc(paramPosition); 
    // daca exista o valoare 
    if querySource.FieldByName(querySource.Fields[i].FieldName).AsVariant <> Null then begin 
     case querySource.Fields[i].DataType of 
     ftDateTime, ftDate, ftTime, ftTimeStamp : queryInsert.Params[paramPosition].AsDateTimes[mIndex] := querySource.FieldByName(querySource.Fields[i].FieldName).AsDateTime; 
     ftFloat, ftCurrency, ftBCD, ftFMTBcd : queryInsert.Params[paramPosition].AsFloats[mIndex] := querySource.FieldByName(querySource.Fields[i].FieldName).AsFloat; 
     ftSmallint, ftInteger, ftLargeint  : queryInsert.Params[paramPosition].AsIntegers[mIndex] := querySource.FieldByName(querySource.Fields[i].FieldName).AsInteger; 
     ftString        : queryInsert.Params[paramPosition].AsStrings[mIndex] := querySource.FieldByName(querySource.Fields[i].FieldName).AsString; 
     ftBlob, ftMemo, ftGraphic    : queryInsert.Params[paramPosition].AsBlobs[mIndex]  := querySource.FieldByName(querySource.Fields[i].FieldName).AsVariant; 
     end; 
    end; 
    end; 

BLOB值不從源複製正確的值。

如何在這種情況下使用arrayDML?任何解決方法?

+0

嘗試使用'AsAnsiString'而不是'AsVariant'。或者調用[AssignFieldValue](http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Stan.Param.TFDParam.AssignFieldValue),因爲我看不到代碼中的DML數組好處。或者忘記這一切,並使用現成的解決方案:) – Victoria

+0

我還沒有使用arrayDML,但我敢肯定,這不是用blob工作的方式。看看你需要如何與Delphi一起使用blob工作 - http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Support_for_Blob_Streaming_in_FireDAC。也可以看看來自embarcadero的TFDQuery批處理示例http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/FireDAC.TFDQuery.Batch_Sample – RBA

+0

@RBA,DML索引參數'AsBlobs'預計與'AsBlob'相同。 – Victoria

回答

0

我不會回答你的問題,但建議你使用TFDBatchMove組件,因爲你在這裏重新發明輪子。 TFDBatchMove只是爲了你想要做的,將數據從一個數據庫移動到另一個(而不僅僅是)。

您只需將TFDBatchMoveSQLReader設置爲ReaderWriter,爲兩者編寫SQL查詢,組件將自動映射匹配名稱的字段。如果查詢不具有匹配的字段名稱,則可以使用Mappings屬性對此進行微調。然後你只需撥打Execute

+0

tks爲答案。作爲COPY工作正常。但我無法使其作爲AppendUpdate工作。你能指給我一個「真實和有效的」教程嗎?到目前爲止,我無法在這部分找到任何幫助。 –

+0

你是什麼意思「複製」?當[Mode](http://docwiki.embarcadero.com/Libraries/en/FireDAC.Comp.BatchMove.TFDBatchMove.Mode)屬性設置爲'dmAppendUpdate'時,你的意思是你有問題嗎?如果是這樣,那麼確保你的表具有主鍵字段? – Victoria

+0

兩個表都具有相同的PK。 IDINTEGER NOT NULL PRIMARY KEY。是的dmAppendUpdate是問題。在第一次運行模式= dmAppendUpdate正常工作,因爲dest表是空的。但在第二輪運行中,pk違規被提出。 –