数据库中的图片保存出来后为什么不正常了?(50分)

  • 主题发起人 主题发起人 lqbecnu
  • 开始时间 开始时间
L

lqbecnu

Unregistered / Unconfirmed
GUEST, unregistred user!
我用如下方法把bmp图片插入数据库中:
result := false;
//qry是TQuery组件
with qry do
begin
Close;
Sql.Clear;
Sql.Add('Insert into pic(pic,picname)');
Sql.Add('Values(:P_Picture,:P_Name)');
//path是图片所在路径
ParamByName('P_Picture').LoadFromFile(path,ftMemo);
//picname是图片文件名
ParamByName('P_Name').Value := picname;
ExecSql;
result := True;
end;//end of with

把保存的图片保存成本地文件的代码:
sql := 'select pic,picname from pic';
if not FDM.QueryDataCommon(sql,qry,cds) then exit;
//上句代码执行后,图片数据和图片文件名已经获取到cdspic(TClintDataSet)中了。
with FDM,cdsPic do
begin
while not eof do
begin
//读取图片到流,并保存出来
picname := fieldbyname('picname').AsString;
try
Mem := TMemoryStream.Create; TBlobField(fieldbyname('pic')).SaveToStream(mem);
mem.SaveToFile(picname);
finally
Mem.Free;
end;
next;
end;
问题是,在读取图片保存到本地文件后,图片打开时什么也不显示,请给点提示。谢谢。
 
為什么不直接用
TBlobField(ADOQuery1.FieldByName('pic')).SaveToFile('c:/tmp.bmp');
或者
Mem := TMemoryStream.Create;
//寫在這里最好,試想,try之后,mem沒用正常創建,finally時,用什么free。
try
TBlobField(fieldbyname('pic')).SaveToStream(mem);
mem.Position:=0; //這里加一句試試看
mem.SaveToFile(picname);
finally
Mem.Free;
end;
 
使用dataset存储ds3pd.LoadFromFile(path1+'lrl.lrl');
用dataset打开ds3pd.savetoFile(path1+'lrl.lrl');
ds2.Active:=false;
ds2.commandtext:='select max(pid) as maxid from spic';
ds2.Active:=true;
maxid:=ds2.fieldbyname('maxid').AsInteger+1;
ds2.Active:=false;
ds3.Close;
ds3.CommandText:='select * from spic';
ds3.Open;
ds3.Edit;
ds3.Append;
ds3lei.Value:=lei;
ds3name.Value:=nm;
ds3pid.Value:=maxid;
ds3pd.LoadFromFile(path1+'lrl.lrl');
ds3bmp.LoadFromFile(path1+'lrl.bmp');
ds3.Post;
 
答复BrainYang:
1.直接用
TBlobField(ADOQuery1.FieldByName('pic')).SaveToFile('c:/tmp.bmp');
还是无法保存出正确的图片,而且保存出的图片大小只有10个字节。
2.加入mem.Position:=0;后问题还是如此。
不过感谢你的create的问题的提醒,最后分配积分时,一定有侬的。:)
 
把ParamByName('P_Picture').LoadFromFile(path,ftMemo);中的ftmemo换为ftvariant后,问题已解决。可能是存储时ftmemo格式保存成了文本,而这里存储的是图片。谢谢各位的回答。BrainYang得到40分,lrl1228得到10分。
 
后退
顶部