2017-09-19 39 views
0

的FireDAC樣本項目(示範ArrayDML)c:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\Batch\Batch.dproj編譯與上Params[2].AsBlobs分配2個// W1058 Implicit string cast with potential data loss from string to rawbytestring警告與//W 1058表示:Params.asBlob分配給W1058

procedure TfrmBatch.btnExecSQLClick(Sender: TObject); 
var 
    i: Integer; 
    iTm: LongWord; 
begin 
    qrySelect.Open; 
    qrySelect.ServerDeleteAll(True); 
    qrySelect.Close; 
    with qryBatch do 
    if cbxBatchExec.Checked then begin 
     Params.ArraySize := StrToInt(edtArraySize.Text); 
     iTm := GetTickCount; 
     for i := 0 to Params.ArraySize - 1 do begin 
     Params[0].AsIntegers[i] := i; 
     Params[1].AsStrings[i] := 'string' + IntToStr(i); 
     Params[1].Size := 20; 
     if cbxInsertBlob.Checked then 
      Params[2].AsBlobs[i] := 'blob' + IntToStr(i); // W1058 
     end; 
     Execute(Params.ArraySize); 
     iTm := GetTickCount - iTm; 
    end 
    else begin 
     Params.ArraySize := 1; 
     iTm := GetTickCount; 
     for i := 0 to StrToInt(edtArraySize.Text) - 1 do begin 
     Params[0].AsInteger := i; 
     Params[1].AsString := 'string' + IntToStr(i); 
     Params[1].Size := 20; 
     if cbxInsertBlob.Checked then 
      Params[2].AsBlob := 'blob' + IntToStr(i);  // W1058 
     ExecSQL; 
     end; 
     iTm := GetTickCount - iTm; 
    end; 
    StatusBar1.SimpleText := 'Time executing is ' + FloatToStr(iTm/1000.0) + ' sec.'; 
    qrySelect.Open; 
end; 

什麼是解決這個正確的方法是什麼? (在FireDAC下,AsBlobs在Windows下已更改爲TFDByteString = RawByteString)。這兩種鑄造爲RawByteString()Params[2].Value分配使編譯器警告消失,但我不能確定它這不會導致潛在的問題......

回答

0

如果你決定在String類型變量存儲二進制BLOB數據,你可能會丟失它們,並且通過在參數值賦值之前向RawByteString添加類型轉換,您只需說編譯器,即表示您同意可能的數據丟失。沒有比這更多的了。

正確的方法是將您的BLOB數據存儲在此類參數的RawByteString類型變量中。