Delphi中对Oracle存取RTF文档(1)

2016-01-29 14:15 18 1 收藏

Delphi中对Oracle存取RTF文档(1),Delphi中对Oracle存取RTF文档(1)

【 tulaoshi.com - Delphi 】

 

  
  关系数据库都提供大文档的存储和提取。对于视频资料、音频资料、图象资料等大文档,一般需要 另外开辟字段用于存储摘要信息,因此在查询和检索时并不访问大字段,而只是在存储和提取时才操作 大字段。例如,你不能对Oracle中的LONG RAW类型进行LIKE介词的查询,更不能使用等号“ =”查询。 这对于存储大段文本(容量超过2K)同时又需要全文检索是相当不便的。本文将介绍如何利用数据库的 字符串数据类型存取和查询大段文本。这里以Oracle数据库和Delphi应用程序为例,重点介绍如何在数据库中存取 RTF文档。

  对于纯文本,可以简单地将其分割成若干个串,分别存储到VARCHAR(2000)字段中即可。在查询时 可以使用LIKE比较,从而达到全文检索的目的。为了保留换行等段落信息,应当将回车换行(#13#10) 也作为串的一部分进行保存。数据录入时可以提供Memo控件(不是DBMemo)进行录入,然后顺序连接各行,当连接成的串临近2000个字符(单字节字符)长度时,就存入一条记录,然后对剩余的行重复上述操作。这样,最终将纯文本存成若干长度不超过2000的VARCHAR(2000) 字段中。这里需要另外开辟字段 用于存储文本编号和子序号,以便区分不同的文本和读取文本时顺序连接所有的子串。查询纯文本时, 就可以象查询普通的VARCHAR 字段一样,可以使用LIKE,也可以使用等号“ =”(几乎不需要使用)。 需要注意的是,可能用户提供的关键字正好被存储在不同的子串中,这时是查询不到的。因此,在设计时应当考虑存储重复的串。例如,每个子串中仅有前1900个字符是有效字符,最后100 个字符用于存储 下一个子串的前100 个字符。这样就避免了关键字被分开的情况。唯一的不足是,必须限制用户输入的 查询关键字长度不得超过100 个字符(50个汉字),但这很正常,算不上不足。

  事实上,同样可以利用这一技巧对 RTF文档进行存取和查询。这时,用于录入和显示 RTF文档的是 RichEdit控件(不是DBRichEdit),而不再是Memo控件。对于 RTF文档的存取,不能象存取纯文本那样 通过Memo的属性Lines.Strings[Index]进行操作(尽管RichEdit控件具有相同的属性),因为这样做就 无法保存文档的格式了。需要利用的是RichEdit的两个方法:SaveToFile和LoadFromFile。需要了解的 是, RTF文件中用纯字符描述字体、字号、文本等各种格式信息和内容信息。因此,存储和提取时可以 视为纯文本进行操作。但对于查询,就不能直接用LIKE加关键字的方式进行。因为 RTF文档中的每一个 汉字都是用特殊的表示方法存储,只有单字节字符是原样存储。所以在查询时要对关键字进行处理才能 用在查询语句中。 [next]在测试这个例子之前,必须有如下的数据结构,这里以Oracle创建表的 SQL语句形式给出:

  (*
  CREATE TABLE TEST( { 表名为 TEST }
   DOCID NUMBER NOT NULL, { 文档编号 }
   DOCNAME VARCHAR(40) NOT NULL, { 文档标题 }
   SUBID NUMBER NOT NULL, { 文档子编号 }
   TEXT VARCHAR(2000) NOT NULL, { 子文档内容 }
   PRIMARY KEY(DOCID, SUBID)); { 联合主键 }
  *)

   下面是程序实例中的主要部分:

  { ... ... }

  const
   BufSize = 2000; { 串的最大容量 }

  type
   TBuffer = array [1..BufSize] of Char; { 串缓存 }
   TFileOfChar = file of Char; { 字符类型文件 }

   TChnChar = string[2]; { 汉字字符类型 }

  { SQL查询,返回首记录首字段的值 }
  function SelectSQL(S: string): Variant;
  begin
   Result := NULL;
   with TADOQuery.Create(Application) do try
   Connection := FMain.ADOConnection1;
   SQL.Append(S);
   SQL.SaveToFile(‘c:a.txt‘);
   Open;
   Result := Fields[0].AsVariant;
   finally
   Free;
   end;
  end;

  { 下面的函数将RTF文档存入数据库 }
  function RTFToDB(ARichEdit: TRichEdit; { 文档容器 }
   DocName: string; { 文档标题 }
   ATable: TADOTable { 操作的表 }
   ): Boolean; { 返回类型 }
  const
   TmpFileName = ‘c:x.rtf‘; { 临时文档 }
  var
   DocID, SubID, L: Integer; { 局部变量 }
   S: string; { 串 }
   F: TFileOfChar; { 字符文件 }
   Buf: TBuffer; { 文本缓存 }
  begin
   ARichEdit.Lines.SaveToFile(TmpFileName);{ 先存入文件 }
   AssignFile(F, TmpFileName); { 打开文件 }
   Reset(F);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/delphi/) 

来源:https://www.tulaoshi.com/n/20160129/1492874.html

延伸阅读
作为一个ASP爱好者,笔者经常在ASP页面中使用ADO对象操作ODBC数据库,觉得用ASP创建WEB应用系统确定挺方便的.虽然在编程生涯中,笔者更喜欢Borland系列产品,对微软产品有点排斥,对ASP却是例外.某天,灵机一动,ADO对象是一个标准OLE对象,如果在DELPHI应用程序中能利用ADO操作数据库,应该挺不错.尤其在用DELPHI做网络数据库应用程序...
对一个数据库(Oracle database)的唯一标识,该数据库为第一章讲到的Oracle database。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的治理造成一定的负担,因为各个数据库的名字可能一样,造成治理上的混乱。为了解决这种情况,引入了Db_domain参数,这样在数据库的标识是...
JAN-1(January) FEB-2(February) MAR-3(March) APR-4(April) MAY-5(May) JUN-6(June) JUL-7(July) AUG-8(August) SEP-9(September) OCT-10(October) NOV-11(November) DEC-12(December) ******************************************************************** ****************************常用设置*************...
  一、使用存储过程返回数据集 Oracle中存储过程返回数据集是通过ref cursor类型数据的参数返回的,而返回数据的参数应该是out或in out类型的。 由于在定义存储过程时无法直接指定参数的数据类型为:ref cursor,而是首先通过以下方法将ref cursor进行了重定义: create or replace package FuxjPackage is type Fuxj...
标签: Delphi
  Borland卷土重来 在企盼了近2年之后,Borland的年度巨献Delphi 6终于浮出水面。由于信息技术的飞速发展,许多程序设计师需要不断在应用软件中加入最新的技术,或是用这些新技术开发下一代的应用系统。例如XML/XSL的盛行,让设计师对于如何处理和发挥XML技术有着强烈的需求,又例如SOAP逐渐成为远端和分布式计算的标...

经验教程

733

收藏

85
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部