分享

sqlserver2000存取图片

 独孤求财 2012-03-14

sqlserver2000存取图片

时间:2011-5-30来源:yang 作者: peng点击: 10次

解决数据库中图片的问题,关键技术如下:

在数据库上使用Image二进制字段保存,使用Stream流的方式。
创建文件流:
     Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
     Word_FileStream.Position:=0;

保存到数据库的Image字段:
     TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);

从数据库读取文件到本地硬盘:
     TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);

释放文件流:
     Word_FileStream.Free;

Server中该字段的数据类型是Image,在Access中该字段的数据类型是OLE对象。...

既然你已经用TDBImage控件使用Picture.LoadFromFile装入了图片,
只要该图片字段和TDBimage控件相连了,直接用adodataset.post,就保存到了
数据库。
如果没有相连,可以直接用
Tblobfield(adodataset.fields[字段名]).loadfromfile
从文件中读,或
Tblobfield(adodataset.fields[字段名]).loadfromstream
从stream中读,
要读出该字段内容,用相应的savetofile,savetostream就行了  

注意如果是jpeg图片,要引用 jpeg单元,即: uses jpeg;

综合以上,既能识别bmp又识别读jpeg,我把代码修改如下:
(建议用image,不要用dbimage控件,因为该控件只能识别bmp格式图片)
(程序已调试,运行正确 delphi7 + sql server 2000)
我的数据库是这样的:
id  varchar(50)
name varchar(50)
pic image(16)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls;

type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    DBGrid1: TDBGrid;
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Button2: TButton;
    DBImage1: TDBImage;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses DateUtils,jpeg;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  with ADOQuery1 do
  begin
    close;
    SQL.Text:= ‘select * from Tpic‘;
    ADOQuery1.Open;
  end;

  //DBImage1.DataSource:= DataSource1;
  //DBImage1.DataField:= ‘pic‘;
end;

//显示
procedure TForm1.Button1Click(Sender: TObject);
var
  aBitmap: TBitmap;
  aJPEGImage: TJPEGImage;
  aStream: TStream;
  head: word;
const
  bmp = $4D42;
  jpeg = $D8FF;
begin
  aBitmap:= TBitmap.Create;
  aJPEGImage:= TJPEGImage.Create;
  aStream:= TMemoryStream.Create;
  try
    TBlobField(ADOQuery1.FieldByName(‘pic‘)).SaveToStream(aStream);

    aStream.Position := 0;  //一定要有这句
    aStream.Read(head,2);
    aStream.Position:= 0;
    if head = bmp then
    begin
      aBitmap.LoadFromStream(aStream);
      Image1.Picture.Assign(aBitmap);
    end
    else if head = jpeg then
    begin
      aJPEGImage.LoadFromStream(aStream);
      Image1.Picture.Assign(aJPEGImage);
    end;

  finally
    aBitmap.Free;
    aJPEGImage.Free;
    aStream.Free;
  end;
end;

//添加
procedure TForm1.Button2Click(Sender: TObject);
var
  aBitmap: TBitmap;
  aJPEGImage: TJPEGImage;
  aStream: TStream;
begin
  aBitmap:= TBitmap.Create;
  aJPEGImage:= TJPEGImage.Create;
  aStream:= TMemoryStream.Create;

  try
    if OpenDialog1.Execute then
    begin
      if ExtractFileExt(OpenDialog1.FileName)= ‘.bmp‘then
      begin
        aBitmap.LoadFromFile(OpenDialog1.FileName);
        aBitmap.SaveToStream(aStream);
      end
      else if (ExtractFileExt(OpenDialog1.FileName)= ‘.jpg‘) or (ExtractFileExt(OpenDialog1.FileName)= ‘.jpeg‘) then
      begin
        aJPEGImage.LoadFromFile(OpenDialog1.FileName);;
        aJPEGImage.SaveToStream(aStream);
      end;

      with ADOQuery1 do
      begin
        Append;
        aStream.Position:= 0;
        TBlobField(FieldByName(‘pic‘)).LoadFromStream(aStream);//出错的地方:原来是因为我用了dbimage控件,该控件只能显示bmp格式图片
        Post;
      end;
    end;
  finally
    aBitmap.Free;
    aJPEGImage.Free;;
    aStream.Free;
  end;
end;

end.  


来自:lisongmagic, 时间:2007-3-10 13:39:53, ID:3679497 | 编辑
图片问题 。
主要有两种思路:
1。图片文件保存到数据库:这种方法是将图片文件以二进制形式保存。这种方法不但可以保存图片还可以保存电影啊优点:保密性强;致命缺点:如果图片很多会造成数据库臃肿。
2。保存图片的绝对路径
这种方法只是保存文件的绝对路径到数据库,在访问时读取路径然后。。
优点:简单,快速 缺点:保密问题比较突出(误操作等)
建议: 如果图片数量不是很大建议内部保存

用DBImage控件只能显示bmp图像,一个图像用bmp格式要用0.5M-几M空间,jpeg格式只有几十至几百kB。如果图片较多,用DBImage控件显示,其程序大小是个问题。
一个程序保密要性强,也要考虑安装问题,保存图片的绝对路径,是否考虑安装的盘符。

强烈建议:用jpeg格式图像,数据库内部保存,image显示。  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多