求救,在delphi如何把word文档保存到sql server数据库,保存后又如何取出来在word中显示其内容?另:存放word文档的字段是什么类型?image还是text 还是....
谢谢!如有调试通过的这方面的code,本人高分答谢!

解决方案 »

  1.   

    不是image也不是text,其实可以只保存路径。
      

  2.   

    在程序中将数据库的查询结果输出到word文档
    A.Delphi 安装目录下有个Demo 例子,很简单
    你把它改改,加上个循环就搞定!!!!!!!
    c:\Program Files\Borland\Delphi5\Demos\Activex\Oleauto\Word8 
    B............
    下面是调用word模版的程序,但是跟你要实现的可能有一定的差别,以下仅供参考:procedure TForm1.Button2Click(Sender: TObject);//按钮事件
    var fn,i:OleVariant;
    begin
       with WordApplication1 do
       begin
          try
           Connect();
           fn:='d:\小蔡\wordprt\wordot\01.dot';//指定已建模板的路径。
           i:=false;//当i为true或零并且已有指定模板,系统根据所建模板再重新建一个模板,
                  //若以前没有建模板则系统将会出现有关文档不存在或文档路径出错等信息
                      //若i为false或1并且已有指定模板,系统将会启动所指定模板。
            Documents.Add(fn,i);
            Replace('Edit1',Edit1.Text);//替换文本
            Replace('Edit2',Edit2.Text);
            Replace('Edit3',memo1.Text);
          finally
            Visible:=True;
            Disconnect();
          end;
       end;
    end;procedure TForm1.Replace(Source,Dest:string);//replace函数
    var FindText,MatchCase,MatchWholeWord,MatchWildCards,MatchSoundsLike,
        MatchAllWordForms,FForward,Wrap,Format,ReplaceWith,Replace,
        MatchKaShida,MatchDiacritics,MatchAlefHamza,MatchControl:OleVariant;
        What,Which,Count,CName:OleVariant;
    begin
       with WordApplication1 do
         begin
            FindText:=Source;
            MatchCase:=True;
            MatchWholeWord:=False;
            MatchAllWordForms:=False;
            MatchSoundsLike:=False;
            FForward:=True;
            Wrap:=False;
            Format:=False;
            //ReplaceWith:='';
            replaceWith:=dest;
            replace:=true;
            //Replace:=False;
            MatchKaShida:=False;
            MatchDiacritics:=False;
            MatchAlefHamza:=False;
            MatchControl:=False;
            Selection.Find.Execute(FindText,MatchCase,MatchWholeWord,
                                   MatchWildCards,MatchSoundsLike,
                                   MatchAllWordForms,FForward,wrap,Format,
                                   ReplaceWith,Replace);
            //Selection.TypeText(Dest);该语句和前面的两条语句结合后word中被替换的文字
                   是长文本,而如果用现有的语句,则word中被替换的文本最长为504个字节。
            What:=wdGotoPage;
            Which:=wdGotoNext;
            Count:=1;
            CName:='';
            Selection.GoTo_(What,Which,Count,CName);
         end;
    end; 
     
      

  3.   

    可不可以将WORD文档存SQL SERVER 的image类型的字段?保存word文档:
    procedure Tfrmdyqk1.BitBtn3Click(Sender: TObject);
    var  ms:TMemoryStream;
    begin
      ms:= TMemoryStream.create;
      OleContainer1.SaveToStream (ms);
      ms.Position := 0;  Query1.close;
      Query1.sql.clear;
      Query1.sql.text:='select *  from oadbo.bw_qwb';
      Query1.open;
      Query1.append;
      Query1.fieldbyname('wjid').value:=77777777 ;
      Query1.fieldbyname('wjdid').value:=7;
      Query1.fieldbyname('kzm').value:='txt';
      TBlobField(Query1.fieldbyname('qw')).loadfromstream(ms);
      ms.free;
      Query1.post;
      //Query1.applyupdates;
      Query1.close;
    end;
    取出word文档:
    procedure Tfrmdyqk1.Button2Click(Sender: TObject);
    var  strstream:Tmemorystream;
          //ls_qw:string;
    begin    OleContainer1.DestroyObject;
        strstream := Tmemorystream.Create;    query1.Close;
        query1.sql.clear;
        query1.SQL.Add('select qw from oadbo.bw_qwb where wjid =' + inttostr(77777777));
        query1.open ;
        query1.First;      
        Tblobfield(query1.fieldbyname('qw')).savetostream(strstream);
        strstream.position:=0;
        OleContainer1.loadfromstream(strstream);    strstream.free;
    end;
      

  4.   

    对,保存WORD路径是最明智的,点击后再用WORD打开
      

  5.   

    procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ;
    var
        sCommandLine: string;
        bCreateProcess: boolean;
        lpStartupInfo: TStartupInfo;
        lpProcessInformation: TProcessInformation;
        MemSize: Integer;
        Buffer: PChar;
        MyFile: TFileStream;
        Stream: TADOBlobStream;
        RegF:TRegistry;
    begin
        RegF:=TRegistry.Create;    //查看.doc文档的打开程序
        RegF.RootKey:=HKEY_classes_root;
        try
           RegF.OpenKey('worddocument\protocol\stdfileediting\server',True);
           sCommandLine:=regf.ReadString('')+' '+ExtractFilePath(Application.EXEName)+'temp.doc';
        except
        End;
        RegF.CloseKey;
        RegF.Free;
        dataset.Close;
        dataset.commandtext :='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid);
        dataset.open;
        if not dataset.eof then
            begin
            MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.tmp',fmCreate);
            Stream:=TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmRead);
            MemSize := Stream.Size;
            Inc(MemSize);
            Buffer := AllocMem(MemSize);
            try
                Stream.Read(Buffer^,MemSize);
                MyFile.Write(Buffer^,MemSize);
            finally
                MyFile.Free;Stream.Free;
            end;
            if FileExists(ExtractFilePath(Application.EXEName)+'temp.DOC') then DeleteFile(ExtractFilePath(Application.EXEName)+'temp.DOC');
            if FileExists(ExtractFilePath(Application.EXEName)+'temp.tmp') then RenameFile(ExtractFilePath(Application.EXEName)+'temp.tmp', ExtractFilePath(Application.EXEName)+'temp.DOC');
            end
        else
            begin
               if FileExists(ExtractFilePath(Application.EXEName)+'empty.DOC') then
                    copyfile(pchar(ExtractFilePath(Application.EXEName)+'empty.DOC'),pchar(ExtractFilePath(Application.EXEName)+'temp.DOC'),false)
               else begin
                    ShowMessage('<'+ExtractFilePath(Application.EXEName)+'empty.DOC>不存在!');
                    dataset.close ;
                    exit;
               end;
            end;
        dataset.close ;
        //sCommandLine :='C:\Program Files\Microsoft Office\Office\winword.exe '+ExtractFilePath(Application.EXEName)+'temp.doc';    FillChar(lpStartupInfo, Sizeof(TStartupInfo), #0);
        lpStartupInfo.cb := Sizeof(TStartupInfo);
        lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
        lpStartupInfo.wShowWindow := SW_NORMAL;
        bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, nil, lpStartupInfo, lpProcessInformation);
        //ShellExecute(zxdcc.Handle,'save',pchar(ExtractFilePath(Application.EXEName)+'empty.doc') ,'','',SW_SHOWNORMAL);    if bCreateProcess then
        WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
        dataset.Close;
        dataset.commandtext:='select * from 二进制文档 where 来源=''' +sourcetablename+''' and 来源id='+inttostr(sourceid);
        dataset.open;
        if not dataset.eof then
            dataset.Edit
        else begin
            dataset.close;
            dataset.commandtext:='select * from 二进制文档';
            dataset.open;
            dataset.append;
            end;
        dataset.FieldValues['来源']:=sourcetablename;
        dataset.FieldValues['来源id']:=sourceid;
        MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+'temp.doc',fmOpenRead);
        Stream := TADOBlobStream.Create(dataset.FieldByName('内容') as TBlobField, bmWrite);{‘Doc’为BLOB字段名}
        MemSize := MyFile.Size;
        Inc(MemSize);//增加的一字节给结尾的null
        Buffer := AllocMem(MemSize);
        try
            Stream.Seek(0, soFromBeginning);//流指针位置放到最前
            MyFile.Read(Buffer^,MemSize);
            Stream.Write(Buffer^,MemSize);
        finally
            MyFile.Free;
            Stream.Free;
        end;
        dataset.post;
        dataset.close;
    end;
      

  6.   

    qwertyasd(昊):
      你好!请问以下语句中的确“二进制文档“指的是表名吗?来源呢?
      dataset.commandtext:='select * from 二进制文档 where 来源='''
    谢谢! 
      

  7.   

    可以在sqlserver中保存word文档,采用adoblobstream和olecontainer,或者直接采用wordapplication.在sqlserver中用image保存,然后用adoblobstream.create(tblobfield(imagefieldname),fmread)读出,这样就可以loadfromfile和savetofile。olecontainer可以createobjectfromfile(savedfile),编辑完成后可以saveasdocument(filename),最后可以用adoblobstream的loadfromfile(filename)将文件存到sqlserver中。
      

  8.   

    二进制文档 是image类型字段,
    来源 保存的文档来自那个 表
    id 是 来自那个表的id我是建一个表用这三个字段,专门存储二进制文档 ,例如word 的文档
      

  9.   

    上面错了 二进制文档就是这个表名。
    内容是image类型字段 用来保存word文档。 procedure towordsave(sourcetablename: string;sourceid:integer;dataset:tadodataset) ;
    是一个通用过程,使用方法
    towordsave('撰写文章',toint(key.text),data.ADODataSet1);
    '撰写文章'是指来源,
    toint(key.text)来源id
    data.ADODataSet1 数据元
      

  10.   

    qwertyasd(昊) :
       你好!代码执行到:bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, nil, lpStartupInfo, lpProcessInformation);  时,总是自动打开c:\program.doc这个文档(其实C:\下根本没有program.doc)。请解释一下。另,该行代码的作用是什么?
      最后发现,保存成功,但又如何取出来,在word中显示呢?
      

  11.   

    需要在可执行文件目录下有一个empty.DOC文件。如果二进制文档表的来源和 ID,与 
    towordsave('撰写文章',toint(key.text),data.ADODataSet1);
    传过来的参数相同,说明已有此文档,则自动打开!
    你不要机械的用我跟你的带吗?应该理解它的原理!