转:CRecordset更新操作

21.1.1  CRecordset更新操作

第20章讨论了在记录集对象的DoFieldExchange()成员中,RFX_()函数调用如何从数据库表中的选定字段检索数据,然后把数据传输到记录集对象的数据成员。在更新数据库表中的字段或者添加全新的行时,也要使用这些函数。

在CRecordset类中,有5个支持更新操作的成员函数,见表21-1。

表  21-1

Edit()

调用这个函数将开始更新现有的记录。

如果不能更新表,那么这个函数将抛出

CDBException异常,如果出现了内存不

足的情况,它将抛出CMemoryException异常

AddNew()

调用这个函数将开始添加全新的记录。如果不

能把新记录附加到表中,这个函数将抛出

CDBException异常

Update()

调用这个函数将完成现有记录的更新或者

新记录的添加。如果不能更新单个记录,

或者出现了错误,这个函数将抛出CDBException异常

Delete()

通过创建和执行SQL DELETE语句,删除当

前记录。如果出现了错误—— 如数据库是只读的,

那么这个函数将抛出CDBException异常。在进

行了Delete()操作以后,记录集的所有数据成员都

将被设置为空值—— 相当于没有值集。在对记

录集对象执行其他操作之前,必须移动到新记录

CancelUpdate()

取消修改现有记录或者添加新记录的未完成操作


这些函数都没有参数。其中前4个函数可以抛出异常,所以如果在有错误出现时不希望程序突然结束,就应当把函数调用放在try代码块中,并且应当添加一个catch代码块。

如果要删除记录集对象的当前记录,只需调用它的Delete()成员。然后在使用上述函数之前,必须将记录集滚动到一个新位置,因为在调用Delete()成员以后,记录集对象的数据成员的值将是无效的。

图21-1说明了在更新现有记录或者添加新记录时事件的基本顺序。

498)this.width=498;" class="fit-image" onmousewheel="javascript:return big(this)" border="0" alt="" src="http://images.51cto.com/files/uploadimg/20100107/212019263.jpg" width="498" height="264"> 
(点击查看大图)图  21-1

在调用记录集的AddNew()成员开始添加新记录到表中时,这个函数将把记录集对象中对应于字段值的所有数据成员的值保存到缓冲区中,然后将这些数据成员设置为PSEUDO_NULL。在指针中,这并不表示零或者空。它是一个表明数据成员还未设置的值。在调用Update()完成记录的添加时,记录集数据成员的值将恢复到调用AddNew()之前的原始值。要使记录集包含新记录的值,必须调用记录集对象的Requery()成员。如果操作成功,这个函数将返回TRUE(这是一个MFC BOOL类型的值)。如果想获得数据的不同视图,以便在检索记录时将不同的SQL命令或不同的过滤器用于这些记录,也要调用Requery()。

数据在记录集数据成员和数据库之间传输时,始终要使用记录集对象的DoFieldExchange()成员,所以RFX_()函数提供了双重功能-- 将数据写入数据库,以及从数据库读取数据。

1. 检查操作是否合法

应该确认希望对记录集对象执行的操作是否合法。对于只读记录集而言非常容易忘记验证工作-- 即忘记了重新设置Northwind.mdb文件的只读属性。如果希望更新只读表,就会抛出异常,而如果验证了其操作是否合法就可以完全避免这种情况。使用异常捕获非预期错误的效率很低,通常难度也很大。较好的办法是尽可能事先进行检查,比如本案例就是这样。这样,异常处理代码就可以真正用于异常情况。

如果可以修改表中由记录集对象表示的记录,那么CRecordset的CanUpdate()成员将返回TRUE。在添加新记录时,可以事先调用CRecordset的CanAppend()成员进行检查。如果允许在表中添加新记录,这个函数将返回TRUE。

2. 记录锁定

记录锁定防止其他用户在表行被更新期间访问锁定的记录。更新期间锁定记录的时间由记录集对象中设置的锁定模式确定。在CRecordset中定义了两种锁定模式,分别称为乐观锁定模式和悲观锁定模式,见表21-2。

表  21-2

CRecordset::optimistic

在乐观锁定模式中,只在执行Update

()成员函数时锁定记录。这大大缩短

了数据库的其他用户不能访问记录的

时间。如果编辑操作需要很长时间,

则悲观锁定模式通常不切合实际,因为

其他用户可能需要访问数据库。标准

解决方法是使用乐观锁定模式,并引

入某种冲突解决机制

CRecordset::pessimistic

在悲观锁定模式中,一调用Edit()函数

就锁定记录,在调用Update()函数或者

终止更新操作之前,记录将保持锁定状

态,其他用户无法访问记录。在准备进

行交互式更新时,这显然将严重影响性

能;但是为了维护数据的完整性,这种

模式在许多情况下是必要的


记录集对象的默认模式是乐观锁定模式,所以只有在需要悲观锁定模式时,才需要设置它。要设置悲观锁定模式,需要调用参数为CRecordset::pessimistic的记录集对象的SetLockingMode()成员。当然,也可以调用参数为CRecordset::optimistic的SetLockingMode()函数,然后对它进行重置。

原文地址:https://www.cnblogs.com/ookami/p/3131473.html