程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中對Oracle存取RTF文檔(1) (1)

Delphi中對Oracle存取RTF文檔(1) (1)

編輯: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文檔中的每一個 漢字都是用特殊的表示方法存儲,只有單字節字符是原樣存儲。所以在查詢時要對關鍵字進行處理才能 用在查詢語句中。 在測試這個例子之前,必須有如下的數據結構,這裡以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);
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved