1

FireDAC 示例项目(演示 ArrayDML)在编译时对用指示的分配c:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\Batch\Batch.dproj有两个// W1058 Implicit string cast with potential data loss from string to rawbytestring警告:Params[2].AsBlobs//W 1058

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赋值都会使编译器警告消失,但我不确定这不会导致潜在问题......

4

1 回答 1

1

如果您决定将二进制 BLOB 数据存储在String类型变量中,您可能会丢失它们,并且通过在该参数值分配之前向RawByteString添加类型转换,您只是说编译器,您同意潜在的数据丢失。没有什么比这更多了。

正确的方法是将您的 BLOB 数据存储在此类参数的RawByteString类型变量中。

于 2017-09-19T12:01:33.740 回答