如何解决JPEG Error #52?(BLOB调用出错) (50分)

E

echolan

Unregistered / Unconfirmed
GUEST, unregistred user!
部分代码如下:
Open;
if RecordCount > 0 then
begin
First;
MS := tmemorystream.Create;
TmpJPG := TJpegImage.Create;
try
TBlobField(FieldbyName('Image')).savetoStream(MS);
MS.Position := 0;
TmpJPG.LoadFromStream(MS);
ImageField.Picture.Assign(TmpJPG);
finally
TmpJPG.Free;
MS.Free;
end;
end;
Close;
以上数据库‘IMAGE’字段为BLOB型,在访问本地数据库时,该代码能正常运行。当使用中心数据库时,当代码运行到TmpJPG.LoadFromStream(MS)时会出现JPEG ERROR #52的错误!
请问如何解决?
 
数据读的不全,还是那个问题,BDE的BLOB SIZE参数设的太小
 
我设置的是MYSQL的BLO SIZE,设置了1024,中心数据库所在的机器设置的是2048,在我自己的机器上可以运行,为什么使用中心数据库端时会出错?
 
你存的时候数据正确吗?
 
基本上是数据不全.如果是网络的数据库.先发送流的大小数值A.当多次接收到的流合计大于或等于A时,再显示.包没事.
 
magic6326,能说具体一点吗?上面这段代码应该如何改动?
 
应该是BLOB TO CACHE 数值的问题, 你可以这样测试, 如果中心数据库里的记录少于
BLOB TO CACHE 配置看看出不出错, 如果不出错就是这个问题.
 
在中心数据库所在的PC上跑读本地数据库的程序,也没能读出BLOB字段的数值,说明通过网络访问中心数据库时未能正确写入Stream文件,不知道这该如何解决?
 
当写中心数据库时,写入前查看写入的STREAM大小,当下一次调用时再查看读出的STREAM大小,发现前后两次STREAM的大小不一致,写入前的值要比读出时的大。在使用本地数据库时前后是一致的!
 
你是不是在用SOCK控件接收流的.如果是的话那在接收流之前先要知道流的大小比如A.
再在每次接到流的时候检查流的大小是否大于等于A.真的话就执行你上面的代码.不然继续接收.直到等于为止.
我也写过这样的远程截屏软件.
 
///当写中心数据库时,写入前查看写入的STREAM大小,当下一次调用时再查看读出的STREAM大小,发现前后两次STREAM的大小不一致,写入前的值要比读出时的大。在使用本地数据库时前后是一致的!
当然了.网络传输的数据有限的.不是设置大小就能解决.这样会造成不必要的开销.所以把分开接收的流合并成一个流就可以实现你所说的功能了.
 
问题解决了,是写数据库时候出现的问题,使用clientdataset时,写BLOB字段时如果使用Params[2].LoadfromStream(MS,ftBlob),下次读取时会出错,最好改用TBlobField(FieldByName('IMAGE')).LoadFromStream(MS);
 
顶部