求助~用sqlquery往数据库插入二进制出现内存错误

fky1989 2012-03-24 09:41:03
function TServerMethods1.UploadPic(uName: string; uPortrait: TStream): Boolean;
//上传图片
const
BufSize = 51200;
var
Stream: TStream;
MS: TMemoryStream;
Buffer: TBytes;
ReadCount: Integer;
begin
Result := False;
Stream := uPortrait;
try
MS := TMemoryStream.Create;
if Stream.Size < -1 then
begin
SetLength(Buffer, BufSize);
repeat
ReadCount := Stream.Read(Buffer[0], BufSize);
if ReadCount > 0 then
MS.Write(Buffer[0], ReadCount);
until ReadCount < BufSize;
end
else
MS.CopyFrom(Stream, 0);
MS.Position := 0;
MS.SaveToFile('c:\users\fky\desktop\123.bmp');
// 上面的都ok
try
with sqlqry_Pic do
begin
Close;
SQL.Clear;
SQL.Add('update t_User set u_Portrait = :p_Portrait where u_Name = :p_Name');
TBlobField(Params.ParamByName('p_Portrait')).LoadFromStream(MS);
// 就是到上面这行,出现内存错误了
Params.ParamByName('p_Name').Value := uName;
ExecSQL(False);
Result := True;
end;
except
Result := False;
end;
finally
MS.Free;
end;
end;
...全文
196 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fky1989 2012-03-26
  • 打赏
  • 举报
回复
是不是sqlquery的原因,用ado能插入。。。但如果是这个的原因,那连数据库用的是db,如何解决。。
fky1989 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 userisexists 的回复:]

Delphi(Pascal) code

SQL.Clear;
SQL.Add('update t_User set u_Portrait =:p_Portrait where u_Name = :p_Name');
// 加一行,刷新一下参数,好像是Paramters还是Params自己试
Params.Refresh;
TBlobField(Params.ParamBy……
[/Quote]
大大,没refresh这个过程
山东蓝鸟贵薪 2012-03-25
  • 打赏
  • 举报
回复
从网上找找资料吧
userisexists 2012-03-24
  • 打赏
  • 举报
回复

SQL.Clear;
SQL.Add('update t_User set u_Portrait =:p_Portrait where u_Name = :p_Name');
// 加一行,刷新一下参数,好像是Paramters还是Params自己试
Params.Refresh;
TBlobField(Params.ParamByName('p_Portrait')).LoadFromStream(MS);
// 就是到上面这行,出现内存错误了
Params.ParamByName('p_Name').Value := uName;


还有种方式就是,全部以SQL字串的方式来写,如:

update tablename set image_field=0x010203 where image_id = id_value

将Stream转换成'0x010203'类似的字符串,拼成上述格式,然后执行。
fky1989 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sgzhou12345 的回复:]

建议以内存流方式读取文件再保存到数据库即可
如图片加载到图片控件中,在保存时先保存为内存流,再写入数据库

讨取图片时,先以内存流方式从数据库中读取,保存为一个“临时文件”
再在图片控件中加载这个“临时文件”即可

先给你一个思路吧
[/Quote]
读取我已经做完了, 就是这个写入,已经写到内存流中了, MS.SaveToFile('c:\users\fky\desktop\123.bmp');这个也显示正确,就是往数据库里写不对头
山东蓝鸟贵薪 2012-03-24
  • 打赏
  • 举报
回复
建议以内存流方式读取文件再保存到数据库即可
如图片加载到图片控件中,在保存时先保存为内存流,再写入数据库

讨取图片时,先以内存流方式从数据库中读取,保存为一个“临时文件”
再在图片控件中加载这个“临时文件”即可

先给你一个思路吧

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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