图片在数据库中的操作

图片存放到数据库中采用流的方式存入取出
一般将所有数据表中的图片字段(mysql为 longblob,mssql为image)放入到一个db_zp表中,需要图片的时候再进行读取


图片显示 zp_bz_show
图片修改
图片删除


//在grid cellclick中加一语句
  zp_bz_show;






//图片显示
procedure TDLLFORM.zp_bz_show;
var
  i:integer;
  dm:string;
  fimage:TMemoryStream;
begin
//清空imageenmview中图片
  for i:=imageenmview_bz.ImageCount-1 downto 0 do begin
    imageenmview_bz.DeleteImage(i);
  end;
//得到与照片数据库相关联的代码 这里用
  if edit_bz_bh.text='' then exit;
  dm:=trim(edit_bz_bh.text);
 // if sqlquery_bz.Eof then exit;
 // dm:=sqlquery_bz.FieldValues['编号'];
//数据库查询
  sqlquery1.SQL.Text:='select * from db_zp where 代码='+quotedstr(dm);
  sqlquery1.open;
  sqlquery1.First;
  if sqlquery1.Eof then exit; //不存在相关的记录就退出
  sqlquery1.First;
  if  not sqlquery1.Eof then begin
    fimage:=tmemorystream.Create;
    TBlobField(sqlquery1.FieldByName('照片')).SaveToStream(fimage);
    ImageEnMView_bz.SelectedImage:=0;
    fimage.Position:=0;
    ImageEnMView_bz.MIO.LoadFromStream(fimage);
    imageenmview_bz.ImageFileName[0]:=sqlquery1.FieldValues['编号'];
    fimage.Free;//释放流
  end;
end;










//图片修改按钮
var
  bh,filename:string;
  i,iw,ih:integer;
  imageenviewx:TImageEnView;
  fimage:TMemoryStream;
begin
//打开图片对话框
  if openpicturedialog1.Execute =false then exit;
  filename:=openpicturedialog1.FileName;
  //从INi文件中读取预设图片宽度,如果读入图片大于这个数值就进行压缩
  iw:=strtointdef(readinis(ExtractFilePath(Paramstr(0))+'\info.ini','info','imagewidth'),600);
//将图片转换大小并存入stream
  imageenviewx:=TImageEnView.Create(dllform);
  fimage:=TMemoryStream.Create;
  imageenviewx.IO.LoadFromFile(filename);
  ih:=imageenviewx.Bitmap.Height;
  if imageenviewx.Bitmap.Width>iw then begin  //判断图片宽是否大于预设,是的话就进行缩放
    ih:=round(ih*iw/imageenviewx.Bitmap.Width);
    imageenviewx.Proc.Resample(iw,ih);
  end;
  imageenviewx.IO.SaveToStreamJpeg(fimage);
  imageenviewx.Free;
//删除数据库中对应的照片
  sqlquery_zp.SQL.Text:='delete from db_zp where 代码='+quotedstr(edit_bz_bh.Text);
  sqlquery_zp.ExecSQL;
//添加到删除数据库中db_delete //这里添加是为了导入本地数据时减少数据量
  if imageenmview_bz.ImageCount>0 then begin
   sqlquery1.SQL.Text:='insert into db_delete(编号,日期) values(:a,:b)';
   sqlquery1.Params.ParamByName('a').Value:=imageenmview_bz.ImageFileName[0];
   sqlquery1.Params.ParamByName('b').Value:=formatdatetime('YYYYMMDDHHMMSSZZZ',NOW);
   sqlquery1.ExecSQL;
  end;
//将内存中的图片放入数据库中, 在MYSQL5中图片存使用GB2312字符集,普通操作使用GBK
  sqlquery_zp.SQL.Text:='insert into db_zp(编号,代码,照片,修改日期) values(:a,:b,:c,:d)';
  bh:='ZP'+formatdatetime('YYYYMMDDHHMMSSZZZ',NOW);
  sqlquery_zp.Params.ParamByName('a').Text:=bh;
  sqlquery_zp.Params.ParamByName('b').text:=UpperCase(edit_bz_bh.Text);//如果有2-3个固定的图片,可以在这里加前缀L,M,R
  sqlquery_zp.Params.ParamByName('c').LoadFromstream(fimage,ftBlob);
  sqlquery_zp.Params.ParamByName('d').Text:=formatdatetime('YYYYMMDDHHMMSSZZZ',NOW);
  try
    sqlquery_zp.ExecSQL;
  except
    application.MessageBox(' 错误: 照片数据库添加资料失败 ','信息',MB_OK);
    exit;
  end;
//更新ImageEnMView中的图片,先清空再读入。
//清空imageenmview中图片
  for i:=imageenmview_bz.ImageCount-1 downto 0 do begin
    imageenmview_bz.DeleteImage(i);
  end;
//读入图片
  ImageEnMView_bz.SelectedImage:=0;
  fimage.Position:=0;
  ImageEnMView_bz.MIO.LoadFromStream(fimage);
  imageenmview_bz.ImageFileName[0]:=bh;
  fimage.Free;
end;










//图片删除按钮
var
  bh:string;
  i:integer;
begin
//从数据库中删除
  if imageenmview_bz.ImageCount=0 then  exit;
  if application.messagebox(pansichar('当前选中的图片是否删除'),'记录删除',MB_YESNO)=IDNo then exit;
  sqlquery_zp.SQL.Text:='delete from db_zp where 代码='+quotedstr(edit_bz_bh.Text);
  sqlquery_zp.ExecSQL;
//添加到删除数据库中db_delete
  sqlquery1.SQL.Text:='insert into db_delete(编号,日期) values(:a,:b)';
  sqlquery1.Params.ParamByName('a').Value:=imageenmview_bz.ImageFileName[0];
  sqlquery1.Params.ParamByName('b').Value:=formatdatetime('YYYYMMDDHHMMSSZZZ',NOW);
  sqlquery1.ExecSQL;
//清空imageenmview中图片
  for i:=imageenmview_bz.ImageCount-1 downto 0 do begin
    imageenmview_bz.DeleteImage(i);
  end;
end;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值