Delphi7 中使用ODAC存取图片

最近很少写技术贴,前几天协助王锋师兄解决了在delphi7中,使用ODAC组件存取图片的问题。事后,他整理了一个经验文档,争得他同意,我贴出来,以备以后查询之用。 说明:ODAC组件我不熟悉,在使用它存取图片的时候,特别注意sql的写法。

ODAC 组件支持 Oracle8 的 BLOB 和 CLOB 数据类型。你可以使用 TOraQuery 组件来获取 LOB 字段的值,BLOB 和 CLOB 数据类型通过 LOB 定位器(指定数据地址) 存储在表列中;实际的 BLOB 和 CLOB 数据存储在独立的表空间中。当存取 LOB 列时,返回的是定位器。要初始化 LOB 定位器,你必须使用 EMPTY_BLOB 或 EMPTY_CLOB Oracle 函数。要返回初始化后的定位器,应在同样的语句中使用 RETURNING 子句。ODAC 写 LOB 数据到 Oracle 且返回初始值字段,需使用:值参数. 对 ODAC 来说,在 LOB 操作中使用 ParamType 属性是非常重要的。如果 ParamType 是 ptInput , ODAC 写数据到服务器,如果 ParamType 是 [...]

使用绑定变量和不使用绑定变量操作数据库

以下例子是在delphi中编程实现,数据库为oracle,具体的代码省略了,只说明情况。

1、不使用绑定变量

例子:删除同一张表的两条记录。

sql语句如下:

(1)delete from t_englishscore_score where STUDENTNUM=’200431500123′

and LESSONNAME=’test’ and YEAR=’2005′ and TERM=’上’;

(2)delete from t_englishscore_score where STUDENTNUM=’200431500123′

and LESSONNAME=’毕业设计’ and YEAR=’2007′ and TERM=’下’

此时查询v$sqltext视图(它能够反映oracle 中share pool中的sql解析共享情况):

ADDRESS

HASH_VALUE

SQL_ID

COMMAND_TYPE

PIECE

SQL_TEXT

0000000173D47990

2193311325

1mhba361bqjkx

7

0

delete from t_englishscore_score [...]

在PL/SQL中计算采用四舍五入和delphi 6中计算采用四舍五入之间的误差

有系统用户反映,在其中使用delphi6的程序中计算一个数值为2.64,但是在另外一个模块中,相同的参数,计算出来却是2.63,之间相差了0.01。一查,后者是调用oracle中存储过程实现的,而前者在delphi6中实现。

在 仔细分析原因后,发现delphi 6中使用roundto或者simpleroundto都不是我们通常说的四舍五入,前者是采用银行家的四舍五入,即四舍六入五奇偶,而 simpleroundto这个函数也令人有点琢磨不透,有些是四舍五入,有些不是,比如对于 simpleroundto(12.95,-1)=12.9。

而在PL/SQL中,一律保留了1位,四舍五入,所以两种方法一比较,最后累计,就出现了误差。

解决方法,可以自己编辑一个函数处理,也可以按照下面一个网友的解释进行处理:

http://www.2ccc.com/idea.asp?articleid=1300 网友iamdream

以下是研究的结果(Delphi6):

RoundTo(及Round)函数使用所谓“银行家舍入法”<Banker’s Rounding>(对于舍入位后为5的情况,则舍入位为偶数,则舍,为奇数,则入),而Format函数则为正常的四舍五入法,取例如下:

0.145 RoundTo(0.145, -2) = 0.14

0.145 Format(‘%8.2f’, 0.145) = 0.15

0.155 RoundTo(0.155, -2) = 0.16

0.155 Format(‘%8.2f’, 0.155) = 0.16

另在进行浮点数的运算时,可能会出现0.14499999999999的情况,此时的值按数学上要求实际应为0.145,如用以上方法舍入到小数点后两位时,均不能达到想要的效果。

另SimpleRoundTo比RoundTo更接近四舍五入法,但不完全是四舍五入,如对0.145用SimpleRoundTo(0.145, -2)舍入时仍为0.14;

如果后面还有小数,如0.1450000001,此时舍入,则三者均为0.15!对1.145,SimpleRoundTo舍入为1.15!

故而如用RoundTo来四舍五入,则可在舍入位后的第二位加上5,如0.145,则加上0.0005,此时成为0.1455,再舍入时,就为0.15了!

因此四舍五入取两位小数时,只要先加上0.0001,然后用RoundTo或SimpleRoundTo即可。

【fastreport使用】fastreport中显示表格和打印空白表格

8月19日 【fastreport使用】fastreport中显示表格和打印空白表格

1、 使数据显示在表格中:在数据的Band中,选择每一个“text”,设置其上下左右的边框;然后把每个“Text”排整齐即可。

2、 在页末尾打印空白表格行:添加一个child band,同时在该band中设置跟数据band中相应的text;再添加一个footer band,设置其高度为0,同时为该footer band的onbeforePrint事件添加代码如下:

while Engine.freespace > 60 do

Engine.showband(Child1);

如图1:

图1 表格显示和打印空白表格