您的位置:首页 > 其它

8.2.3编辑记录【ODBC】

2012-04-30 21:59 155 查看
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_pSet的m_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)编译运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: