三层结构,word文件要保存再数据库中, 并且能取出来,编辑、修改,保存(word打开)。。
 
  数据库中字段是blod字段, (大家看看这段代码有什么问题吗。)
  str:Tmemorystream;//添加文件保存
.......
        sStr:= ' INSERT INTO DB2.table1(XH,ZHH,tp) values (:tp)....................;
        str:=Tmemorystream.Create;
        str.LoadFromFile(FileName);
        str.Position:=0;
        with  qryTmp  begin 
        Close;
        SQl.Clear;
        SQL.Add(sStr);
        TBlobField(ParamByName('TP')).LoadFromStream(str);
        //qryTmp.ParamByName('TP').LoadFromStream(str,ftblob);
        Post;
       endl;但是保存word文件老是老错,为什么??谢谢了

解决方案 »

  1.   

    哦没看清楚,应该这样:str:Tmemorystream;//添加文件保存
    .......
            sStr:= ' INSERT INTO DB2.table1(XH,ZHH,tp) values (:tp)....................;
            str:=Tmemorystream.Create;
            str.LoadFromFile(FileName);
            str.Position:=0;
            with  qryTmp  begin 
            Close;
            SQl.Clear;
            SQL.Add(sStr);
             Prepared;
            TBlobField(ParamByName('TP')).LoadFromStream(str);
            //qryTmp.ParamByName('TP').LoadFromStream(str,ftblob);
            ExecSQL;
           endl;
      

  2.   

    //看看下面我的代码
    procedure TForm1.Button1Click(Sender: TObject);
    var
      tempFile:TMemoryStream;
      strName:string;
    begin
    strName:='F:\temp .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;
      

  3.   

    //如果要读出来,就这样
    ========================
    //---------------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;
      

  4.   

    楼上的有没有试过,编译有错误,错误提示:invalid stream format !什么原因?????
      

  5.   

    楼上的有没有试过,编译有错误,错误提示:invalid stream format !什么原因?????
    ===============
    tempFile.LoadFromFile(strName)后面加上tempFile.Position := 0 呢??
      

  6.   

    我是用的IBM的中间件处理的,上一段代码,和我的那段感觉没什么区别的,但是我保存try时,就会跳到我的except里面抱错误,因为我是直接练在3层上面调试的。所以看不到出错代码。
    为什么,  谢谢大家关注。
      

  7.   

    抱'stream   read  error'的错误 ?????
      

  8.   

    终于搞定了:OleContainer1的LoadFromStream加载的流不是所有的流文件,而OleContainer1加载的流必须是用它的SaveToStream方法保存的一个流文件才可以加载的。所以在导入数据库中的时候先选择文件显示在OleContainer1中,再用OleContainer1的SaveToStream方法保存的一个流,然后保存到数据库中,若直接从文件读到流中(未经OleContainer)则在读流时候会出现Invalid stream format流格式不正确错误!因为若用文件流去加载一个.doc文件,但是doc文件本身不是一个COM组件。
    保存:
    procedure TFrmWord.Button9Click(Sender: TObject);
    var
      FileName:string;
      sm:TstringStream;
    begin
      try
        if opendialog1.Execute then begin
        FileName:=opendialog1.FileName;
        olecontainer1.CreateObjectFromFile(FileName,true);
        olecontainer1.DoVerb(ovPrimary);
        sm := tstringstream.create('');
        olecontainer1.savetostream(sm);
        with dm.qryTemp do 
        begin
          append;
          TBlobFIELD(Fieldbyname('data')).LoadFromStream(sm);
          post;
        end;
      finally
       sm.free;
      end;
    end;
    显示:
    procedure TFrmWord.Button5Click(Sender: TObject);
    var
      srm:Tstream;
    begin
      try
        srm := dm.qryTemp.CreateBLOBSTREAM(dm.qryTemp.fieldbyname('data'),bmRead);
        if srm.Size = 0 then
        begin
          srm.Free;
          Exit;
        end;
        OleContainer1.CreateObject('word.document',true)
        olecontainer1.loadfromstream(srm);
      finally
        srm.free;
      end;
    end;
    接分..................