8.2.3编辑记录【ODBC】

8.2.3编辑记录

   CRecordset类为用户提供了编辑记录所需要的成员函数,但在编程时还应注意两个方面的内容:

(1)理解“删除”。CRecordset类的成员函数Delete只是将记录进行“逻辑”删除,而不是“物理”删除。逻辑删除的记录还可以恢复,而物理删除则不能。

(2)控件与字段数据成员的相互影响。

    在MFC创建的数据库处理的应用程序框架中,表的字段总是和系统定义的默认数据成员相关联,例如表xs字段stuid与CMySet的m_stuid相关联。另外,在表单视图CMyView中添加一些控件用于记录的浏览,其中控件IDC_STU_ID的成员变量也是CMySet的m_stuid,因而控件数据成员与字段数据成员必然相互影响。合理利用这些影响能简化编程,例如下面的代码是用来增加记录的:

m_pSet->AddNew();     //在表的末尾增加新记录

UpdateData(TRUE);     //将控件中的数据传给字段数据成员

m_pSet->Update();      //将新记录存入数据库

m_pSet->MoveLast();   //将当前记录位置定位到最后一个记录

UpdateData(FALSE);    //将字段数据成员的数据传给控件,即在控件中显示

上述的相互影响有时也给编程带来不便,因为稍不留神就会产生错误。因此,   

在修改和添加记录数据之前,往往设计一个对话框用以获得所需要的数据,然后用该数据进行当前记录的编辑。这样就能避免它们的相互影响,且保证代码的相对独立性。

1、增加记录

   增加记录是使用AddNew函数,但要求数据库必须是以“可增加”的方式打开的。以下代码是在表的末尾增加新记录:

m_pSet->AddNew();//在表的末尾增加新记录

m_pSet->SetFieldNull(&(m_pSet->m_studentno),FALSE);//设定m_studentno值不

//为空(NULL)

m_pSet->m_studentno=”21010503”;

…..           //输入新的字段值

m_pSet->Update();  //将新记录存入数据库

m_pSet->Requery();//刷新记录集,这在快照集方式下是必须的

 

2、删除记录

可以直接使用CRecordSet::Delete函数来删除记录。需要说明的是,要使删除操作有效,还需要移动记录函数。例如下列代码:

CRecordsetStatusstatus;  //建立记录状态对象

m_pSet->GetStatus(status);//获取当前记录状态

m_pSet->Delete();       //删除当前记录

if(status.m_lCurrentRecord==0)  //若当前记录索引号为0(0表示第1条记录)则

   m_pSet->MoveNext();      //下移一个记录

else

   m_pSet->MoveFirst();     //移到第1个记录处

UpdateData(FALSE);

 

3、修改记录

函数CRecordSet::Edit可以用于修改记录,例如:

m_pSet->Edit();   //修改当前记录

m_pSet->m_name=”刘向东”;//修改当前记录字段值

……        

m_pSet->Update();  //将修改结果存入数据库

m_pSet->Requery();

 

4、撤消操作

   如果用户在进行增加或者修改记录后,希望放弃当前操作,则在调用CRecordSet::Update

函数之前调用CRecordSet::Move(AFX_MOVE_REFRESH)来撤消操作,便可恢复在增加或修改操作之前的当前记录。

   在编写程序时应注意控件与字段数据成员的相互影响。在MFC创建的数据库处理的应用程序框架中,表的字段总是和系统定义的默认数据成员相关联。例如:本程序中,表xs字段stuid(学号)与CMySet指针的m_stuid相关联。而且,在表单视图CMyView添加用于记录内容显示的一些控件中,在定义其控件变量时,使用的也是m_pSet中的成员变量。例如编辑框IDC_STU_ID定义的控件变量是m_pSetm_stuid。虽然,共用同一个成员变量能简化编程,但有时也给编程带来不便,稍不留神就会产生误操作。例如以下代码是用于增加一条记录:

m_pSet->AddNew();//在表的末尾增加新记录

UpdateData(TRUE);//将控件中的数据传给字段数据成员

m_pSet->Update();//将新记录存入数据库

m_pSet->MoveLast();//将当前记录位置定位到最后一个记录

UpdateData(FALSE);//将字段数据成员的数据传给控件,即在控件中显示。

   由于增加和显示记录在同一界面中出现,容易造成误操作。因此,在修改和添加记录数据之前,往往设计一个对话框用于获得所需要的数据,然后用该数据进行当前记录的编辑。这样就能避免它们的相互影响,且保证代码的相对独立性。

例:在表单视图中增加3个按钮:[添加记录][修改记录][删除记录],如下图5(书345页图8.20)所示:。单击[添加记录][修改记录]都将弹出一个如下图6(书345页图8.21)所示的对话框,在对话框中可以进行数据的添加或修改,单击对话框的[确定]按钮则数据有效。

(1)用前面的单文档应用程序:数据库

(2)切换到项目工作区窗口的ResourceView页面,打开用于表单视图CMyView的对话框资源IDD_MY_FORM。参看下面图7向表中添加3个按钮:添加记录(IDC_REC_ADD)、修改记录(IDC_REC_EDIT)和删除记录(IDC_REC_DEL)。

         图5:记录编辑

(3)添加一个对话框资源,打开属性对话框将其字体设置为“宋体9号”,标题定为“学生表”,ID设为IDD_STU_TABLE(添加、修改、删除都弹出此对话框)

(4)将图7表单中的控件复制到刚添加的对话框中(参看下图8),并将[OK]和[Cancel]按钮的标题分别改为“确定”和“取消”。图中具有3D效果的竖直线是用静态图片控件(属性为Frame,Etched)构造的。双击对话框模板或按Ctrl+W快捷键,为对话框资源IDD_STU_TABLE创建一个对话框类CStuDlg。

          

                       图6:“学生表”

(5)打开ClassWizard的Member Variables标签,在Classname中选择CStuDlg,选中所需的控件ID号,双击鼠标或单击Add Variables按钮,依次为上图控件的ID按下表中形式增加成员变量。

控件ID号             变量类型           变量名        字符长度

IDC_PROF_CODE       CString            m_ProfCode       6

IDC_STU_ID           CString             m_StuID          6

IDC_STU_NAME        CString            m_StuName       8

IDC_STU_SEX          CString            m_StuSex         2

(6)切换到ClassWizard的Message Maps标签页,为CStuDlg中的控件IDOK增加BN_CLICKED的消息映射,并添加代码: UpdateData(TRUE);

(7)用ClassWizard为CMyView类中的3个按钮:IDC_REC_ADD,IDC_REC_EDIT和IDC_REC_DEL增加BN_CLICKED的消息映射,并添加下列代码:

voidCMyView::OnRecAdd()

{

       // TODO: Add your control notificationhandler code here

       CStuDlg dlg;

//以下语句没有

       dlg.m_StuID = m_pSet->m_stuid; //从这开始是另加的

       dlg.m_StuName = m_pSet->m_name;//使加上的学号、姓名、性别、专业代号

       dlg.m_StuSex = m_pSet->m_sex;   //传送到各自的成员变量中

       dlg.m_ProfCode = m_pSet->m_profcode;     

//到这为止

    if(dlg.DoModal()==IDOK)

       {

              m_pSet->AddNew();

              m_pSet->m_stuid = dlg.m_StuID;

              m_pSet->m_name = dlg.m_StuName;

              m_pSet->m_sex = dlg.m_StuSex;

              m_pSet->m_profcode =dlg.m_ProfCode;

              m_pSet->Update();

              m_pSet->Requery();

       }           

}

voidCMyView::OnRecEdit()

{

       // TODO: Add your control notificationhandler code here

       CStuDlg dlg;

       dlg.m_StuID = m_pSet->m_stuid;

       dlg.m_StuName = m_pSet->m_name;

       dlg.m_StuSex = m_pSet->m_sex;

       dlg.m_ProfCode = m_pSet->m_profcode;            

       if(dlg.DoModal()==IDOK)

       {

              m_pSet->Edit();

              m_pSet->m_stuid = dlg.m_StuID;

              m_pSet->m_name = dlg.m_StuName;

              m_pSet->m_sex = dlg.m_StuSex;

              m_pSet->m_profcode =dlg.m_ProfCode;

              m_pSet->Update();

              UpdateData(FALSE);

       }           

}

voidCMyView::OnRecDel()

{

       // TODO: Add your control notificationhandler code here

       CRecordsetStatus status;

       m_pSet->GetStatus(status);

       m_pSet->Delete();

       if(status.m_lCurrentRecord==0)

              m_pSet->MoveNext();

       else

              m_pSet->MoveFirst();

       UpdateData(FALSE); 

}

(8)在CMyView.cpp最上面加:#include “StuDlg.h”

(9)编译运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值