设为首页 加入收藏

TOP

21.2 简单的更新示例
2013-10-07 12:41:14 来源: 作者: 【 】 浏览:74
Tags:21.2 简单 更新 示例

21.2  简单的更新示例

现在让我们通过一个非常简单的示例,获得一些实际的更新操作经验。该示例最初省略了本章迄今为止所讨论的大多数功能,但随后将以之为基础,应用某些已经学过的技术。可以使用上一章用过的MFC Application Wizard,以最低限度的工作量创建更新数据库表的应用程序。我们将要创建的程序可以更新Order Details表中的某些字段。

使用MFC Application模板创建一个名为DBSimpleUpdate的项目。像在上一章所做的那样,选择使用以ODBC作为Client type选项、不带文件支持选项的数据库视图。我们仍将通过ODBC使用Northwind数据库,但这次应该选择dynaset作为记录集类型。在多用户的环境中,我们的程序在访问动态集时,只要对记录进行了修改,动态集就会自动更新。这样可以确保应用程序中获得的数据始终是最新的。对于要修改现有记录或添加新记录的操作而言,应该选择dynaset作为记录集类型。

因为需要更新数据库,所以必须将记录集映射为单个数据库表。MFC中的数据库类不支持需要连接两个或多个表的记录集的更新。如图21-2所示,选择Order Details表作为默认的记录集。

如果在这里选择多个表,则记录集的更新操作是禁止的,因为那样将使记录集自动具有只读属性。该数据库类只支持对连接多个表的记录集进行只读访问,而不支持对其进行更新操作。

如图21-3所示,可以将视图和记录集类的名称以及相关文件的名称修改成与所处理的表匹配。

 
(点击查看大图)图  21-2
 
(点击查看大图)图  21-3


定制应用程序

Order Details表包含5列:Order ID、Product ID、Unit Price、Quantity和Discount。如果显示Class View并查看COrderDetailsSet类的成员,那么将看到对应这5列的数据成员。在对应该记录集的对话框上,需要为每个成员安排一个静态文本控件和一个编辑控件。此处排列的这些控件如图21-4所示,读者可以以自己喜欢的方式布置它们。

像在上一章所做的那样,给编辑控件分配与字段名匹配的ID;例如,最后一个编辑控件的ID应该是IDC_DISCOUNT。编辑控件的默认样式集允许键盘输入,但基于用户希望限制可以更改的记录集字段这样的假设,应该使用Properties窗口中的样式选项卡,将前3个编辑控件设定为只读属性。只读控件中显示的值可以在程序中设定,但不能从键盘上向这样的控件中输入数值。为了一次将这3个控件全部设定为只读属性,可以按住Ctrl键依次选中3个控件,然后右击显示出弹出菜单并选择Properties。此后在Properties窗口中设定的任何属性都将同时应用于所有3个控件。在上面显示的对话框中,将只能为Quantity和Discount字段输入数据。

 
(点击查看大图)图  21-4
还需要做的唯一一件事情是使编辑控件与对应的记录集的数据成员联系起来。正如在上一章所看到的那样,只需在记录集视图类COrderDetailsView的DoDataExchange()函数中,为记录集中的每个数据字段添加DDX_函数调用即可。相应的代码如下:

  1. void COrderDetailsView::DoDataExchange(CDataExchange* pDX)  
  2. {  
  3. CRecordView::DoDataExchange(pDX);  
  4. DDX_FieldText(pDX, IDC_ORDERID, m_pSet->m_OrderID, m_pSet);  
  5. DDX_FieldText(pDX, IDC_PRODUCTID, m_pSet->m_ProductID, m_pSet);  
  6. DDX_FieldText(pDX, IDC_UNITPRICE, m_pSet->m_UnitPrice, m_pSet);  
  7. DDX_FieldText(pDX, IDC_QUANTITY, m_pSet->m_Quantity, m_pSet);  
  8. DDX_FieldText(pDX, IDC_DISCOUNT, m_pSet->m_Discount, m_pSet);  

做完这件事之后,就完成了更新Order Details表的程序。

试一试:更新数据库

如果已经正确地设置了这些控件,并且没有忘记使COrderDetailsSet类中GetDefaultConnect()函数的定义前面出现的#error指令以注释的形式存在,那么该程序应该立刻就能编译。#error指令的作用是确保考虑连接到数据库之后的安全问题。当该程序执行时,将能够使用工具栏按钮,在表中这些行中间移动。如果在Quantity或Discount的编辑控件中输入某订单的数据,则该记录集将在向前或向后移动时更新。该应用程序的窗口如图21-5所示。

 
(点击查看大图)图  21-5

在图21-5中可以看到,在ID为10248的订单中,ID为72的产品的数量和折扣值已经被修改为两个不太可能的数值。

示例说明

当为了移动到另一个记录而单击某个工具栏按钮时,默认基类CRecordView提供的处理程序OnMove()将被调用。该函数在调用COrderDetailsSet中继承的CRecordset类的Move()成员移动到记录集中新记录之前,先写出已经输入该记录集的任何修改。记住,这里有两级数据交换在进行。在COrderDetailsSet类的DoFieldExchange()成员中调用的RFX_()函数在数据库中记录集的行与该类的数据成员之间传输数据;而在COrderDetailsView类的DoDataExchange()成员中调用的DDX_()函数在编辑控件与COrderDetailsSet类的数据成员之间传输数据。当在编辑控件中修改数值时,新数据被传输到记录集对象的适当数据成员中。单击工具栏按钮移动到下一条记录时,新数据将由DoFieldExchange()函数写出到数据库中。

该示例就其本身而言很好,但在用户方面没有任何明显动作的情况下就把数据写出到数据库中有点儿令人不安。实际上应该对发生的事情有更多一些的控制权,即示例程序中的代码可以在执行更新操作之前,要求用户做某件事情。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇21.3.1 实现更新模式(1) 下一篇21.3 管理更新过程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: