数据库实验三实验过程修改版.docx

上传人:b****6 文档编号:4727330 上传时间:2022-12-08 格式:DOCX 页数:42 大小:2.10MB
下载 相关 举报
数据库实验三实验过程修改版.docx_第1页
第1页 / 共42页
数据库实验三实验过程修改版.docx_第2页
第2页 / 共42页
数据库实验三实验过程修改版.docx_第3页
第3页 / 共42页
数据库实验三实验过程修改版.docx_第4页
第4页 / 共42页
数据库实验三实验过程修改版.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

数据库实验三实验过程修改版.docx

《数据库实验三实验过程修改版.docx》由会员分享,可在线阅读,更多相关《数据库实验三实验过程修改版.docx(42页珍藏版)》请在冰豆网上搜索。

数据库实验三实验过程修改版.docx

数据库实验三实验过程修改版

Lastmodifiedby30date12.22

 

数据库实验三实现过程详解

MFC提供了对数据库程序设计的强大支持。

对于数据库的访问,MFC提供了两组类:

ODBC(OpenDatabaseConnectivity)和ADO(ActiveXDataObjects)。

利用这两组功能强大的类,用户可以方便的开发出基于ODBC或ADO的数据库应用。

本实验主要是通过MFC对前两次实验中所建数据库表的一些基本操作。

此处举的例子是对数据库中student表的操作,该表中包含student的一些基本信息,如学号、姓名、性别、年龄。

而基本操作包括添加、查找、修改以及删除。

同学们也可自己进行扩展,比如增加学生信息以及增加一些对表的操作。

1ODBC基础

本部分主要介绍MFC的一组类ODBC。

ODBC是微软公司开放式服务结构中有关数据库的已组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API。

这些API函数利用SQL来完成其大部分任务。

ODBC本身也提供了对SQL语言的支持。

所谓的ODBC是利用微软提供的驱动程序来连接用户程序和数据库管理系统。

一个基于ODBC的应用程序读数据库的操作不依赖任何DBMS,也就是说利用ODBC封装了对数据库管理系统的各种操作。

应用程序只要对ODBC进行操作,然后ODBC进行数据库管理系统的操作。

在ODBC应用程序中,应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,建立起ODBC与具体数据库的联系。

只有在建立了连接之后才可以进行对数据源的操作,进而操作数据库。

下面是注册数据源的一般操作:

1)建立数据库;

注:

S表的SNOSNAMESAGESDEPT一定都要是char()类型!

2)在WindowsXP环境下打开“控制面板”,单击“管理工具”图标,如下图。

图1管理工具选项

3)双击“数据源”图标,弹出ODBC数据源管理器对话框,如下图。

 

图2ODBC数据与管理器对话框

4)在“ODBC数据源管理器”对话框中,单击“添加”按钮,弹出创建新数据源对话框,此处选择SQLSERVER为数据源驱动程序,如下图。

图3创建新数据源对话框

5)单击“完成”按钮后,弹出创建到SQLSERVER的新的数据源。

如下图。

 

图4创建到SQLSERVER的新数据源对话框

6)在创建到SQLServer的新数据源对话框中按要求填写,如服务器,填写你机器上实际的数据库服务器名,单击下一步,接下来差不多都按默认的或说明填写即可,如下列图所示。

 

图5选择登录方式

 

图6设置默认数据库

 

图7配置数据库显示及安全相关选项

 

 

2ODBC数据库编程

图8最终查看ODBC数据源管理器

在ODBC驱动程序支持下,应用程序对数据库的访问可以方便的利用ODBC类来进行。

MFC的ODBC类对较复杂的ODBCAPI函数进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发。

MFC的ODBC类主要包括Cdatabase类、Crecordset类、CrecordView类、CfieldExchange类、CDBException类。

下面利用前面连接好的数据源,进行编程,包括两方面:

API接口函数的编程以及

SQL语句的编程。

2.1创建单文档应用程序

1)启动VisualC++6.0,选择File|New,弹出New对话框,选择Projects标签,然后再列表中选中选择MFCAppWizard[exe]选项,在“Projectname”文本框中输入工程文件名

(根据需要自己确定),在“Location”中指定应用文件创建的位置,如下图所示:

 

图9创建MFCAppWizard应用程序

2)单击OK,弹出对话框MFCAppWizard-Step1,如下图所示,选择Singledocument单选按钮,单击Whatlanguagewouldyoulikeyourresoursesin?

下拉列表框的下三角按钮,选择【中国】APPWZCHS.DLL选项。

图10应用程序类型以及语言选择

 

3)单击NEXT,弹出MFCAppWizard-Step2,选择Databaseviewwithoutfilesupport单选

按钮,如下图所示:

图11选择数据库支持种类

4)单击DataSource按钮,弹出DatabaseOptions对话框如下图所示,在ODBC的下拉列表中选择之前的数据源。

 

图12数据源选择

5)单击OK,弹出SelectDatabaseTables对话框,如下图所示,选择自己要链接的表(可以选一张,也可多选)。

图13数据库中表的选择

6)单击OK,单击Next按钮,这一步中选择文档类型为容器类型,如下图所示。

 

图14文档类型选择

7)单击Next,之后都是默认,单击Finish完成。

到此初步的工程已经建好,下面进行界面的设计。

2.2新建界面按钮

本部分中,只是编写一个简单的界面,同学们可以根据自己所建数据库的需要来作出适当的修改。

在项目工作窗口中选择ResourceView页面,双击Menu中的IDD_LIANXI2_FORM,则弹出文档模板和控件工具栏,如下图所示的界面:

 

图15主界面

对于文档模板,单击右键,选择Properties,改变界面的风格。

如果没有弹出控件工具栏,则在工具栏的右边空白处单击右键,选择Controls,如下图

所示,将鼠标在控件上停留一会,就会出现该控件的名称。

图16调出控件工具栏

在文档模板上添加所需的控件,这里添加了五个Editbox控件和四个Button,和若干

StaticText。

这里具体描述一下控件的简单用法:

 

控件的选取:

可以用鼠标直接选取。

首先选中所要的控件,比如StaticText,然后移动

鼠标指针至文档模板上即可。

控件属性的修改:

右键单击文档模板面上的控件,选择Properties,单击左键,弹出Text

Properties对话框,如下图所示为StaticText的属性:

 

图17StaticText控件的属性

General标签中的ID为控件的编号,Caption中可填写标题。

在本例子中,可将Caption分别改为“学号”、“性别”等标题。

而Styles标签可以选择控件的风格,根据需要可以美化界面,不做介绍。

注:

老师给的pdf是两个人做的东西的杂糅,同一控件可能却有两个以上ID名。

另外S表只有学号姓名年龄专业(或者叫学历),没有性别。

这里将五个Editbox的ID分别改为IDC_ID_EDIT、IDC_NAME_EDIT、

IDC_AGE_EDIT、、IDC_DEPT_EDIT、IDC_CHECKNAME。

如下图所示:

图18编辑框控件ID的更改

将四个按钮改的ID改为IDC_ADD、IDC_MOD、IDC_DEL、IDC_CHECK,如下图所示来修改。

 

图19按钮控件ID的更改

调整各个控件的位置,如下图所示:

图20控件布局示意

添加新类CRecordsetAdd:

在工具栏上选择Insert|NewClass,添加一个新类CRecordset

ADD,如下图所示:

 

图21添加新类选项

单击OK,弹出DatabaseOptions对话框,如图所示,同样的选择数据源后,单击OK

按钮,弹出SelectDatabaseTables对话框,选择表,单击OK。

 

图22数据源中表的选择

在CRecordsetAdd中添加四个成员变量如下所示:

注:

在view-classwizard中添加

CStringm_Sno;CStringm_Sname;CStringm_Sage;CStringm_Sdept;

同时其成员函数DoFieldExchange如下:

注:

这个函数会自动添加好,在CRecordsetAdd类下可以看到。

voidCRecordsetAdd:

:

DoFieldExchange(CFieldExchange*pFX)

{

//{{AFX_FIELD_MAP(CRecordsetAdd)

pFX->SetFieldType(CFieldExchange:

:

outputColumn);RFX_Text(pFX,_T("[Sno]"),m_Sno);RFX_Text(pFX,_T("[Sname]"),m_Sname);RFX_Int(pFX,_T("[Sage]"),m_Sage);RFX_Text(pFX,_T("[Sdept]"),m_Sdept);

//}}AFX_FIELD_MAP

}

即采用了RFX机制实现了数据的交换。

 

在CLianxi2View:

:

DoDataExchange()函数中添加代码如下所示:

注:

前三行DDX_Text代码分别对应以下三个editbox控件(如上图),在编写好相应控件的函数后会系统会自动自动添加,也可自己手工添加。

解释ID变量

查询学号的输入框、IDC_CHECKNAMEm_checkname

查询的输入框、IDC_CHAXUN_EDITm_chaxun

SQL语句的输入框IDC_SQL_EDITm_sql

后四行DDX_FieldText必须手工添加

分别对应四个显示学生学号姓名年龄专业的editbox控件。

 

voidCLianxi2View:

:

DoDataExchange(CDataExchange*pDX)

{

CRecordView:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CLianxi2View)

DDX_Text(pDX,IDC_CHECKNAME,m_checkname);

DDX_Text(pDX,IDC_CHAXUN_EDIT,m_chaxun);

DDX_Text(pDX,IDC_SQL_EDIT,m_sql);DDX_FieldText(pDX,IDC_ID_EDIT,m_pSet->m_Sno,m_pSet);

DDX_FieldText(pDX,IDC_NAME_EDIT,m_pSet->m_Sname,m_pSet);

DDX_FieldText(pDX,IDC_DEPT_EDIT,m_pSet->m_Sdept,m_pSet);

DDX_FieldText(pDX,IDC_AGE_EDIT,m_pSet->m_Sage,m_pSet);

//}}AFX_DATA_MAP

}

这样就实现了数据的显示问题。

“添加”的实现:

为了添加记录,添加一个对话框资源:

在项目工作去窗口中选择ResourceView页面,右键单击Dialog选择InsertDialog,则添加了一个对话框,如下图所示:

图23插入新对话框

为其添加四个Editbox,其ID分别为IDC_ID、IDC_NAME、IDC_AGE、IDC_DEPT。

同时按照前面所描述的方法为该对话框添加类CAddNew,如下图所示:

 

 

图24子对话框添加控件

 

 

单击View|MFCClassWizard,在Project中选择lianxi2,在Classname中选择CAddNew,则在下面的界面中显示对话框中的界面,选中IDC_AGE,单击AddVariable,弹出如图的对话框,添加变量的名称,选择其类型。

图25为控件添加成员变量

同样,为其他控件添加变量,最后结果如图所示:

 

 

2.3编写按钮成员函数

2.3.1数据添加

图26控件与成员变量对应关系图

在主对话框中,即在ResourceView页面中,双击IDD_LIANXI2_FORM,出现已经设计好的主对话框后,双击添加按钮,出现对话框如下:

 

单击OK,为其添加函数如下所示:

图27添加成员函数

 

注:

所有按钮函数成员函数均在Lianxi2View.cpp中,需要添加包含以下头文件:

#include"AddNew.h"这个是CAddNew类

#include"MainFrm.h"这个是主界面类

#include"SHUJUNew.h"这个之后会提到的CSHUJUNew类。

注:

老师所给程序居然有%d。

有关AGE的所有%d都要改成%s。

voidCLianxi2View:

:

OnAdd()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CAddNewdlg;CStringstr;CStringstr1;CDatabasedb;

 

if(IDOK==dlg.DoModal())

{

try

{

 

str1.Format("INSERTINTOS(Sno,Sname,Sage,Sdept)

values('%s','%s',’%s’,'%s')",dlg.m_id,dlg.m_name,dlg.m_age,dlg.m_dept);

db.Open("学生信息");

db.ExecuteSQL(str1);

}

catch(CDBException*e)

{

AfxMessageBox(e->m_strError);

return;

}

str.Format("添加[%s]成功!

",dlg.m_name);MessageBox(str,NULL,MB_OK|MB_ICONINFORMATION);

 

}

}

 

2.3.2数据删除

 

删除操作:

voidCLianxi2View:

:

OnDel()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

//CAddNewdlg;CDatabasedb;try

{

CStringstr1;CStringstr;

if(m_pSet->IsOpen())

{

m_pSet->Close();

}

str.Format("删除记录[%s]成功!

",m_pSet->m_Sname);

str1.Format("DELETEFROMSWHERESno='%s'",m_pSet->m_Sno);

db.Open("学生信息");

db.ExecuteSQL(str1);MessageBox(str,NULL,MB_OK|MB_ICONINFORMATION);

 

//MessageBox("HELLO");

}

catch(CDBException*e)

{

AfxMessageBox(e->m_strError);

return;

}

 

}

 

2.3.3数据修改

注:

由程序中的sql语句可以看出,使用的时候,修改是不能改学号的

修改操作:

//////////////////

voidCLianxi2View:

:

OnMod()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CAddNewdlg;CStringstr;CStringstr1;CDatabasedb;

if(IDOK==dlg.DoModal())

{

try{

 

if(m_pSet->IsOpen())

{

m_pSet->Close();

}

str1.Format("UPDATESSETSname='%s',Sage=’%s’,Sdept='%s'WHERESno='%s'",dlg.m_name,dlg.m_age,dlg.m_dept,dlg.m_id);

db.Open("学生信息");

db.ExecuteSQL(str1);

 

}

catch(CDBException*e)

{

AfxMessageBox(e->m_strError);

return;

}

str.Format("修改[%s]成功!

",dlg.m_name);

 

MessageBox(str,NULL,MB_OK|MB_ICONINFORMATION);

}

}

 

2.3.4数据查询

 

查询操作:

voidCLianxi2View:

:

OnCheck()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

//UpdateData(true);

//注:

这里我updatedata函数出错,所以改用了下面三行代码,你可以试试

CStringss;

GetDlgItem(IDC_CHECKNAME)->GetWindowText(ss);

m_checkname=ss;

CDatabasedb;

db.Open("学生信息");

CStringstr;

m_checkname.TrimLeft();

if(m_checkname.IsEmpty())

{

MessageBox("要查询的学号不能为空!

");

return;

}

CRecordsetrecset(&db);

CStringstrSQL;

strSQL.Format("SELECT*FROMSWHERESNO='%s'",m_checkname);

recset.Open(CRecordset:

:

forwardOnly,strSQL,CRecordset:

:

readOnly);

if(recset.IsEOF())

{

MessageBox("没有查到你要找的学生记录!

");

}

else

{

CStringtemp1,temp2,temp4;

CStringtemp3;

recset.GetFieldValue("SNO",temp1);//这里的SNO的大小写要跟数据库S表里的SNO大小写完全一样

recset.GetFieldValue("SNAME",temp2);

recset.GetFieldValue("SAGE",temp3);

recset.GetFieldValue("SDEPT",temp4);

m_pSet->m_SNO=temp1;

m_pSet->m_SNAME=temp2;

m_pSet->m_SAGE=temp3;

m_pSet->m_SDEPT=temp4;

GetDlgItem(IDC_ID_EDIT)->SetWindowText(temp1);

GetDlgItem(IDC_NAME_EDIT)->SetWindowText(temp2);

GetDlgItem(IDC_AGE_EDIT)->SetWindowText(temp3);

GetDlgItem(IDC_DEPT_EDIT)->SetWindowText(temp4);

}

//注:

这里的updatedata一样被我干掉了,用了上面四行代码代替。

recset.Close();

}

2.3.5数据库记录显示

注:

这部分跳过吧,其他都弄好了再弄。

如果你成功显示状态条了,告诉我咋弄的。

这段代码如果加到程序中,不仅不能完成它应该做的,还会导致其他部分出错!

执行函数:

BOOLCLianxi2View:

:

OnCommand(WPARAMwParam,LPARAMlParam)

{

//TODO:

Addyourspecializedcodehereand/orcallthebaseclass

CStringstr;

CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;CStatusBar*pStatus=&pFrame->m_wndStatusBar;

if(pStatus)

{

CRecordsetStatusrStatus;

m_pSet->GetStatus(rStatus);

str.Format("当前记录:

%d/总记录:

%d",1+rStatus.m_lCurrentRecord,m_pSet->GetRecordCount());

pStatus->SetPaneText(1,str);

}

returnCRecordView:

:

OnCommand(wParam,lParam);

}

 

执行结果显示

 

图28显示数据库记录

 

注:

这里当然要先建好如上图28左下角所示的四个button控件

ID名分别为CreateTalbebuttonDelNewtalbeButtonAddNewtableButtonModButton。

2.3.6新建表

 

2.9表的操作函数

voidCLianxi2View:

:

OnCreateTalbebutton()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CDatabasedb;

//if(!

SQLConfigDataSource(NULL,ODBC_ADD_DSN,"SQLServer","DSN=学生信息"));

try

{

db.Open("学生信息");

db.ExecuteSQL("CREATETABLETEACHERS(TeacherIDCHAR(4)"",TeacherNameCHAR(10)"",CourseCHAR(10))");

}

catch(CDBException*e)

{

AfxMessageBox(e->m_strError);

 

return;

}

MessageBox("新建表成功!

");

}

 

向新表添加数据,这里像前面“添加”功能一样,需要再建一个Dilog,并新建一个类,

CSHUJUNew,没有本质的不同。

 

 

voidCLianxi2View:

:

OnAddNewtableButton()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CSHUJUNewdlg;CStringstr;CStringstr1;CDatabasedb;

if(IDOK==dlg.DoModal())

{

try

{

 

str1.Format("INSERTINTOTEACHERS(TeacherID,TeacherName,Course)

VALUES('%s','%s','%s')",dlg.m_teacherid,dlg.m_teachername,dlg.m_Course);

db.Open("学生信息");

db.ExecuteSQL(str1);

}

catch(CDBException*e)

{

e->ReportError();

return;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1