2010-11-17 72 views

回答

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; 

你也可以使用一个数据库图像控制,是数据感知,和加载任何图像转换成这意味着图像加载到该领域。

要检索的字段数据,并将其加载到一个的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不无。如果您的图像控件为空,则Picture.Graphic属性为Nil,并且上面的代码会给您提供访问冲突。你有两个选择,以避免这种情况:

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

如果要插入或更新使用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; 
+0

在Delphi XE5中,ParamByName('param')。LoadFromStream需要一个附加参数ftBlob – Brendan 2013-12-09 14:28:47

2

你存储图像本身在MySQL?为什么要这么做?在这方面做了几个基准测试,结论是这种做法不可扩展。

更好的做法是保持磁盘上的所有图像&有一张表,其中包含所有图像的链接。

在谷歌上的简单查询 - 'mysql image store'或'mysql image store benchmarks'会为您提供适当的链接。

+0

+1你当然是对的,我会这么做的。谢谢 – Mawg 2011-01-14 02:51:49

相关问题