(*

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);

try

docid := { 产生新的文档编号 }

selectsql(''select nvl(max(docid) + 1, 101) from test'');

with atable do if not active then active := true;{ 确认表打开 }

subid := 0; { 初始化子编号 }

while not eof(f) do begin

inc(subid);

blockread(f, buf, bufsize, l); { 读取两千个字符 }

s := buf;

setlength(s, l); { 取实际读取到的字节数 }

with atable do begin { 增加一条子文档 }

append;

fieldbyname(''docid'').asinteger := docid;

fieldbyname(''docname'').asstring := docname;

fieldbyname(''subid'').asinteger := subid;

fieldbyname(''text'').asstring := s;

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 = ''c:\temp\x.rtf''; { 临时文件 }

var

s: string; { 局部串变量 }

f: tfileofchar; { 字符文件 }

buf: tbuffer; { 串缓存 }

i, l: integer; { 局部变量 }

begin

arichedit.clear; { 清除当前显示的内容 }

assignfile(f, tmpfilename); { 关联文件 }

try

rewrite(f); { 打开文件,准备写入从数据库读出的数据 }

with aquery do begin

active := false; { 关闭数据集 }

sql.clear; { 重建sql语句 }

sql.append(''select subid, text from test where docname = '''''' +

docname + '''''' order by subid'');

open; { 打开数据集 }

if recordcount <> 0 then begin { 确认数据集非空 }

first; { 移到首记录-子文档 }

repeat { 读出一条子文档并写入文件 }

s := fieldbyname(''text'').asstring;

l := length(s);

for i := 1 to l do buf[i] := s[i];

blockwrite(f, buf, l);

next;

until eof;

end;

end;

closefile(f);{ 关闭文件 }

arichedit.lines.loadfromfile(tmpfilename);{ 从文件中装入rtf文档 }

result := true; { 读取成功 }

except { 读取失败 }

try closefile(f); except end;

result := false;

end;

deletefile(tmpfilename); { 删除临时文件 }

end;

{ 下面的函数将汉字单字转换成rtf中表示的形式。 }

{ 如表示汉字“国”的是ascii(b9)和ascii(fa),这里是十六进制; }

{ 那么在 rtf文件中对“国”字的表示占用了 8个字节: }

{ \''b9\''fa }

{ 因此,需要在查询之前进行转换。由于表示方法中含有delphi用于 }

{ 字符串的分解符:单撇号“''”,因此在转换时需要考虑这一点, }

{ 否则就不能构造出正确的 sql查询语句 }

function chnchartortfcode(ch: tchnchar): string;

var

c1, c2: char;

o1, o2: byte;

s: string;

begin

c1 := ch[1];

c2 := ch[2];

o1 := ord(c1);

o2 := ord(c2);

s := format(''\''''''''%2x'', [o1]) + format(''\''''''''%2x'', [o2]);

result := lowercase(s);{ 转换为小写 }

end;

{ 根据需要检索的关键字转换成like中使用的串。 }

{ 这里用于区别汉字的方法是根据编码。 }

{ 按照windows 中的双字节编码规则,对于双字节字符 }

{ 如汉字字符,是由两个字节构成,其中第一个字节是 }

{ 引导字符。汉字引导字符的ascii 码大于 127,因此 }

{ 可以根据此特点来区分汉字和单字节字符。 }

function makelikertfstring(strtofind: string): string;

var

i: integer;

chnchar: tchnchar;

s: string;

begin

s := '''';

i := 0;

while i < length(strtofind) do begin

inc(i);

if integer(strtofind[i]) >= $80 then begin{ 汉字的首字节一定不小于128 }

chnchar := strtofind[i] + strtofind[i + 1];

inc(i);

s := s + chnchartortfcode(chnchar);

end else begin{ 单字节字符 }

s := s + strtofind[i];

if strtofind[i] = '''''''' then s := s + strtofind[i];{ 单撇号的特殊处理 }

end;

end;

result := s;

end;

{ 构造对关键字进行全文检索的查询语句 }

function makelikestring(strtofind: string): string;

var

s: string;

begin

s := makelikertfstring(strtofind);

s := ''select distinct docname from test where text like ''''%'' + s + ''%'''''';

result := s;

end;

{ ... ... }

oracle有rtf函数,oracle存取rtf文档相关推荐

  1. oracle关于字符串函数,Oracle字符串处理函数

    Oracle字符串处理函数 Oracle字符串处理函数 2008年10月18日 星期六 23:45 项目中有涉及存储过程对字符串的处理,所以就将在网上查找到的资料汇总,做一个信息拼接式的总结. 以下信 ...

  2. 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档

    在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档 一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎.可是,目前并没有可以在 .NET 框架上运行的免费 PDF ...

  3. oracle字符串提取函数,oracle字符串分割和提取函数定义

    oracle字符串分割和提取函数定义 oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2 ...

  4. oracle空格转换函数,ORACLE TO_CHAR函数格式化数字的出现空格的缘故

    ORACLE TO_CHAR函数格式化数字的出现空格的原因 在这篇博客SQL挑战--如何高效生成编码里面我由于需要将数字格式化为字符,像12需要格式化0012这样的字符,所以使用了TO_CHAR(数字 ...

  5. oracle判断if函数,ORACLE判断奇偶数函数

    ORACLE判断奇偶数函数 create or replace function f_isodd(p_num in number) return number as begin if mod(p_nu ...

  6. oracle中嵌套函数,Oracle的嵌套函数语法

    Oracle的嵌套函数语法 单行函数可以嵌套任意层: 嵌套函数从最深层开始执行. 通用函数: BFILENAME(directory,file_name) 返回操作系统中与物理文件 file_name ...

  7. oracle中各种函数,oracle中常用函数大全

    1.数值型常用函数 函数 返回值 样例 显示 ceil(n) 大于或等于数值n的最小整数 select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数 s ...

  8. oracle中lead函数,oracle lead()函数 | 学步园

    ead()是一个分析函数,适用于oracle 8i以后的版本, 使用这个函数,你可以一次性从表中查询多条记录, 而不需要进行表的自连接. 返回值:返回与当前行偏离offset行的列值. 语法: lea ...

  9. oracle的连接函数,Oracle各种连接函数总结

    1.前言 Oracle可用连接函数会介绍以下几个 Oracle列转行函数 Listagg() strcat() wmsys.wm_concat() 2.Oracle列转行函数 Listagg() 2. ...

  10. oracle对象权限 函数,oracle的系统和对象权限

    alter any cluster 修改任意簇的权限 alter any index 修改任意索引的权限 alter any role 修改任意角色的权限 alter any sequence 修改任 ...

最新文章

  1. wavelet tutorial
  2. JMeter使用碰到的问题
  3. Python Django手写分页代码
  4. iOS9 判断微信qq是否安装
  5. python实现雪花飘落效果_jQuery实现雪花飘落效果
  6. miui秒解bl锁_MIUI12解锁bl篇(原谅我的过失,接上篇文章)
  7. php怎么遍历json字符串数组,php-使用jquery遍历json数组
  8. 自考的那些事儿(二):第二次自考完了???
  9. matlab 高级函数 —— circshift、squeeze
  10. 基于SSM的商旅系统
  11. 微软在Windows 8之后将放弃Windows品牌
  12. 非关系数据库-NoSQL探讨
  13. 校园卡管理系统实验报告c语言,校园卡管理系统-C语言.doc
  14. 计算机科学中的张量,杨晓伟教授到我院做“张量学习的几个关键问题”学术报告...
  15. 渗透测试工具包 | 开源安全测试工具 | 网络安全工具
  16. e430c参数 thinkpad,联想ThinkPad E430c的详细参数
  17. Think:研究生期间的迷茫、困惑——放平心态,奋力拼搏
  18. 通过阿里云或清华镜像站安装tensorflow2.0
  19. Τεχνική υποστήριξη
  20. android email分析,QQ邮箱Android客户端产品体验报告

热门文章

  1. 【C语言】实现网络对战五子棋
  2. 用C实现五子棋对战——超详细教程
  3. div 垂直居中的六种方法
  4. 0805,1206等封装尺寸
  5. 关于jq22.com网站访问不了的问题
  6. ID3 决策树(基于西瓜数据集2.0)
  7. svn 回滚文件修改
  8. 2019计算机保研经验记录:南开软院、武大、信工所、南大软院、哈工深
  9. java开发需要英语吗_学习Java开发英语不好的可以学吗?
  10. PanDownload:登录百度账号提示浏览器版本太低,点击下载webkit内核,然后重启软件即可