如何将(Jpeg)图像保存到MySql并在以后检索它?

Maw*_*awg 1 mysql delphi ado

寻找代码示例,最好使用TADOConnection.

我想将TImage的TPicture保存到MySql(最好是ODBC,而不仅仅是MySql)数据库,之后我想创建一个TImage并将图片检索到其TPicture属性.

任何代码片段,或链接到同一个?

vcl*_*per 11

您可以使用BLOB字段.假设您有一个TAdoDataset实例,并且您想要编辑图像字段.你可以使用这样的代码:

  AStream := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(AStream);
    AStream.Position := 0;
    if ADODataSet1.Active then
    begin
      ADODataSet1.Edit;
      TBlobField(ADODataSet1.FieldByName('MyField')).LoadFromStream(AStream);
      ADODataSet1.Post;
    end;
  finally
    AStream.Free;
  end;
Run Code Online (Sandbox Code Playgroud)

您还可以使用数据感知的DBImage控件,并将任何图像加载到其中意味着将该图像加载到该字段中.

要检索字段数据并将其加载到TImage实例中,您可以使用如下代码:

var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    if ADODataSet1.Active then
    begin
      TBlobField(ADODataSet1.FieldByName('MyField')).SaveToStream(AStream);
      AStream.Position := 0;
      Image1.Picture.Graphic.LoadFromStream(AStream);
    end;
  finally
    AStream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

警告:在这段代码中我假设Image1.Picture.Graphic不是Nil.如果您的图像控件为空,则Picture.Graphic属性为Nil,上面的代码将为您提供访问冲突.您有两种方法可以避免这种情况:

  1. 不是将图像保存到内存流中,而是将其保存到本地临时文件中,然后使用Image1.Picture.LoadFromFile加载图片.LoadFromFile检查文件扩展名,并根据文件扩展名从TGraphics后代类之一创建适当的对象.例如,如果文件是JPEG,则会创建TJPEGImage类的实例,并将数据加载到其中.
  2. 您自己创建适当的对象并将其分配给Image1.Picture.Graphic.例如,如果您的图像是JPEG,则创建TJPEGImage的实例,将流加载到其中,然后将其分配给Image1.Picture.Graphic.

如果使用SQL命令(INSERT/UPDATE)插入或更新DB记录,则必须在SQL命令中使用SQL参数,然后可以将流加载到表示图像字段的参数中:

///Sample SQL Command:

INSERT INTO My_Table_Name
(MyField1, MyField2) 
VALUES (:prmMyField1, :prmMyField2)


/// Sending INSERT command to DB server

var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(AStream);
    AStream.Position := 0;
     // Save some random data into the first param
    ADOCommand1.Parameters.ParamByName('prmMyField1').Value := 1;
    // Save image stream into the second param
    ADOCommand1.Parameters.ParamByName('prmMyField2').LoadFromStream(AStream);
    ADOCommand1.Execute;
  finally
    AStream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)