Delphi怎样把图片保存到数据库中

解决方案 »

  1.   

    在sql server中建立image类型字段
    例如:
    CREATE TABLE [dbo].[pic] (
    [pid] [varchar(10)] NULL ,
    [pic] [image] NULL 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]在程序里用一个adoquery读取该表
    然后参考下面的程序
    procedure TFormPicture.dxbt_saveClick(Sender: TObject);
    var
      ms : TMemoryStream;
      file_pic : string;
    begin
      ms := TMemoryStream.Create(); 
      file_pic := 'c:\temp.jpeg';
      try
        ms.LoadFromFile(file_pic);
        ADOQuery2.Insert;
        ADOQuery2.fieldbyname('pid').AsString := 'temp001'
        ADOQuery2.fieldbyname('pic').LoadFromStream(ms);
        ADOQuery2.post;
      except  end;
    end;
      

  2.   

    function imagesavetosql(dataset:TQuery;filename:String):boolean;
    var
      imagejpg:TJPEGImage; //jpg图片
      MyStm:TMemoryStream;
    begin
      result:=false;
      MyStm:=TMemoryStream.Create;
      imagejpg:=Tjpegimage.Create;
      if filename<>'' then
      begin
        imagejpg.LoadFromFile(filename);
        imagejpg.SaveToStream(MyStm);
        MyStm.Position:=0;
    //不可与DMImage之类控件,因为其只支持BMP
        TBlobField(dataset.FieldByName('pict')).LoadFromStream(MyStm); 
        result:=true;
      end;
      MyStm.Free;
      imagejpg.free;
    end;
      

  3.   

    楼上的说的差不多了,使用流操作,关键的一句是调用TBlobField.LoadFromStream方法,并配合TADOQuery.Insert/TADOQuery.Edit + TADOQuery.Post其实这个问题搜一下以前的帖子应该有一大堆的
      

  4.   

    我做了以后,数据库里的图都是  (BLOB)   这样是不是没保存(我把图设成非空)
      

  5.   

    就是要把數據類型設成blob類型,不過好像隻能作bmp圖吧,幾年前做過,現在不記得了把我的測試過的代碼給你。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, DBCtrls, Mask, Db, DBTables, Spin, ADODB, ExtDlgs,
      Buttons, Grids, DBGrids;type
      TForm1 = class(TForm)
        btnClose: TButton;
        btnSave: TButton;
        DBImage1: TDBImage;
        ADODataSet1: TADODataSet;
        DataSource1: TDataSource;
        edtTM: TEdit;
        DBGrid1: TDBGrid;
        Label1: TLabel;
        Label2: TLabel;
        edtXM: TEdit;
        btSavePic: TButton;
        btnAppend: TBitBtn;
        ADODataSet1ugTM: TStringField;
        ADODataSet1ugXM: TStringField;
        ADODataSet1ugPHOTO: TBlobField;
        diaPic: TOpenPictureDialog;
        procedure btnCloseClick(Sender: TObject);
        procedure btnSaveClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure btSavePicClick(Sender: TObject);
        procedure btnAppendClick(Sender: TObject);
        procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure edtXMKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure edtTMKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
      function BlobToString(const AFileName :String) :String;
      function SaveBlobField(Field: TField; const FileName: String): Boolean;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}function TForm1.BlobToString(const AFileName :String) :String;
    begin
      with TFileStream.Create(AFileName, fmOpenRead) do
      try
        SetLength(Result, Size);
        Read(Pointer(Result)^, Size);
      finally
        Free;
      end;
    end;procedure TForm1.btnCloseClick(Sender: TObject);
    begin
    close;
    end;
    function TForm1.SaveBlobField(Field: TField; const FileName: String): Boolean;
      function BlobContentToString(const FileName: String): String;
      begin
        with TFileStream.Create(FileName, fmOpenRead) do
        try
          SetLength(Result, Size);
          Read(Pointer(Result)^, Size);
        finally
          Free;
        end;
      end;begin
      Result := True;
      try
        Field.AsVariant:= BlobContentToString(FileName);
      except
        Result := False;
      end;
    end;procedure TForm1.btnSaveClick(Sender: TObject);
    begin
      Adodataset1.UpdateBatch ;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    if adodataset1.State =dsInactive    then
       adodataset1.Open;
    end;procedure TForm1.btSavePicClick(Sender: TObject);
    var fileName:string;
    begin
    if diaPic.Execute then
          fileName:=diaPic.FileName ;
     adodataset1.edit;
     try
       SaveBlobField(adodataset1.FieldByName('ugphoto'),fileName);
     except
       showmessage('圖片添加未成功');
     end;
    end;procedure TForm1.btnAppendClick(Sender: TObject);
    begin
    if AdoDataset1.State <>dsInActive then
    begin
       AdoDataSet1.Append ;
       AdoDataSet1['ugTM']:=edtTM.Text ;
       AdoDataSet1['ugXM']:=edtXM.Text ;
    end;
    end;procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    IF key=vk_delete then
      if MessageDlg('確定要刪除嗎?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then
       begin
        AdoDataSet1.Delete;
        Adodataset1.UpdateBatch ;
       end;end;procedure TForm1.edtXMKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if key=$d then
         btnAppend.Click ;
    end;procedure TForm1.edtTMKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
     if key =13 then
        keybd_event(VK_TAB,0,0,0);
    end;end.