求Delphi中向MySQL数据库的BOLB字段存储图片和读取图片的方法,用ODBC+ADO

wsorg 2008-11-05 06:33:50
在MYSQL的表中我将PIC字段设成longblog类型,当表为空时TADOQuery控件显示PIC字段为TblobField类型,当PIC字段中存在图片数据时,再看PIC字段就变成了TvarBytesField类型了,然后执行程序就显示数据类型不匹配。
我用的TBlobStream来存的图片。请各位大侠指点。
...全文
669 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsorg 2008-11-07
  • 打赏
  • 举报
回复
谢谢楼上各位大哥。
我保存的是JPG图片,现在已经可以写入数据库了,可是在读取时用SaveToFile()是却是输出的0字节的文件。

if (eJGRYF.Qry1.FieldByName('GONGWY_PHOTO_FILE').IsNull) then
begin
eJGRYF.Img1.Picture := nil;
exit;
end;
TBlobField(eJGRYF.Qry1.FieldByName('gongwy_photo_file')).SaveToFile('C:\TEST.JPG'); //运行这句时提示“Invalid Class Typecast”
eJGRYF.img1.Picture.LoadFromFile('C:\TEST.JPG');
wsorg 2008-11-07
  • 打赏
  • 举报
回复
谢谢各位大哥,我终于找到问题了,实现方法都没问题,原来是我将图片用 image optimizer 压缩过的,如果没有压缩过的图片就完全可以,但压缩后的图片在显示时就出问题了。

因为数据库中要存入大量的人员照片,所以限制在10K以内。

现在我散分给大家,但如果大家能帮我解决压缩过图片问题,将不胜感激。。。
yeah920 2008-11-07
  • 打赏
  • 举报
回复
帮顶
hongqi162 2008-11-07
  • 打赏
  • 举报
回复

试一下这样

var
jpg : TJpegImage;
ImgFile : string;
srm:TStringStream;
blob:TStream;
begin
ImgFile := ExtractFilePath(Application.ExeName)+'\Photo\'
+ eJGRYF.Qry1.FieldByName('gongwy_id').AsString +'.jpg';
try
srm:=TStringStream.create('');
with eJGRYF.Qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='Select * From gongwy_photo Where ( GONGWY_ID = '''
+ DM.GWYQ.FieldByName('GONGWY_ID').AsString + ''')' ;
Open;
First;
blob:=eJGRYF.Qry1.CreateBlobStream(FieldByName('GONGWY_PHOTO_FILE'),bmRead);
blob.Seek(0,soFromBeginning);
Showmessage(inttostr(blob.Size));
//TBlobField(FieldByName('GONGWY_PHOTO_FILE')).SaveToStream(srm);//这里还是显示“Invalid Class Typecast”的错误
//srm.position:=0;
//eJGRYF.img1.picture.graphic.loadfromstream(srm);
end;
finally
srm.free;
eJGRYF.img1.picture.SaveToFile(ImgFile);
end;
end;
wsorg 2008-11-07
  • 打赏
  • 举报
回复
用流的方式处理也不行,显示同样的错误


procedure ShowPhoto;
var
jpg : TJpegImage;
ImgFile : string;
srm:TStringStream;
begin
ImgFile := ExtractFilePath(Application.ExeName)+'\Photo\'
+ eJGRYF.Qry1.FieldByName('gongwy_id').AsString +'.jpg';
try
srm:=TStringStream.create('');
with eJGRYF.Qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='Select * From gongwy_photo Where ( GONGWY_ID = '''
+ DM.GWYQ.FieldByName('GONGWY_ID').AsString + ''')' ;
Open;
First;
TBlobField(FieldByName('GONGWY_PHOTO_FILE')).SaveToStream(srm);//这里还是显示“Invalid Class Typecast”的错误
srm.position:=0;
eJGRYF.img1.picture.graphic.loadfromstream(srm);
end;
finally
srm.free;
eJGRYF.img1.picture.SaveToFile(ImgFile);
end;




是不是我写入图片的程序不对呢?但确实写进去了,用MYSQL管理工具都能正常显示


jinhx 2008-11-06
  • 打赏
  • 举报
回复
保存
TADOQuery.Edit;

TblobField(TADOQuery.FieldByName('FieldName')).LoadFromFile('文件名');
或者
filestream := tfilestream.create(filename,fmopenread);
TblobField(TADOQuery.FieldByName('FieldName')).LoadFromStream(filestream);
TADOQuery.Post;

读取
TblobField(TADOQuery.FieldByName('FieldName')).SaveToFile('文件名');
或者
memorystream := tmemorystream.create;
TblobField(TADOQuery.FieldByName('FieldName')).SaveToStream(memorystream);
jpg := tjpegimage.create;
jpg.loadfromstream(memorystream);

无条件为你 2008-11-05
  • 打赏
  • 举报
回复
图片的类型是什么?如果是BMP,可以直接存读,如果是Jpg,需要用流来实现。

相关贴子:

http://topic.csdn.net/u/20070502/22/913475dd-7a29-4df2-99e2-b8a2c08df60d.html

http://topic.csdn.net/u/20080123/16/a1a4109e-8cef-40bf-be5a-f9edd578d09d.html


希望对你有所帮助!
Bear_hx 2008-11-05
  • 打赏
  • 举报
回复
保存
TADOQuery.Edit;
TblobField(TADOQuery.FieldByName('FieldName')).LoadFromFile('文件名');
TADOQuery.Post;
读取
TblobField(TADOQuery.FieldByName('FieldName')).SaveToFile('文件名');

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧