用VC++设计基于ODBC的数据库管理系统
在记录集中滚动,需要有一个标志来指明滚动后的位置(当前位置)。ODBC驱动程序会维护一个光标,用来跟踪记录集的当前记录,可以把光标理解成跟踪记录集位置的一种机制。光标库(Cursor Library)是处于ODBC驱动程序管理器和驱动程序之间的动态链接库(ODBCCR32.DLL)。光标库的主要功能是支持快照以及为底层驱动程序提供双向滚动能力,高层次的驱动程序不需要光标库,因为它们是可滚动的。光标库管理快照记录的缓冲区,该缓冲区反映本程序对记录的修改和删除,但不反映其它用户对记录的改变,由此可见,快照实际上相当于当前的光标库缓冲区。
应注意的是,快照是一种静态光标(Static Cursor)。静态光标直到滚动到某个记录才能取得该记录的数据。因此,要保证所有的记录都被快照,可以先滚动到记录集的末尾,然后再滚动到感兴趣的第一个记录上,这样做的缺点是滚动到末尾需要额外的开销,会降低性能。
与快照不同,动态集不用光标库维持的缓冲区来存放记录。实际上,动态集是不使用光标库的,因为光标库会屏蔽掉一些支持动态集的底层驱动程序功能,动态集是一种键集驱动光标(Keyset-Driven Cursor),当打开一个动态集时,驱动程序保存记录集中每个记录的键。只要光标在动态集中滚动,驱动程序就会通过键来从数据源中检取当前记录,从而保证选取的记录与数据源同步。从上面的分析中可以看出,快照和动态集有一个共同的特点,那就是在建立记录集后,记录集中的成员就已经确定了,这就是为什么两种记录集都不能反映别的用户添加记录的原因。
CRecordset类代表一个记录集,用户在操作数据库的时候,一般需要用ClassWizard创建一个CRecordset的派生类,ClassWizard可以为派生的记录集类创建一批数据成员,这些数据成员与记录的各字段相对应,被称为字段数据成员或域数据成员。域数据成员用来保存某条记录的各个字段,它们是程序与记录之间的缓冲区,域数据成员代表当前记录,当在记录集中滚动到某一记录时,框架自动地把记录的各个字段拷贝到记录集对象的域数据成员中。当用户要修改当前记录或增加新记录时,程序先将各字段的新值放入域数据成员中,然后调用相应的CRecordset成员函数把域数据成员设置到数据源中。
不难看出,在记录集与数据源之间有一个数据交换问题,CRecordset类使用"记录域交换"(Record Field Exchange,缩写为RFX)机制自动地在域数据成员和数据源之间交换数据。RFX机制与对话数据交换(DDX)类似,CRecordset的成员函数DoFieldExchange负责数据交换任务,在该函数中调用了一系列RFX函数,当用户用ClassWizard加入域数据成员时,ClassWizard会自动在DoFieldExchange中建立RFX。
记录集的建立实际上主要是一个查询过程,SQL的SELECT语句用来查询数据源,在建立记录集时,CRecordset会根据一些参数构造一个SELECT语句来查询数据源,并用查询的结果创建记录集,明白这一点对理解CRecordset至关重要。
要建立记录集,首先要构造一个CRecordset派生类对象,然后调用Open()成员函数查询数据源中的记录并建立记录集。在Open()函数中,可能会调用GetDefaultConnect()和GetDefaultSQL()函数。具体代码如下:
CRecordset( CDatabase* pDatabase = NULL); |
参数pDatabase指向一个CDatabase对象,用来获取数据源。如果pDatabase为NULL,则会在Open()函数中自动构建一个CDatabase对象。如果CDatabase对象还未与数据源连接,那么在Open函数中会建立连接,连接字符串由成员函数GetDefaultConnect()提供。
virtual CString GetDefaultConnect( ); |
该函数返回缺省的连接字符串,Open()函数在必要的时侯会调用该函数获取连接字符串以建立与数据源的连接,一般需要在CRecordset派生类中覆盖该函数并在新版的函数中提供连接字符串。
天极yesky
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论