上当发生大幅234234

上传人:ldj****22 文档编号:37696016 上传时间:2018-04-21 格式:PDF 页数:40 大小:6.37MB
返回 下载 相关 举报
上当发生大幅234234_第1页
第1页 / 共40页
上当发生大幅234234_第2页
第2页 / 共40页
上当发生大幅234234_第3页
第3页 / 共40页
上当发生大幅234234_第4页
第4页 / 共40页
上当发生大幅234234_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《上当发生大幅234234》由会员分享,可在线阅读,更多相关《上当发生大幅234234(40页珍藏版)》请在金锄头文库上搜索。

1、下载第3 0章扩展数据库V C L本章内容: 使用B D E dBASE表 Paradox表 扩展T D a t a S e t V C L ( Visual Component Library)的数据库体系结构是用 BDE(Borland Database Engine)通信的, B D E是一个强大且可靠的数据库中间件。 V C L就好像你与数据库之间的绝缘体,它使你可以按相同的 方式访问不同类型的数据库。尽管这增加了可靠性、可伸缩性和易用性,但有一个不足: B D E的许多 功能无法在V C L的数据库框架中实现。这一章就介绍怎样与 B D E或其他数据源直接通信,相当于扩展 了V C

2、L。30.1 使用BDE当你要编写一个直接访问B D E的应用程序时,有一些规则需要记住。这一节就介绍怎样从 D e l p h i 应用程序中直接调用BDE API。30.1.1 BDE单元所有B D E的函数、类型和常量都是在B D E单元中定义的。凡是要直接调用BDE API的单元一定要 引用B D E单元。另外,B D E单元的接口部分是B D E . I N T文件,这个文件可以在.Delphi 5Doc目录中找 到。可以利用这个文件来访问一些函数和记录。提示为了获得更多帮助,建议你打开位于Program FilesBorlandCommon FilesBDE目录中 BDE32.hl

3、p帮助文件。这个帮助文件中包含了所有BDE API的详细说明以及很好的Object Pascal 和C语言的例子。30.1.2 Check()所有B D E函数都返回一个D B I R E S U LT类型的值,以表明函数调用是成功还是失败。每次都要检 查函数的返回值是很讨厌的,为此, D e l p h i定义了一个过程叫C h e c k ( ),它需要传递一个D B I R E S U LT 类型的参数。如果B D E函数没有调用成功,C h e c k ( )就会触发异常。下面的代码演示了应当怎样来调用 B D E函数: / 不应当这样调用 v a r R e z : D B I R

4、E S U LT; A : A R R AY0.dbiMaxUserNameLen of Char; b e g i n Rez:=dbiGetNetUserName(A); / 调用B D E函数 if Rez=RecordCount-1 thenResult :=grEOF e l s e第3 0章扩展数据库VCL 1 0 6 7下载I n c ( F R e c o r d P o s ) ; e n d ; if Result = grOK then b e g i n I n d e x P o s : = I n t e g e r ( F I n d e x L i s t F

5、R e c o r d P o s ) ; S e e k ( F D a t a F i l e , I n d e x P o s ) ; B l o c k R e a d ( F D a t a F i l e , P D D G D a t a ( B u ff e r ) , 1 ) ; with PDDGBookmarkInfo(Buff e r + F P e c o r d S i z e ) d o b e g i n B o o k m a r k D a t a : = F R e c o r d P o s ; B o o k m a r k F l a g : =

6、b f C u r r e n t ; e n d ; e n d else if (Result=grError)and DoCheck then DatabaseError(No records); e n d ; e n d ;F R e c o r d P o s域用于跟踪数据集的当前记录的位置。你可能注意到了,当调用 G e t R e c o r d ( )获取前一 条记录或下一条记录时, F R e c o r d P o s域的值会相应地增大或减小。如果 F R e c o r d P o s域的值是合法的, 它就用来作为F I n d e x L i s t的序号,对应于该序

7、号的编号代表一个记录在数据文件中的位置。 G e t R e c o r d ( )还做了另一件事:如果D o C h e c k参数设为Tr u e并且发生了错误,就触发一个异常。 (5) GetRecordSize() G e t R e c o r d S i z e ( )方法应当返回记录缓冲区中数据的长度 (以字节为单位)。千万不要返回整个记录 缓冲区的长度,而要返回数据部分的长度。这里,我们返回了 F R e c o r d S i z e域的值。function TDDGDataSet.GetRecordSize:Wo r d ; b e g i n R e s u l t :

8、= F R e c o r d S i z e ; e n d ;(6) GetFieldData() G e t F i e l d D a t a ( )方法负责把数据从当前活动的记录缓冲区 (由A c t i v e B u ff e r属性来访问)复制到一个字 段缓冲区。调用M o v e ( )可以方便地实现这一点。可以通过字段的 I n d e x属性或N a m e属性来指定要复制 哪个字段的值。要注意的是,A c t i v e B u ff e r包含的是整个记录缓冲区的数据,而现在只要获取一个字段 的数据,因此,就要正确计算偏移量。从内部缓冲区结构复制到各自的 T F i

9、e l d中:function TDDGDataSet.GetFieldData(Field:TField;Buff e r : P o i n t e r ) : B o o l e a n ; b e g i n R e s u l t : = Tr u e ; case Field.Index of 0 : b e g i n M o v e ( A c t i v e B u ff e r , B u ff e r , F i e l d . S i z e ) ; R e s u l t : = P C h a r ( B u ffer)=FIndexList.Count then

10、Dec(FRecordPos); e n d ;注意这种删除方法意味着当记录删除时数据文件的大小并不压缩。如果你试图在商务工作中 使用这种数据集类型,文件紧缩是一个比较好的选择,它将从数据文件中删除孤立的记录。(3) InternalPost() I n t e r n a l P o s t ( )方法是由T D a t a S e t . P o s t ( )调用的。在这个方法中,你应当把数据从当前记录缓冲区写 到数据文件中。你将发现,这个方法与I n t e r n a l A d d R e c o r d ( )有些类似。procedure TDDGDataSet.Internal

11、Post;v a r R e c P o s , I n s P o s : I n t e g e r ; b e g i nif FRecordPos=-1 then R e c P o s : = 0else begin if State=dsEdit then RecPos:=Integer(FIndexListFRecordPos) else RecPos:=FileSize(FDataFile);e n d ; S e e k ( F D a t a F i l e , R e c P o s ) ;B l o c k Wr i t e ( F D a t a F i l e ,

12、P D D G D a t a ( A c t i v e B u ff e r ) , 1 ) ; if State 0 then C l o s e F i l e ( F D a t a F i l e ) ; F I n d e x L i s t . S a v e To F i l e ( F I d x N a m e ) ; F I n d e x L i s t . C l e a r ; if DefaultFields then D e s t r o y F i e l d s ; F R e c o r d P o s : = - 1 ; F i l l C h a

13、r ( F D a t a F i l e , S i z e O f ( F D a t a F i l e ) , 0 ) ; e n d ;(2) InternalHandleException() 当正在读写数据流时触发异常就会调用 I n t e r n a l H a n d l e E x c e p t i o n ( )方法。除非你想以一种特殊的方 式来处理异常,否则,这个方法应当这样实现:procedure TDDGDataSet.InternalHandleException; b e g i n Application.HandleException(Self); e

14、n d ;(3) InternalInitFiledDefs() 在I n t e r n a l I n i t F i e l d D e f s ( )方法中,应当定义数据集中的字段。首先,要创建一些 T F i e l d D e f的实例, 并把T D a t a S e t的F i e l d D e f s属性传递给它的O w n e r参数。这里,我们创建了三个 T F i e l d D e f对象,表示数 据集中有三个字段。procedure TDDGDataSet.InternalInitFieldDefs; b e g i n F i e l d D e f s . C

15、 l e a r ; TFieldDef.Create(FieldDefs, Name , ftString,SizeOf(TNameStr),False,1); TFieldDef.Create(FieldDefs, Height , ftFloat,0,False,2); TFieldDef.Create(FieldDefs, WhoeSize , ftInteger, 0 , F a l s e , 3 ) ; e n d ;1 0 7 2第四部分开发数据库下载(4) InternalOpen() I n t e r n a l O p e n ( )方法是由T D a t a S e

16、t . O p e n ( )调用的。在这个方法中,应当打开数据源,初始化内部的 变量和属性,建立字段定义并捆绑到数据上。这里,我们打开了数据文件和索引文件,初始化了 F R e c o r d P o s变量和B o o k m a r k S i z e属性,然后又建立了字段定义。从下面的代码中可以看出,如果数据 库文件不存在的话,这个方法将让用户有机会创建一个。procedure TDDGDataSet.InternalOpen;v a rH F i l e : T H a n d l e ;b e g i n / 确认表和索引文件已存在F I d x N a m e : = C h a n g e F i l e E x t ( F Ta b l e N a m e , f e D D G I n d e x ) ;if not(FileExists(FTableName)and FileExists(FIdxName)thenb e g i nif Mess

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号