在Delphi中使用带有UIBQuery的Firebird将图片存储到Blob

时间:2013-03-17 12:05:31

标签: delphi blob firebird image

我有组件:

  • 1 OpenPictureDialog(打开图片)
  • 2 Edit(edtID& edtName)
  • 1 Button(保存记录)

我使用UIBQuery插入新记录,包括一个部分中的图片。 这是我的代码:

with UIBQuery1 do
try
  SQL.Clear;
  SQL.Add('INSERT INTO EMPLOYEE');
  SQL.Add('(ID, NAME, PIC)');
  SQL.Add('VALUES');
  SQL.Add('(:ID, :NAME, :PIC)');
  params.AsInteger[0] := StrToInt(edtID.Text);
  params.AsString[1] := edtName.Text;
  // How to give a param for blob here?
  Execute;
  Transaction.Commit;
  bsSkinMessage1.MessageDlg2('Has been saved.','New Record',mtInformation,[mbok],0);
except
  Transaction.RollBack;
  raise;
end;

我成功地显示了包括数据库图片在内的记录,但我没有任何线索可以将图片存储到数据库中一次点击。

如何做到这一点?可以在查询中给出图片参数吗?


有人知道UIB请...

我更改了我的代码,但是我遇到了访问冲突:

procedure TchfEmployee.btnSaveClick(Sender: TObject);
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  Image2.Picture.Bitmap.SaveToStream(ms);
  ms.Position:=0;
    begin
      with UIBQuery1 do
      try
        SQL.Clear;
        SQL.Add('INSERT INTO EMPLOYEE');
        SQL.Add('(ID, NAME, PIC)');
        SQL.Add('VALUES');
        SQL.Add('(:ID, :NAME, :PIC)');
        params.AsString[0] := edtID.Text;
        params.AsString[1] := edtName.Text;
        TBLOBField(Params.ByNameAsString['PIC']).LoadFromStream(ms);
        Execute;
        Transaction.Commit;
        bsSkinMessage1.MessageDlg2('Has been saved.','New Record',mtInformation,[mbok],0);
      except
        Transaction.RollBack;
        raise;
      end;
      try
        UIBDataSet1.Close;
        UIBDataSet1.Open;
       except
        raise;
      end;
    end;
end;

如何使用UIBQuery将我的TImage保存到BLOB?我真的很沉重。

2 个答案:

答案 0 :(得分:0)

试试这个:

...
ParamsSetBlob('PIC', ms);
Execute;
...

查看UIB源代码。寻找TUIBStatement类。

答案 1 :(得分:0)

您需要执行以下操作: -

Var
  lStream : TMemoryStream;
Begin
  lStream := TMemoryStream.Create;
  Try
    Image2.Picture.SaveToStream(lStream);
    lStream.Position := 0;
    Query.ParamSetBlob('Pic', lStream);
  Finally
    FreeAndNil(lStream);
  End;
End;