将图像直接插入数据库!-->在线等待,今晚结贴。

rockynmc 2002-11-25 06:19:39
我现在需要将多种格式的图像文件(*.bmp,*.Jpg,*.TIFF)直接插入到SQL SERVER的数据库当中,test表的数据库字段是这样的:
id char
pic image

我做了一个简单的Query1,主要代码是:
Query1.sql.add('insert into test(id,pic) value(:id,:pic)');
Query1.ParamByname('id').Asstring:='1';
Query1.ParamByname('pic').LoadFromFile('d:\1.bmp',ftBlob);
Query1.ExecSql;

这样我的数据的确更新上去了,图片也上去,但有个问题:
我较小的图片,20k以下的基本正常 ,大于20k后就会出问题.
我用的TDBImage来显示,大于20k的图下显示出来上部会出现一片黑色的块,若是上传的JPG就根本显示不出来了。

请问各位高手,有没有其它方法来上传和显示呢?我的图片不会超过1M。
是不是需要转换成什么位流方式呢?
我试过Tbitmap和Tgraphic都不怎么行得通,不知Timage可以否?又该如何用呢》?

问题解决马上结贴.
...全文
40 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
rockynmc 2002-12-10
  • 打赏
  • 举报
回复
ar_of_light(星星之光) ,你的第二种办法显示不对的呀!?
Nicok 2002-12-08
  • 打赏
  • 举报
回复
rockynmc (rockynmc) ,我用你的方法,好像库并没有变大啊,你怎么发现图片存到库里了?star_of_light(星星之光) ,assign方法没有在dbimage里显示什么东西,是没存进库里呢?还是没取出?
star_of_light 2002-12-07
  • 打赏
  • 举报
回复
Var
Stream:TStream;
begin
If OpenDialog1.Execute then
begin
try
Stream:=Query1.CreateBlobStream(Query1.FieldByName('Image'),bmRead);
ADOQuery1.Edit;
TBlobField(Query1.FieldByName('Image')).LoadFromStream(Stream);
ADOQuery1.Post;
finally
Stream.Free;
end;
end;
end;
star_of_light 2002-12-07
  • 打赏
  • 举报
回复
我前面介绍的方法我在SQL Server中保存过BMP,JPG图片和Word文档。下面是另一种方法:
Var
Fs:TFileStream;
begin
If OpenDialog1.Execute then
begin
Fs:=TFileStream.Create(OpenDialog1.FileName);
ADOQuery1.Edit;
TBlobField(ADOQuery1.FieldByName('Image')).LoadFromStream(Fs);
ADOQuery1.Post;
end;
end;
rockynmc 2002-12-07
  • 打赏
  • 举报
回复
我的问题始终没有得到更好的解决,冒昧得很,哪位有高招,指点小弟一把
star_of_light(星星之光) 的用ADO不会有错,(同样的方法若用ODBC或者BDE都不行),但此方法只能用于保存BMP格式的图片,而没办法解决通用的其它格式,如JPG,GIF等,这样一来,造成数据库增大,影响网络传输。
有没有更好的办法来上传JPG等图形格式呢?
star_of_light 2002-11-26
  • 打赏
  • 举报
回复
If OpenDialog1.Execute then //保存图形
begin
ADOQuery1.Edit;
TBlobField(ADOQuery1.FieldByName('Pic')).LoadFromFile(OpenDialog1.FileName);
ADOQuery1.Post;
end;
lyhold 2002-11-26
  • 打赏
  • 举报
回复
显示:

dbImage1.Picture.Bitmap.Assign(TBLOBField(adoquery1.Fields[0]));
lyhold 2002-11-26
  • 打赏
  • 举报
回复

adoquery1.Edit ;
Tblobfield(adoquery1.FieldByName('zp')).Assign(image1.Picture );
adoquery1.Post ;
zfmich 2002-11-26
  • 打赏
  • 举报
回复
用TBLOBFIELD
wangjiki1111 2002-11-26
  • 打赏
  • 举报
回复
给你一个Table存图片的参考
以下是我觉得在所有图片存取方法中最简单的方法
use jpeg,Clipbrd、、、、、、、、、、、、、
//Save to database
Image1.Picture.LoadFromFile('FileName');
if not (Image1.Picture.Graphic Is TBitmap) then
begin
ClipBoard.Assign(Image1.Picture);
Image1.Picture.Bitmap.Assign(ClipBroad);
ClipBoard.Clear;
end;//Change the picture that's not belonged to .bmp to .bmp
// picture
Table1.Edit;
Table1.FieldByName('Image').Assign(Image1.Picture);
Table1.Post;
//get from database
Image1.Picture.Bitmap.Assign(TPicture(Table1.FieldByName('Image')));
older 2002-11-25
  • 打赏
  • 举报
回复
你这样试一试

stringstream1 := TStringStream.create(nil);
img.savetostream(stringstream1);
Query1.sql.add('insert into test(id,pic) value(:id,:pic)');
Query1.ParamByname('id').Asstring:='1';
query1.paramByName('pic').asblob := stringstream1.datastring;
query1.executesql;
stringstream1.free;
img是一个支持显示图像的image控件
rockynmc 2002-11-25
  • 打赏
  • 举报
回复
不行
还有没有其它高招。
我现在的问题是写进去的内容读出来时,小的BMP没问题,大的不行。
这图形应转换成什么流方式来表达呢?
siyu2002 2002-11-25
  • 打赏
  • 举报
回复
参考一下
http://expert.csdn.net/Expert/topic/1204/1204374.xml?temp=.9548761
广州接入 2002-11-25
  • 打赏
  • 举报
回复
修改BDE的ODBC配置中的参数:
在Delphi 开发环境->Database->explore->你的ODBC->修改BLOB SIZE,BLOBS TO CACHE两个参数.
祝你好运.
lqdmafeng 2002-11-25
  • 打赏
  • 举报
回复
你使使转成memorystream,我存WORD文档的时候转成流,读的时候,也使先存成流,然后再IMAGE.loadfromstream。使使,不行再说!哦棵!

2,498

社区成员

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

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