寻找代码示例,最好使用TADOConnection。
我想将TImage的TPicture保存到MySql(最好是ODBC,而不仅仅是MySql)数据库,之后我想创建一个TImage并将图片检索到其TPicture属性。
是否有任何代码段或链接?
答案 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,上面的代码将为您提供访问冲突。您有两种方法可以避免这种情况:
如果使用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://en.allexperts.com/q/Delphi-1595/2008/7/Save-big-file-Mysql.htm
希望这就是你想要的,我很清楚你在问什么。
最好的问候,