寻找代码样本,最好使用TADOConnection。
我希望将TImage的TPicture保存到MySql (最好是ODBC,而不仅仅是MySql)数据库,稍后我想创建一个TImage并将图片检索到它的TPicture属性。
是否有代码片段,或链接到相同的代码片段?
发布于 2010-11-17 19:53:12
您可以使用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;发布于 2010-11-17 16:37:43
您是否将图像本身存储在MySQL中?你为什么要这么做?在这方面做了几个基准测试,得出的结论是这种做法是不可扩展的。
更好的做法是在磁盘上维护所有图像&有一个表,其中包含指向所有图像的链接。
在Google上简单查询- 'mysql图片商店‘或'mysql图片商店基准’就能给你找到合适的链接。
发布于 2010-11-17 16:32:45
也许这对你有帮助:
http://www.scalabium.com/faq/dct0065.htm -将组件保存到流中
然后将流保存到MySql
和http://en.allexperts.com/q/Delphi-1595/2008/7/Save-big-file-Mysql.htm
希望这就是你想要的,我完全理解你的要求。
诚挚的问候,
https://stackoverflow.com/questions/4201210
复制相似问题