还是delphi+oracle数据库,带偶的博士要求能够在delphi下直接把数据库中的word文档打开,找了半天找到一个demo,可以在数据库中存储word文档,是用ole来实现,如下:unit oleUnit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtnrs, StdCtrls, DB, DBTables;type
  TForm1 = class(TForm)
    Table1: TTable;
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Button2: TButton;
    OleContainer1: TOleContainer;
    Database1: TDatabase;
    Button3: TButton;
    Table1NAME: TStringField;
    Table1SIZE1: TStringField;
    Table1DOC: TBlobField;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  memsize:integer;
  buffer:pchar;
  myfile:tfilestream;
  stream:tblobstream;
begin
    myfile:=tfilestream.Create('c:\temp.tmp',fmcreate);
    with table1 do
    begin
      open;
      stream:=tblobstream.Create(fieldbyname('doc')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;
    end;
    if fileexists('c:\temp.doc') then
        deletefile('c:\temp.doc');
    if fileexists('c:\temp.tmp') then
    begin
      renamefile('c:\temp.tmp','c:\temp.doc');
      OleContainer1.CreateObjectFromFile('c:\temp.doc',false);
      OleContainer1.Run;
      end;end;procedure TForm1.Button2Click(Sender: TObject);
var
  memsize:integer;
  buffer:pchar;
  myfile:tfilestream;
  stream:tblobstream;
  filename:string;
begin
   opendialog1.filter:='(*.doc)|*.doc';
   if opendialog1.Execute then
   begin
   filename:=opendialog1.FileName;
   myfile:=tfilestream.Create(filename,fmopenread);
   with table1 do
   begin
     open;
     edit;
     stream:=tblobstream.Create(fieldbyname('doc')as tblobfield,bmwrite);
     memsize:=myfile.Size;
     inc(memsize);
     buffer:=allocmem(memsize);
     try
       stream.Seek(0,sofrombeginning);
       myfile.Read(buffer^,memsize);
       stream.Write(buffer^,memsize);
       fieldbyname('name').AsString:=extractfilename(filename);
       fieldbyname('size1').AsString:=inttostr(memsize-1);
        finally
        myfile.Free;
        stream.Free;
        end;
        try
        table1.Post;
        except
        showmessage('保存失败');
        halt;
        end;
        showmessage('保存成功');
         OleContainer1.createobjectfromfile(filename,false);
         OleContainer1.run;
        end;
        end;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  OleContainer1.CleanupInstance;
  OleContainer1.Refresh;
end;end.出的问题;1.小文档存取没有问题,可是40K以上,就报错project oleproject1.exe raised exception class EDBEngineError with message'Invalid BLOB length.'.Process stopped....2。只是反复在数据库的第一条记录上存取。这也太不实际了,我可是有上千条记录等着输入啊。哪位大侠给点提示方案,等着救命呢

解决方案 »

  1.   

    你的存储是通过bde完成的
    bde默认的blob size是32k 超过这个数值会自动截断
    解决的方法是在建立bde连接时将 database的blob size 改大 如
    database1.params['blob size']:=1024 则可存放1m的文件了
      

  2.   

    设置bde的有关大字段的参数。
      

  3.   

    四楼的,有意见直说,何必这么讽刺人!我本来就不是做it,也不想做it,更不是计算机专业毕业的。老实说,本科四年没有学过数据库,以前连oralce和delphi牙根没有听说过。只是毕业设计稀里糊涂就上了做数据库的贼船。我若是真的“不想付出,只想收获”,那我一开始就会给老师说,我是在混毕业!气愤…………
      

  4.   

    唉,林子大了,什么都有!
    Table1.First;
    while not Table.Eof do begin
      ........
      ........
      Table.Next
    end;
      

  5.   

    zhang21cnboy(沧桑男人) 我不想跟你争,但请你不要侮辱我个人以及我的老师和同学!我相信现在大学里非计算机专业的很多人的毕业设计都不是和自己的专业联系非常紧密,不信你可以自己去问。我并不认为老师出这样的题目是刁难人,至少我现在多少建立起了一点数据库的概念,也发现了delphi一个很有趣的工具。或许自己将来可以用它做点其他东西。没有人指望本科毕业设计能够作出多么实用的东西。我问过高年级的博士,他们说只是希望本科生通过毕业设计掌握一种学习的方法。我接触了其他学校的一些学生,有的人的毕业设计烂得像垃圾,譬如说帮老师做课件。我若是“混蛋”,当初就会挑简单得像“1”一样的题目了!有句话请您记住——不要以今天的成熟来嘲笑过去的幼稚。
      

  6.   

    我试着在程序中移动了指针

    procedure TForm1.Button2Click(Sender: TObject);
    var
      memsize:integer;
      buffer:pchar;
      myfile:tfilestream;
      stream:tblobstream;
      filename:string;
    begin
       opendialog1.filter:='(*.doc)|*.doc';
       if opendialog1.Execute then
       begin
       filename:=opendialog1.FileName;
       myfile:=tfilestream.Create(filename,fmopenread);
       with table1 do
       begin
         open;
         edit;
    ——————————
    后面添加语句:
      if table1.bof=true then 
          showmessage ('ok');
      if table1.eof=false then
          showmessage('ok');运行程序后,两个对话框相继弹出,说明现在指针指的是第一条记录,而且不是最后一条。然后,我在showmessage('保存成功');
             OleContainer1.createobjectfromfile(filename,false);
             OleContainer1.run;
    ——————————————————————
    后面添加
    table1.next;单步调试程序,一直到弹出‘保存成功’的对话框都是好的,可是一运行table1.next
    就报错:microsoft ODBC驱动程序管理器错误。如果我改成table1.prior,就可以运行。但是指针明明是在第一条记录上的啊,怎么能还往前移呢?运行了几次,回头再看数据库,还只是在第一条也是唯一一条记录上反复修改。想了半天都不知道为什么,还望高手指点!
      

  7.   

    保存的问题解决了,没有必要用那么麻烦的代码
    用一个table,dbnavigator就可以了,代码如下begin 
     if opendialog1.execute then begin
      table1name.asstring:=extractfilename(opendialog1.filename);
      olecontainer1.creatobjectfromfile(opendialog1.filename,false);
      olecontainer1.savetofile('temp');
      table1files.loadfromfile('temp');
     end;
    end;
      

  8.   

    一行搞定。
    http://expert.csdn.net/Expert/topic/1830/1830978.xml?temp=.5713465