图片的数据库存储问题---在post时报错(invalid BLOB length)?(100分)

  • 主题发起人 苦中求乐
  • 开始时间

苦中求乐

Unregistered / Unconfirmed
GUEST, unregistred user!
在做人事管理系统时对照片的 保存在服务器用image型字段保存。用如下代码:
procedure TForm_EmployeeInput.dataSave;
var
myfilestream:tfilestream;
myblob:tblobfield;
begin
with dm.Query_RenYuan do
begin
//FieldByName('C_BianHao').asstring:=BianHao;
if XiuGaiZhaoPian then
begin
try
myfilestream:=tfilestream.Create(OpenDialog1.FileName,fmopenread);
myblob:=tblobfield(FieldByName('M_ZhaoPian'));
myblob.LoadFromStream(myfilestream);
finally
myfilestream.Free;
end;
end;
。。。
post;//报错(invalid BLOB length)
此程序段在照片尺寸20K左右时没有问题,但是在90K左右时就出错,什么原因?小弟实在是不明白,
请各位富翁指点。最好是解释一下Blob流的 工作原理,分不够可以再加。谢谢!
 
你何苦把他做成图像字段呢..存储路径多好..非要找麻烦..
 
谢谢高人brown0432指点,但路径是否不够安全和稳定呢?[:D]
希望继续讨论,谢谢!
 
//800K都没问题,不过占用数据库空间太多而已
if OpenDialog1.Execute then
imgFile := OpenDialog1.filename;
....
if not (adoPic.State IN [dsEdit,dsInsert]) then Exit;
Try
if imgFile <> '' then
TBlobField(adoPic.FieldByName('ZP002')).LoadFromFile(imgFile);//员工照片
adoPic.FieldByName('ZP001').AsString := Trim(DBEdit1.Text);//员工编号
adoPic.Post;
imgFile := '';
Except
End;
 
声明一下,偶用的不是ADO,也不可能改了,不好意思,忘了说
 
这和用不用ADO没关系,只要为SQLServer就行,DBE控件一样可以!
 
不行啊,错误依旧,看来不是方法的错误,不知道有没有人遇到过同样情况?

*****注意*****
虽然报错但是图片仍然保存进去了,不知道为什么?怎么解决(不要告诉我try语句)
 
1、首先指出你写法上的一个错误!
myfilestream:=tfilestream.Create(OpenDialog1.FileName,fmopenread);
try //<------不要放在Create语句的前面,如果创建失败,你free的时候要报错的
myblob:=tblobfield(FieldByName('M_ZhaoPian'));
myblob.LoadFromStream(myfilestream);
finally
myfilestream.Free;
end;
2、在myblob:=tblobfield(FieldByName('M_ZhaoPian'));后面加
myfilestream.seek(0,0);
 
谢谢only you的提醒,但是按照你的方法还是同样的错误,
[:(]郁闷中... ...
 
其实你的bde配置有问题,如果你只显示照片的话有1m就足够用了,如果是这样你
只要把bde配成1024就可以解决,而我自己碰到的问题是怎样才能让任意大的多媒体
都能读出来。
 
用FieldByName('ZP001').loadFromStream(myfilestream,ftBlob);
试试
 
朋友:
你的代码我没试,但我做过很多处理Blob的项目,据我了解,Delphi和SQLServer配合
什么问题都没有,和Oracle配合是需要加事务处理(这是从Borland的北京总部的技术人员那里知道的),BDE比ADO处理Blob的性能要好些,
我没用文件流来处理过Blob字段,但我用过内存流(TMemoryStream),你试一试,应该没问题的,如果
还有问题,那你再试试将BDE的Database的BlobSize的尺寸设大4倍,BLOBS TO CACHE也设大4倍,
如果还有问题,那就是你的环境有问题了,祝你好运!

另外,我昨天用dbExpress试验了一下插入Blob类型的数据(2M的图片),插入没问题,但读出不对,
用BDE和ADO读出都没问题!
 
补充一下,我插入或修改的图片都超过1M,没问题的!
 
数据库的问题
sql server 的页大小
 
uses Jepg;
var
MyJepg :TJepgImage;
MyStream :TStringStream;
begin
MyJepg := TJepgImage.Create();
MyJepg.LoadFrom(File :你的文件名);
MyStream := TStringStream.Create('');
MyJepg.SAveToStream(MyStream);

with Table1 do//可暂认为字段B是Blob字段
begin
Insert;
FieldByName('a').AsString := Your Values;
FieldByName('b').AsString := MyStream.DataString;
Post;
end;
end;


这个法子我试过很多次了可以试试吧
 
var
JPG: TJPEGImage;
SS: TStringStream;
begin
Screen.Cursor := crHourGlass;
try
with Query do
begin
Close;
SQL.Clear;
SQL.Add('Update Item Set Image=:Image');//item你的表
SQL.Add('Image=:Image');
SQL.Add('Where ID=:ID');//索引字段
JPG := TJPEGImage.Create;
JPG.CompressionQuality := 100;
SS := TStringStream.Create(S);
try
SS.Size := 0;
JPG.Assign(Image1.Picture);
JPG.Compress;
JPG.SaveToStream(SS);
SS.Position := 0;
Params[0].AsBlob := SS.DataString;
finally
JPG.Free;
SS.Free;
end;
Params[1].AsInteger := ID;//id为Integer
ExecSQL;
End;
end;
 
谢谢各位,不过错误依旧,可能是系统的问题吧,算了。
 
多人接受答案了。
 
顶部