用VC++设计基于ODBC的数据库管理系统
如果在建立记录集时选择了CRecordset::skipDeletedRecords选项,那么除了SetAbsolutePosition外,在滚动记录时将跳过被删除的记录,这一点对象FoxPro这样的数据库十分重要。如果记录集是空的,那么调用上述函数将产生异常。另外,必须保证滚动没有超出记录集的边界。调用IsEOF()和IsBOF()可以进行这方面的检测。
BOOL IsEOF( ) const; |
如果记录集为空或滚动过了最后一个记录,那么函数返回TRUE,否则返回FALSE。
BOOL IsBOF( ) const; |
如果记录集为空或滚动过了第一个记录,那么函数返回TRUE,否则返回FALSE。
调用GetRecordCound可获得记录集中的记录总数,该函数的原型如下:
long GetRecordCount( ) const; |
要注意这个函数返回的实际上是用户在记录集中滚动的最远距离。要想真正返回记录总数,只有调用MoveNext移动到记录集的末尾(MoveLast不行)。
要修改当前记录,应该按下列步骤进行:
(1)调用Edit()成员函数。调用该函数后就进入了编辑模式,程序可以修改域数据成员。注意不要在一个空的记录集中调用Edit,否则会产生异常。Edit()函数会把当前域数据成员的内容保存在一个缓冲区中,这样做有两个目的,一是可以与域数据成员作比较以判断哪些字段被改变了,二是在必要的时侯可以恢复域数据成员原来的值。若再次调用Edit(),则将从缓冲区中恢复域数据成员,调用后程序仍处于编辑模式。调用Move(AFX_MOVE_REFRESH)或Move(0)可退出编辑模式(AFX_MOVE_REFRESH的值为0),同时该函数会从缓冲区中恢复域数据成员。
(2)设置域数据成员的新值。
(3)调用Update()函数完成编辑。Update把变化后的记录写入数据源并结束编辑模式。
要向记录集中添加新的记录,应该按下列步骤进行:调用AddNew()成员函数。调用该函数后就进入了添加模式,该函数把所有的域数据成员都设置成NULL(注意,在数据库术语中,NULL是指没有值,这与C++的NULL是不同的)。与Edit()一样,AddNew()会把当前域数据成员的内容保存在一个缓冲区中,在必要的时侯,程序可以再次调用AddNew()取消添加操作并恢复域数据成员原来的值,调用后程序仍处于添加模式。调用Move(AFX_MOVE_REFRESH)可退出添加模式,同时该函数会从缓冲区中恢复域数据成员。最后调用Update()函数把域数据成员中的内容作为新记录写入数据源,从而结束了添加。
如果记录集是快照,那么在添加一个新的记录后,需要调用Requery重新查询,因为快照无法反映添加操作。
要删除记录集的当前记录,应按下面两步进行:调用Delete()成员函数。该函数会同时给记录集和数据源中当前记录加上删除标记。注意不要在一个空记录集中调用Delete(),否则会产生一个异常。滚动到另一个记录上以跳过删除记录。上面提到的函数声明为:
virtual void Edit( ); virtual void AddNew( ); virtual void Delete( ); virtual BOOL Update( ); |
若更新失败则函数返回FALSE,且会产生一个异常。
在对记录集进行更改以前,程序也许要调用下列函数来判断记录集是否是可以更改的,因为如果在不能更改的记录集中进行修改、添加或删除将导致异常的产生。
BOOL CanUpdate( ) const; //返回TRUE表明记录是可以修改、添加和删除的。 BOOL CanAppend( ) const; //返回TRUE则表明可以添加记录。 |
3、CRecordView类
CRecordView(记录视图)是CFormView的派生类,它提供了一个表单视图来显示当前记录,用户可以通过表单视图显示、修改、添加和删除数据,用户一般需要创建一个CRecordView的派生类并在其对应的对话框模板中加入控件。
记录视图使用DDX数据交换机制在表单中的控件和记录集之间交换数据。在前面介绍的DDX都是在控件和控件父窗口的数据成员之间交换数据,而记录视图则是在控件和一个外部对象(CRecordset的派生类对象)之间交换数据,交换数据的代码是ClassWizard自动加入的。在后面的例子中,将向读者介绍用ClassWizard连接记录视图与记录集对象的方法.
天极yesky
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论