/*
第二十一章更新数据源
本章主要内容:1 数据库事务2 如何使用记录集对像更新数据库3 如何在更新操作中将数据从记录集传输到数据库4 如何更新表中的现有行5 如何添加新行到表中21.1 更新操作21.1.1 CRecordset更新操作在更新数据库表中的字段或者添加全新的行时,也要使用RFX_()这种函数CRecordset类中,有五个支持更新操作的成员函数Edit() 调用这个函数将开始更新现有的记录,如果不能更新表,那么这个函数将抛去CDBException异常,如果出现了内存不足的情况,它将抛出CMomoryException异常AddNew() 调用这个函数将开始添加全新的记录,如果不能把新记录附加到表中,这个函数将抛出CDBException异常Update()调用这个函数将完成现有记录的更新或者新记录的添加,如果不能更新单个记录,或者出现了错误,这个函数将抛出CDBException异常Delete() 通过创建和执行SQL DELETE语句,删除当前记录,如果出现错误-如数据库只读的,那么这个函数将抛出CDBException异常,在进行了Delete()操作以后,记录集的所有数据成员都将被设置为空值--相当于没有值集,在对记录集对像执行其他操作之前,必须移动到新记录CancelUpdate() 取消修改现有记录或者添加新记录的未完成操作更新现有记录或者添加新记录时事件的基本顺序
更新现有记录
(1) 调用记录集对像的Edit()成员:将记录集字段数据成员的当前值保存到缓冲区中
(2) 将字段数据成员设置为新值
(3) 调用记录集对像的Update()成员:通过与保存值进行比较,检查已修改的字段,创建和执行SQL INSERT语句,更新已修改字段的DB丢弃包含字段的旧保存值的缓冲区更新新记录(1)调用记录集对像的AddNew()成员:将记录集字段数据成员的当前值保存到缓冲区中将记录集字段数据成员的当前值设置为PSEUDO_NULL(2) 设置新的字段数据成员值(3) 调用记录集对像的Update()成员: 检查非NULL字段创建和执行SQL INSERT语句,更新非NULL字段的DB由缓冲区恢复旧保存值数据在记录集数据成员和数据库之间传输时,始终要使用记录集对象的DoFieldExchange()成员,所以RFX_()函数提供了双重功能-将数据写入数据库,以及从数据库读取数据1 检查操作是否合法如果可以修改表中由记录集对像表示的记录,那么CRecordset的CanUpdate()成员将返回TRUE,在添加新记录时,可以事先调用户CRecordset的CanAppend()成员进行检查,如果允许在表中添加新记录,这个函数将返回TRUE2 记录锁定记录锁定防止其他用户在表行被更新期间访问锁定的记录,更新期间锁定记录的时间由记录集对像中设置的锁定模式确定CRecordset定义了两种锁定模式分别称为乐观锁定和非观锁定CRecordset::optimistic 在乐观锁定模式中,只在执行Update()成员函数时锁定记录,这大大缩短了数据库的其他用户不能访问记录的时间,如果编辑操作需要很长的时间,则悲观锁定模式通常不切合实际,因为其他用户可能需要访问数据库,标准解决方法是使用乐观锁定模式,并引入某种冲突解决机制CRecordset::pessimistic在悲观锁定模式中,一调用Edit()函数就锁定记录,在调用Update()函数或者终止更新操作之前,记录将保持锁定状态,其他用户无法访问记录,在准备进行交互或更新时,这显然将严重影响性能,但是为了维护数据的完整性,这种模式在许多情况下是必要的默认为乐观模式悲观锁定模式需要调用参数为CRecordset::pessimistic的记录集对象的SetLockingMode()成员也可以调用参数为CRecordset::optimistic的SetLockingMode()函数,然后对它进行重置21.1.2 事务在数据库上下文中,事务的概念是为了在必要时安全的取消操作,事务把数据库的一系列定义明确地更改组合成单个操作,如果出现错误,那么在事务完成之前的任何时间点,可以撤消(或者回滚)所有更改利用基于事务的操作,数据库系统可以管理事务的处理,记录恢复信息,这样在出现问题时,就可以撤消事务对数据所做的所有操作CDatabase事务操作事务是通过CDatabase类对像的成员来管理的,该对像提供到数据库的连接,对于给定的连接,要确定是否支持事务,需要调用CDatabase对像的CanTransact()成员,如果支持事务,返回TRUECDatabase还有一个CanUpdate()成员,如果数据源是只读的,它将返回falseCDatabase对象有三个成员函数参与事务处理BeginTrans() 在数据库上启动一个事务,在调用CommitTrans()或Rollback()之前,后续的所有记录保操作都是这个事务的一部分,如果事务启动成功,返回trueCommitTrans() 提交事务,完成作为事务一部分的所有记录集操作,如果出现错误,这个函数将返回false,在这种情况下,数据源的状态是否确定的Rollback()回滚调用BeginTrans()函数以来执行的所有记录集操作,并将数据源恢复到调用BeginTrans()函数时的状态事务中事件的顺序1 调用BeginTrans()函数,启动事务2 根据需要调用记录集的Edit() Update() AddNew()函数3 调用CommitTrans()函数,完成事务在调用CommitTrans()之后需要调用CDatabase的成员GetCursorCommitBehavior(),在调用Rollback()之后需要调用GetCursorRollbackBehavior()这两个函数将返回下列三个int型数值之一SQL_CB_PREDERVE 记录集与数据源的连挡不爱提交或回滚操作的影响,所以不用采取任何动作SQL_CB_CLOSE 需要调用记录集对像的Requery(),恢复记录集中的当前位置SQL_CB_DELETE 必须通过调用记录对像的Close()成员关闭记录集,如果必要的话,必须重新打开记录集21.2 简单的更新示例定制应用程序21.3 管理更新过程更新操作的过程:用户在对话框上允许输入字段中输入数据,然后单击Update按钮完成更新操作,此后,该对话框返回到最初中的"只读"模式状态,所有编辑控件都成为只读控件,如果用户不希望进行更新操作,则可以单击Cancel按钮而不是Update按钮需要在Edit Order按钮被单击之后做下面的事情A 将Edit Order按钮上的文本修改为Update,使之现在成为完成更新操作的按钮B 使Cancel按钮出现在对话框上,换句话说,使该按钮可见C 在COrderDetailsView类中将"已经进入编辑模式"的情史记录下来,这是必要的,因为要为两项不同的用途使用同一个按钮,所以要根据所处理模式切换Edit Order和Update这两个标签D 允许那些对应于希望更新的字段的编辑控件接受键盘输入21.3.1 实现更新模式1 启用禁用编辑控件2 修改按钮标签3 按制Cancel按钮的可见性4 禁用Record菜单5 执行更新6 实现取消操作基本完成,但有bug,找不出来原因21.4 向表中添加行21.4.1 订单录入过程21.4.3 创建记录集21.4.4 创建记录集视图21.4.5 给对话框资源添加控件21.4.6 实现对话框切换21.4.7 创建订单ID1 存储新订单的ID2 创建新订单的ID3 启动ID创建过程21.4.8 存储订单数据设置日期21.4.9 为订单选择产品21.4.10 添加新订单*/

  

Visual C++ 2008入门经典 第二十一章更新数据源相关推荐

  1. Visual C++ 2008入门经典 第四章数组 字符串

    /* //学习内容 数组及其使用方法 如何声明和初始化不同类型的数组 如何声明和使用多维数组 指针及其使用方法 如果声明和初始化不同类型的指针 数组和指针之间的关系 引用的概念及声明方法,关于使用引用 ...

  2. Visual C++ 2008入门经典 第四章数组 字符串(练习题)

    //练习题一:/*int arraySize = 5; //数组的长度double* values = new double[arraySize]; //初始化一个values的指针,成员为五个dou ...

  3. Visual C++ 2008入门经典 第四章数组 字符串(二)

    // //4.4 使用引用//引用在许多方面都类似于指针,所以后们放在这里进行讨论,但实现上二者根本不是一回事//4.4.1 引用的概念//引用是另一个变量的别名,这样的别名可以代替原来的变量名,因为 ...

  4. c++学习书籍推荐《Visual C++2008入门经典》下载

    百度云及其他网盘下载地址:点我 <Visual C++2008入门经典>学习目标: 使用标准模板库(STL)来组织和操作本地C++程序中的数据 C++程序调试技术 构造Microsoft ...

  5. Visual C++ 2008入门经典 Ivor Horton

    Visual C++ 2008入门经典    Ivor Horton 本书系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visual C++ 200 ...

  6. Visual C++ 2008入门经典 Ivor Horton(书_在线阅读)

    http://book.51cto.com/art/200912/173520.htm 本书系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visua ...

  7. Visual C++ 2008入门经典 第十五章 在窗口中绘图

    /*第十五章 在窗口中绘图 主要内容: 1 Windows为窗口绘图提供的坐标系统 2 设置环境及其必要性 3 程序如何以及在窗口中绘图 4 如何定义鼠标消息的处理程序 5 如何定义自己的形状类 6 ...

  8. Visual C++ 2008入门经典 第九章类的继承和虚函数

    // 第九章类的继承和虚函数 //.cpp: 主项目文件. //1 继承如何与面向对像的编程思想适应 //2 根据现有类定义新类 //3 使用protected关键字为类成员指定新的访问特性 //4 ...

  9. Visual C++ 2008入门经典 第九章类的继承和虚函数(二)

    //9.6.7 虚析构函数 /*#include "stdafx.h" #include <iostream> using namespace std; using n ...

最新文章

  1. 微信小程序让屏幕自动向下滚动
  2. Packagist / Composer 中国全量镜像
  3. SSH框架搭建问题总结
  4. NS2网络模拟(3)-吞吐率
  5. MySQL中的调度器
  6. 为什么说只有深度思考才能让你持续赚到钱?
  7. hive 操作(五)——常用内置函数
  8. Java程序练习-长整数加法运算
  9. php下载功能,js php实现无刷新下载功能
  10. kubernetes视频教程笔记 (21)-存储-configmap
  11. 别忘了我的世界有你存在
  12. matlab高斯窗函数,Matlab中窗函数的简单使用
  13. 2020中兴捧月算法大赛 埃德加考特派 区域优胜奖源代码
  14. fiddler界面工具栏介绍
  15. 机器学习项目(五) 电影推荐系统(五)Criteo Ctr
  16. Notepad++搜索结果窗找不见了
  17. 芴基噁二唑铱配合物|阳离子型铱配合物Ir(F_2ppy)_2(Br_2bpy)+PF-6
  18. 【NLP】ESPNet语音识别——原理、实现过程
  19. elementUI上传图片后删除
  20. 解决极客时间网页文字无法选中或复制copy

热门文章

  1. 3.1Guessing Game
  2. Word中MathType公式与LaTeX公式的转换
  3. CISCO 路由器的E1模块配置指南
  4. MyStringTokenize
  5. NBMA网络帧中继交换机配置
  6. 密钥怎么存储在数据库中
  7. c++ 输出二进制_C语言 printf 格式化输出的详细示例
  8. 菜鸟的学习之路(10) — LinkedList类
  9. 菜鸟的学习之路(9) — ArrayList类
  10. Android开发——联系人中几种常见的mimetype、几张常见表的Uri