三层结构(采用midas)中blob图片数据作为insert sql语句中的传递参数出现问题? ( 积分: 100 )

  • 主题发起人 主题发起人 mike_chan
  • 开始时间 开始时间
M

mike_chan

Unregistered / Unconfirmed
GUEST, unregistred user!
请大家帮忙看看,我的blob图片数据作为insert sql语句中的传递参数,发现可以运行,
但是结果数据库相应的图片字段基本是空的,查询该新增记录数据时出现"JPEG error #53"的错误。怎么解决?
procedure TForm1.Button4Click(Sender: TObject);
var
JPG:TJPEGImage;
MS:TMemoryStream;
begin
JPG:=TJPEGImage.Create;
MS:=TMemoryStream.Create;
JPG.Assign(Image1.Picture.Graphic);
JpG.SaveToStream(MS);
MS.Position :=0;
with ClientDataSet1do
begin
Close;
CommandText:='insert into 地址(照片) values(:pic)';
Params.ParamByName('pic').LoadFromStream(ms,ftBlob);
Execute;
end;
MS.Free ;
jpg.Free ;
ClientDataSet1.Refresh;
end;
 
请大家帮忙看看,我的blob图片数据作为insert sql语句中的传递参数,发现可以运行,
但是结果数据库相应的图片字段基本是空的,查询该新增记录数据时出现"JPEG error #53"的错误。怎么解决?
procedure TForm1.Button4Click(Sender: TObject);
var
JPG:TJPEGImage;
MS:TMemoryStream;
begin
JPG:=TJPEGImage.Create;
MS:=TMemoryStream.Create;
JPG.Assign(Image1.Picture.Graphic);
JpG.SaveToStream(MS);
MS.Position :=0;
with ClientDataSet1do
begin
Close;
CommandText:='insert into 地址(照片) values(:pic)';
Params.ParamByName('pic').LoadFromStream(ms,ftBlob);
Execute;
end;
MS.Free ;
jpg.Free ;
ClientDataSet1.Refresh;
end;
 
顺便说一下,
中间层用的是TAdoConnection + TAdoQuery和Data + TDataSetProvider
客户端用的是TClientDataset + TSocketConnection
数据库用 Access
 
顶一顶!
 
我遇到过,sql没问题,是aceess的问题,你可以到sql下试试,
 
JpG.SaveToStream(MS);之后,你看过MS的size没有?
后面的好像没有错误!
也许JPG没有正确的获得图形,你先显示一下看看如何
 
to yeskert1:
JpG.SaveToStream(MS);没有错误,我调试看过MS的size正常!
to zhanghongzheng:
难道access就没有解决方法了吗?跟access的版本是否有关系?我用的是access2000.
 
Params.ParamByName('pic').LoadFromStream(ms,ftBlob);的最后一个参数改成
ftVarBytes如何?字段类型应该是"OLE对象"类型的吧?
 
to yeskert1:
Params.ParamByName('pic').LoadFromStream(ms,ftBlob);的最后一个参数改成
ftVarBytes如何?
改了之后编译不通过,错误信息如下:
[Error] Unit1.pas(179): Constant expression violates subrange bounds
[Fatal Error] TU.dpr(7): Could not compile used unit 'Unit1.pas'
字段类型应该是"OLE对象"类型的吧? 对!
 
我搞错了,tparam和tparameter不一样!
我觉得别处没有问题,应该是指定的数据类型不合适。换成ftGraphic试试吧!
另外,你取出来的大小是否变了?
 
to yeskert1:
换成ftGraphic结果一样,取出来的大小没有变。同样的语句,在两层结构中(把TClientDataSet换成TADOQuery)完全没有问题。
 
我给你实验一下!
 
是不是要把
JPG.Assign(Image1.Picture.Graphic);
改为 :jpg.assign(image1.picture);
 
to paul_lmc:
应该不是你说的这个问题,如果是这样,为什么同样的语句在两层结构中(把TClientDataSet换成TADOQuery)完全没有问题?
 
我遇到了相同的问题,我把TJPEGImage换成了Tbitmap,就没有在出现"JPEG error #53"的错误了。
 
费了那么大的力气才搞定!
首先我写个小程序完成图形转变成jpeg格式存到数据库,然后读取显示的程序,access+
ado,两层的,没有问题!
然后,利用clientdataset显示库中已有图片,也没有问题!
然后,利用clientdataset保存图片,跟楼主的方法一样(基本一样,换来几个方式),都
不行!我跟踪,发现参数赋值时大小是正确的,取出来就不对了,估计问题出现在参数赋值
之后,参数值的使用有问题,我想是bug!
于是我换了别的方法,总算搞定了!
 
就是说,问题出现在保存那段代码上,参数值没有正确被处理!!!!
下面代码是可以的:
clientdataset1-->datasetprovider1-->adotable1,其中adotable1指向图片所在的表,也可以是adoquery,这样可以设置其where为1=2,使之返回数据为空,少占用内存。
保存图片的代码如下:
var jpg:TJPEGImage;
strm:Tstream;
begin
jpg:=TJPEGImage.Create;
try
jpg.Assign(image1.Picture.Graphic);
with clientdataset1do
begin
open;
append;
{别的字段的赋值,略}
strm:=clientdataset1.CreateBlobStream(fields[0],bmwrite);
jpg.SaveToStream(strm);
strm.Free;
post;
applyupdates(0);
end;
finally
jpg.Free ;
end;
这样,用字段而不是参数来处理图片没有问题了!
 
to yeskert1,
首先谢谢你,你的方法我也早就试过可以了,但现在我一定要用sql 语句加参数的方法才能实现程序的灵活运用。怎么办?
 
应该也没有问题!
但现在有些疲倦,等有时间再说吧![:D]
 
to yeskert1,
辛苦了,等你的好消息!
 
后退
顶部