關系數據庫都提供大文檔的存儲和提取
對於純文本
事實上
在測試這個例子之前
(*
CREATE TABLE TEST( { 表名為 TEST }
DOCID NUMBER NOT NULL
DOCNAME VARCHAR(
SUBID NUMBER NOT NULL
TEXT VARCHAR(
PRIMARY KEY(DOCID
*) 下面是程序實例中的主要部分
{
const
BufSize =
type
TBuffer = array [
TFileOfChar = file of Char; { 字符類型文件 }
TChnChar = string[
{ SQL查詢
function SelectSQL(S: string): Variant;
begin
Result := NULL;
with TADOQuery
Connection := FMain
SQL
SQL
Open;
Result := Fields[
finally
Free;
end;
end;
{ 下面的函數將RTF文檔存入數據庫 }
function RTFToDB(ARichEdit: TRichEdit; { 文檔容器 }
DocName: string; { 文檔標題 }
ATable: TADOTable { 操作的表 }
): Boolean; { 返回類型 }
const
TmpFileName =
var
DocID
S: string; { 串 }
F: TFileOfChar; { 字符文件 }
Buf: TBuffer; { 文本緩存 }
begin
ARichEdit
AssignFile(F
Reset(F);
try
DocID := { 產生新的文檔編號 }
SelectSQL(
with ATable do if not Active then Active := True;{ 確認表打開 }
SubID :=
while not EOF(F) do begin
Inc(SubID);
BlockRead(F
S := Buf;
SetLength(S
with ATable do begin { 增加一條子文檔 }
Append;
FieldByName(
FieldByName(
FieldByName(
FieldByName(
Post;
end;
end;
Result := True; { 存儲成功 }
except
Result := False;{ 存儲失敗 }
end;
CloseFile(F); { 關閉文件 }
DeleteFile(TmpFileName);{ 刪除文件 }
end;
{ 下面的函數從數據庫中讀取RTF文檔
function RTFFromDB(ARichEdit: TRichEdit;{ RTF文檔容器 }
DocName: string; { 文檔標題 }
AQuery: TADOQuery { 操作的數據集 }
): Boolean; { 返回類型 }
const
TmpFileName =
var
S: string; { 局部串變量 }
F: TFileOfChar; { 字符文件 }
Buf: TBuffer; { 串緩存 }
I
begin
ARichEdit
AssignFile(F
try
Rewrite(F); { 打開文件
with AQuery do begin
Active := False; { 關閉數據集 }
SQL
SQL
DocName +
Open; { 打開數據集 }
if RecordCount <>
First; { 移到首記錄
repeat { 讀出一條子文檔並寫入文件 }
S := FieldByName(
L := Length(S);
for I :=
BlockWrite(F
Next;
until EOF;
end;
end;
CloseFile(F);{ 關閉文件 }
ARichEdit
Result := True; { 讀取成功 }
except { 讀取失敗 }
try CloseFile(F); except end;
Result := False;
end;
DeleteFile(TmpFileName); { 刪除臨時文件 }
end;
{ 下面的函數將漢字單字轉換成RTF中表示的形式
{ 如表示漢字
{ 那麼在 RTF文件中對
{ \
{ 因此
{ 字符串的分解符
{ 否則就不能構造出正確的 SQL查詢語句 }
function ChnCharToRTFCode(Ch: TChnChar): string;
var
C
O
S: string;
begin
C
C
O
O
S := Format(
Result := Lowercase(S);{ 轉換為小寫 }
end;
{ 根據需要檢索的關鍵字轉換成LIKE中使用的串
{ 這裡用於區別漢字的方法是根據編碼
{ 按照Windows 中的雙字節編碼規則
{ 如漢字字符
{ 引導字符
{ 可以根據此特點來區分漢字和單字節字符
function MakeLikeRTFString(StrToFind: string): string;
var
I: Integer;
ChnChar: TChnChar;
S: string;
begin
S :=
I :=
while I < Length(StrToFind) do begin
Inc(I);
if Integer(StrToFind[I]) >= $
ChnChar := StrToFind[I] + StrToFind[I +
Inc(I);
S := S + ChnCharToRTFCode(ChnChar);
end else begin{ 單字節字符 }
S := S + StrToFind[I];
if StrToFind[I] =
end;
end;
Result := S;
end;
{ 構造對關鍵字進行全文檢索的查詢語句 }
function MakeLikeString(StrToFind: string): string;
var
S: string;
begin
S := MakeLikeRTFString(StrToFind);
S :=
Result := S;
end;
{
From:http://tw.wingwit.com/Article/program/Oracle/201311/18394.html