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

时间:2010-11-17 03:26:16

标签: mysql delphi ado

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

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

是否有任何代码段或链接?

3 个答案:

答案 0 :(得分: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;

您还可以使用可识别数据的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;

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

  1. 而不是将图像保存为 内存流,将其保存到本地 临时文件,然后加载图片 使用Image1.Picture.LoadFromFile。 LoadFromFile检查文件扩展名, 并根据文件扩展名, 从其中一个创建一个适当的对象 TGraphics后裔类。对于 例如,如果文件是JPEG,它 创建TJPEGImage的实例 class,并将数据加载到其中。
  2. 你自己创造了正确的 对象并将其分配给 Image1.Picture.Graphic。例如, 如果您的图像是JPEG,请创建一个 加载TJPEGImage的实例 流入它,然后分配给它 Image1.Picture.Graphic。
  3. 如果使用SQL命令(INSERT / UPDATE)插入或更新数据库记录,则必须在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;
    

答案 1 :(得分:2)

您将图像存储在MySQL中吗?为什么要这么做?在这方面有几个基准,结论是这种做法不具有可扩展性。

更好的办法是将所有图像保存在磁盘上。有一个表格,其中包含所有图像的链接。

Google上的简单查询 - “mysql图像商店”或“mysql图像商店基准测试”可以为您提供合适的链接。

答案 2 :(得分:1)

也许这可以帮到你:

http://www.scalabium.com/faq/dct0065.htm - 将组件保存到流

然后将流保存到MySql

http://www.devarticles.com/c/a/Delphi-Kylix/Saving-Images-and-Binary-Files-to-a-Database-with-Delphi-2/

http://en.allexperts.com/q/Delphi-1595/2008/7/Save-big-file-Mysql.htm

希望这就是你想要的,我很清楚你在问什么。

最好的问候,