procedure TForm1.Button1Click(Sender: TObject);
var
  tempFile:TFileStream;
  strName:string;
  strSql:string;
begin
  if opendialog1.Execute then
    strName:=opendialog1.FileName;
try
  tempFile:=TFileStream.Create(strName,fmOpenRead);
  strSql:='';
  strSql:=strSql+'insert into fileSave values(';
  strSql:=strSql+Quotedstr(strName)+',';
  strSql:=strSql+':FileSelf'+')';
  with adoquery1 do
    begin
      close;
      sql.Clear;
      sql.Add(strSql);
      TBlobField(parameters.ParamByName('FileSelf')).LoadFromStream(tempFile);    //运行到这句总出错,为何?
      ExecSql;
    end;finally
  tempFile.Free;
end;
end;

解决方案 »

  1.   

    parameters支持大对象吗?
    大对象字段,最好不要用sql.
    adoquery.append();
    TBlobField(parameters.ParamByName('FileSelf')).LoadFromStream(tempFile);
    adoquery.post();
      

  2.   

    楼上的也不行呀,‘can't peform on closed table’
      

  3.   

    添加/读出文件到access数据库-yanghaisheng
    //函数名: AddDocIntoTable
    //参数:
    //   aFileName:string 文件名,含全路径
    //   Table:TADOTable  表名,所用的数据表控件的名称
    //返回:boolean 添加到表成功则返回true,否则返false
    //描述:  本函数将指定的文件导入数据库中.
    function TfrmMain.AddDocIntoTable(aFileName:string;Table:TADOTable):boolean;
    var
      MStream: TMemoryStream;
      FileName:string;begin
      if(not FileExists(aFileName)and (ExtractFileExt(aFileName) = ''))then
      begin
        result:=false;
        exit;
      end;
      try
        //得到文件名
        FileName:=ExtractFilename(aFileName);
        if not  Table.Active then Table.Active :=true;
       
        //装载文件到流
        MStream:=TMemoryStream.create;
        try      MStream.LoadFromFile(aFileName);
        except
          ShowMessage('不能打开文件,这个文件可能被其他程序打开了。');
          MStream.Free;
          Result:=false;
          exit;
        end;
        MStream.Position :=0;    //添加数据到数据库中
        Table.Append ;
        Table.FieldByName('FileName').asString :=FileName;
        TBlobField(Table.FieldByName('File')).LoadFromStream(MStream);
        Table.Post ;
        //释放流
        MStream.Free ;
      except
       //出错返回
       if(MStream<>nil)then MStream:=nil ;
       Result:=false;
       exit;
      end;
      Result:=true;
    end;
    //函数名: SaveTableDocToFile
    //参数:
    //   aFilePath:string  路径,最后字符不是'\'
    //   Table:TADOTable  表名,所用的数据表控件的名称
    //返回:boolean 保存文件成功则返回true,否则返false
    //描述:  本函数将从数据库读取当前指针所指记录,并写入文件中.function TfrmMain.SaveTableDocToFile(aFilePath:string;Table:TADOTable):boolean;
    var
      MStream:TStream;
      MFileStream:TFileStream;
      pImage: pointer;
      FileName:string;
      aFileName:String;
    begin
      try
       if not  Table.Active then Table.Active :=true;
       
       //从数据库读出文件信息
       MStream:=Table.CreateBlobStream(Table.FieldbyName('File'),bmRead);
       FileName :=Table.FieldByName('FileName').asString ;   //组合文件名
       aFileName := aFilePath+'\'+ FileName;
       MStream.Position:=0;
       GetMem(pImage, MStream.Size);
       //创建文件
       MFileStream := TFileStream.Create(aFileName, fmCreate);
       MStream.Read(pImage^,MStream.Size);
       MFileStream.Write(pImage^ ,MStream.Size);
       FreeMem(pImage);   MFileStream.Free ;
       MStream.Free ;
      except
        if(MStream<>nil)then MStream:=nil ;
        if(MFileStream<>nil)then MFileStream:=nil ;
        Result:=false;
        exit;
      end;
      Result:=true;
    end;
      

  4.   

    两个字段,我都写了,why?
    用adoquery成功了吗?
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      tempFile:TMemoryStream;
      strName:string;
    begin
    strName:='F:\原码控件资料\关于通用进销存的模块设置与与功能流程的文档 .doc';
    try
      tempFile := TMemoryStream.Create ;
      tempFile.LoadFromFile(strName);
      with adoquery1 do
        begin
          close;
          sql.Clear;
          sql.Add('insert into file1(id, afile) values(1,:FileSelf)');
          parameters.ParamByName('FileSelf').LoadFromStream(tempFile, ftBlob);
          ExecSql;
        end;
    finally
      tempFile.Free;
    end;
      

  6.   

    老大,试了吗?不行呀,我用楼上的adotable可以的。
    但是怎么读呢?有问题。
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      tempFile:TMemoryStream;
      str:string;begin
      adotable1.Open;
      adotable1.First;
    try
      tempFile:=TMemoryStream.Create;
      tempFile.Position:=0;
      TBlobField(adotable1.FieldByName('fileself')).SaveToStream(tempFile);
    //////write stream error 这是怎么了?
       OleContainer1.LoadFromStream(tempFile);
    finally
      tempFile.Free;
    end;
    多谢!!
      

  7.   

    try
      tempFile:=TMemoryStream.Create;
     // tempFile.Position:=0;
      TBlobField(adotable1.FieldByName('fileself')).SaveToStream(tempFile);
      tempfile.Position:=0;
      OleContainer1.LoadFromStream(tempFile);
                                             //ERROR!!
                                             //无效的流格式
                                             //invalid stream format
                                            //谁能告诉我?多谢·!!!!
      olecontainer1.DoVerb(1);
    finally
      tempFile.Free;
    end;
      

  8.   

    bh:=getbhmax(tablename);
    adoQuery1.close;
    adoQuery1.sql.clear;
    adoQuery1.sql.text:='select *  from czsc';
    adoQuery1.open;
    adoQuery1.append;
    adoQuery1.fieldbyname('bh').value:=bh;
    adoQuery1.fieldbyname('title').value:=title;
    adoQuery1.fieldbyname('bgr').value:=sddsmainfrm.global_username;
    adoquery1.FieldByName('jg_dm').Value:=sddsmainfrm.global_bh;
    TBlobField(adoQuery1.fieldbyname('topic')).loadfromstream(ms);
    ms.free;
    adoQuery1.post;
    adoQuery1.close;
      

  9.   

    var
    ms:TMemoryStream;
    bh,tablename:string;
    title:string;
      

  10.   

    多谢各位!
    现在写入没有问题了,但是读出的有问题。
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      tempFile:TMemoryStream;  str:string;begin  adotable1.Open;
      adotable1.Last;
    try
      tempFile:=TMemoryStream.Create;
      TBlobField(adotable1.FieldByName('fileself')).SaveToStream(tempFile);
      tempfile.Position:=0;
      OleContainer1.LoadFromStream(tempFile);  //这一句有问题,无效的stream格式,
     这是怎么回事?
      olecontainer1.DoVerb(1);
    finally
      tempFile.Free;
    end;end;
      

  11.   

    有人说是olecontaier只能读出用它的流保存到数据库中的文件,
    是这样吗?如果是这样的话,那么用别的流(tfilestream,tmemorystream)等
    保存到数据库中的Word文档该如何显示呢?多谢!!
      

  12.   

    TBlobField(adotable1.FieldByName('fileself')).SaveToStream(wordFileName);
    用Word打开
      

  13.   

    TBlobField(adotable1.FieldByName('fileself')).SaveToFile(wordFileName);
    用Word打开
      

  14.   

    //---------------add--2003-05-07---sunfx
    {
     function filedisplay
     从数据库里将文章显示在ole当中
    }
    procedure Tyeargzcgwritefrm.filedisplay(var bh:string;tablename:string);
    var
    strstream:Tmemorystream;
    str_query:string;
    begin
        str_query:='select topic from '+tablename+' where bh='''+bh+'''';
        OleContainer1.DestroyObject;
        strstream := Tmemorystream.Create;
        adoquery1.Close;
        adoquery1.sql.clear;
        adoquery1.SQL.Add(str_query) ;
        adoquery1.open ;
        adoquery1.First;
        Tblobfield(adoquery1.fieldbyname('topic')).savetostream(strstream);
        strstream.position:=0;
        OleContainer1.loadfromstream(strstream);
        strstream.free;
    end;
      

  15.   

    关于效率问题。我也做过这样的内容,但我不是用文件流而是 先将要存入数据库的文件 保存到硬盘中去,然后再 用 Tblobfieldbyname('field').loadfrom('filename') ;这样保存。读出时也一样,先将数据库中的内容保存到硬盘中去 Tblobfieldbyname('filed').savetofile('filename')  .如果要显示的话,再去找这个文件。 我想我的这种方法从运行效率和数据库的大小这两方面上看的话。会不会差得很多?
      

  16.   

    To
     scu96124678(绿林侠) :
     这样读出的是乱码,包括了一些格式之类的东西,我用你的两种方法都试了,
    都不行,都是乱码。
      请问,你成功了吗?多谢!!
    直接用TMemoryStream或者TFileStream存入数据库的,都不能读出,均为乱码。
    怎么办?
      

  17.   

    procedure TForm1.Button1Click(Sender: TObject);  //录入按钮的响应事件  begin   ole1.SaveToFile('tempole.nnn');  //保存OLE控件中内容到临时文件中   table1.edit; //设置表的编辑状态   table1new.LoadFromFile('tempole.nnn');  //调整表中NEW字段的内容为临时文件的内容  DBGrid1.Fields[5].AsString:='1';  //调整表中特殊标志字段的内容为1  end;
      

  18.   

    http://expert.csdn.net/Expert/topic/1746/1746726.xml?temp=.1398737
      

  19.   

    老大:我觉得你提到的问题也没有解决呀。
    我希望用Ado实现,可以吗?
    用其他格式stream存进数据库重的blob字段,
    该如何读出呢?
    多谢!!
      

  20.   

    SQLServer的Blob字段,delfault ' '--->中间有空格
      

  21.   

    Ado一样的!
    其他流格式可以转化为临时文件‘aaa.nnn’然后ole1.LoadFromFile(‘aaa.nnn’);
      

  22.   

    关键是如果用其他流格式存入数据库的,好像ole不认识呀,我也看了一些
    文章,说是Ole并不能加载所有的流格式,这样的话,是否用其他流存入数据
    的blob就没有用了?因为并不能用Ole读出亚?怎么办?楼上的意思是:其他格式流存入的blob,如果转为一临时文件,再用Ole加载,
    就可以了?我试试。
      

  23.   

    To readersm68(地主):
      你的意思是否:在存入数据库的时候,也需要用ole作一个过渡(转为临时文件),然后
    把这个临时文件存入数据库?然后,读出的时候,ole就正常了?这样是可以得,我已经测试过了,
      我想:能否不作这个过渡,然后直接用ole读出呢?
      多谢!
      

  24.   

    应该不行,ole不知道流的格式,无法预先设置ole对象,然后加载流。有请大虾出场
      

  25.   

    如果是这样的话,那么是否把blob字段存入数据库,必须经过这个转换过渡?
    否则,用ole是读不出来得?如果不用ole读,是否还有别的方法读出?
      

  26.   

    blobFieldName.GetText事件
    text := Sender.Astring;
    blobFieldName.SetText事件
    Sender.Astring:= text ;
      

  27.   

    数据集永久字段有OnGetText,OnSetText 事件在dbgrid中可以显示Blob内容
    调用DBGrid1DrawColumnCell事件
    unit DrawForm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      DBTables, DB, Grids, DBGrids, ExtCtrls, StdCtrls, DBCtrls;type
      TForm1 = class(TForm)
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Table1: TTable;
        Table1SpeciesNo: TFloatField;
        Table1Category: TStringField;
        Table1Common_Name: TStringField;
        Table1Lengthcm: TFloatField;
        Table1Notes: TMemoField;
        Table1Graphic: TGraphicField;
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure FormCreate(Sender: TObject);
        procedure Table1NotesGetText(Sender: TField; var Text: String;
          DisplayText: Boolean);
        procedure Table1NotesSetText(Sender: TField; const Text: String);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var
      Bmp: TBitmap;
      OutRect: TRect;
      BmpWidth: Integer;
    begin
      // default output rectangle
      OutRect := Rect;  if Column.Field = Table1Common_Name then
      begin
        // draw the image
        Bmp := TBitmap.Create;
        try
          Bmp.Assign (Table1Graphic);
          BmpWidth := (Rect.Bottom - Rect.Top) * 2;
          OutRect.Right := Rect.Left + BmpWidth;
          DBGrid1.Canvas.StretchDraw (OutRect, Bmp);
        finally
          Bmp.Free;
        end;
        // reset output rectangle, leaving space for the graphic
        OutRect := Rect;
        OutRect.Left := OutRect.Left + BmpWidth;
      end;  // red font color if length > 100
      if (Column.Field = Table1Lengthcm) and
          (Table1Lengthcm.AsInteger > 100) then
        DBGrid1.Canvas.Font.Color := clRed;  // default drawing
      DBGrid1.DefaultDrawDataCell (OutRect, Column.Field, State);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Table1.Active := True;
    end;procedure TForm1.Table1NotesGetText(Sender: TField; var Text: String;
      DisplayText: Boolean);
    begin
      Text := Trim (Sender.AsString);
    end;procedure TForm1.Table1NotesSetText(Sender: TField; const Text: String);
    begin
      Sender.AsString := Text;
    end;end.object Form1: TForm1
      Left = 209
      Top = 157
      Width = 790
      Height = 309
      Caption = 'Draw Data Grid'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = True
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object DBGrid1: TDBGrid
        Left = 0
        Top = 0
        Width = 782
        Height = 282
        Align = alClient
        BorderStyle = bsNone
        DataSource = DataSource1
        DefaultDrawing = False
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -16
        Font.Name = 'MS Sans Serif'
        Font.Style = [fsBold]
        Options = [dgEditing, dgAlwaysShowEditor, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit]
        ParentFont = False
        TabOrder = 0
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = 'MS Sans Serif'
        TitleFont.Style = []
        OnDrawColumnCell = DBGrid1DrawColumnCell
      end
      object DataSource1: TDataSource
        DataSet = Table1
        Left = 24
        Top = 16
      end
      object Table1: TTable
        DatabaseName = 'DBDEMOS'
        FieldDefs = <
          item
            Name = 'Species No'
            DataType = ftFloat
          end
          item
            Name = 'Category'
            DataType = ftString
            Size = 15
          end
          item
            Name = 'Common_Name'
            DataType = ftString
            Size = 30
          end
          item
            Name = 'Species Name'
            DataType = ftString
            Size = 40
          end
          item
            Name = 'Length (cm)'
            DataType = ftFloat
          end
          item
            Name = 'Length_In'
            DataType = ftFloat
          end
          item
            Name = 'Notes'
            DataType = ftMemo
            Size = 50
          end
          item
            Name = 'Graphic'
            DataType = ftGraphic
          end>
        IndexDefs = <
          item
            Name = 'Table1Index1'
            Fields = 'Species No'
            Options = [ixPrimary, ixUnique]
          end>
        StoreDefs = True
        TableName = 'biolife.db'
        UpdateMode = upWhereChanged
        Left = 24
        Top = 72
        object Table1SpeciesNo: TFloatField
          FieldName = 'Species No'
          Visible = False
        end
        object Table1Category: TStringField
          DisplayWidth = 12
          FieldName = 'Category'
          Size = 15
        end
        object Table1Common_Name: TStringField
          DisplayWidth = 23
          FieldName = 'Common_Name'
          Size = 30
        end
        object Table1Lengthcm: TFloatField
          DisplayWidth = 9
          FieldName = 'Length (cm)'
        end
        object Table1Notes: TMemoField
          DisplayWidth = 36
          FieldName = 'Notes'
          OnGetText = Table1NotesGetText
          OnSetText = Table1NotesSetText
          BlobType = ftMemo
          Size = 50
        end
        object Table1Graphic: TGraphicField
          DisplayWidth = 9
          FieldName = 'Graphic'
          Visible = False
          BlobType = ftGraphic
        end
      end
    end
      

  28.   

    var
     MS: TMemoryStream;
    begin
     MS:=TMemoryStream.create;
     MStream.LoadFromFile(MS);
     MS.Position:=0;
     Table1.Append;  
    file://在数据库中添加一条记录
     TBlobField(Table1.FieldbyName
    ('image')).LoadFromStream(MS);
     Table1.Post;    
    file://将所作的更新写入数据库
    end;
      

  29.   

    楼上的,你这样可以将数据写入,但是,怎样读出呢?
    比如:如果写入的是Word,但是读出后用olecontainer 
    是不能加载的,你是如何处理的?或者用什么方法可以
    把这个word文件显示?olecontainer的流格式不对,不能载入!