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

abcd4321585

abcd4321585

2016-01-29 14:15

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

  
  关系数据库都提供大文档的存储和提取。对于视频资料、音频资料、图象资料等大文档,一般需要 另外开辟字段用于存储摘要信息,因此在查询和检索时并不访问大字段,而只是在存储和提取时才操作 大字段。例如,你不能对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);

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/delphi/) 
展开更多 50%)
分享

猜你喜欢

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

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

Oracle大文本在ASP中存取问题的解决

ASP
Oracle大文本在ASP中存取问题的解决

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Delphi存取图像完整解决方案

Delphi
Delphi存取图像完整解决方案

如何在delphi5中实现对word文档页眉的设置?

编程语言 网络编程
如何在delphi5中实现对word文档页眉的设置?

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

3.2 Oracle大文本在ASP中存取问题的解决

Web开发
3.2 Oracle大文本在ASP中存取问题的解决

Delphi图像存取另类解决方案

Delphi
Delphi图像存取另类解决方案

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

牛刀小小试 PHP5中PDO的简单使用

牛刀小小试 PHP5中PDO的简单使用

老技术新外衣 如何设计一个包含Ajax技术的PHP网页

老技术新外衣 如何设计一个包含Ajax技术的PHP网页
下拉加载更多内容 ↓