VC++数据库实验实验七Word格式文档下载.docx
《VC++数据库实验实验七Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VC++数据库实验实验七Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
varchar(10)
否
√
姓名
age
int
年龄
dept
char(4)
所在系号
comment
varchar(8)
评语
s表的创建方法在此不详述。
2基于ADO方式的实验步骤
此例中所用数据库与上例中相同;
此例中无需创建数据源。
(1)创建VC应用程序
打开VC++6.0,新建工程。
选择MFCAppWizard(exe),工程名为exec2,存放在D盘实验文件夹里。
点击“确定”,在弹出的窗口中选择“基本对话框”,以后的步骤没有需要修改的地方,可以直接点击“完成。
”这样一个基于基本对话框的工程就创建好了。
(2)界面设计
在工作区左边的树型结构中,选择ResourceView,展开Dialog节点,双击IDD_EXEC2_DIALOG,打开该对话框。
在这里添加所需控件。
如图17所示。
图17
为编辑框和列表框添加变量。
在界面右键单击,选择“建立类向导”,弹出如图18所示窗口。
图18
本例中需要为编辑框IDC_AGE,IDC_COMMENT,IDC_DEPT,IDC_NAME,IDC_SNO,列表框IDC_LIST添加变量。
以IDC_AGE为例,点击“ADDVariable”弹出如图19所示窗口。
图19
这里变量名为m_age,类型可从下拉框里选。
添加变量完成之后类向导如图20所示。
图20
为按钮添加函数,双击按钮可为其添加函数,在exec2Dig.cpp文件里。
(3)与ADO相关的代码设计
引入ADO库文件,使用ADO前必须在工程的StdAfx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
代码如下所示:
//加入ADO支持库
#import"
c:
\programfiles\commonfiles\system\ado\msado15.dll"
\
no_namespace\
rename("
EOF"
"
adoEOF"
)
定义ADO连接变量指针,在exec2.h文件的classCExec2App:
publicCwinApp方法中添加代码如下:
//定义ADO连接变量指针
_ConnectionPtrm_pConnection;
该指针为整个应用程序共享,所以放在public下面。
定义ADO连接、命令、记录集变量指针,在exec2Dlg.h文件的classCExec2Dlg:
publicCDialog方法中添加如下代码:
//定义ADO连接、命令、记录集变量指针
_CommandPtrm_pCommand;
_RecordsetPtrm_pRecordset;
初始化OLE/COM库环境。
必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。
在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。
在本例中,在exec2.cpp文件的BOOLCExec2App:
:
InitInstance()成员函数里添加如下代码:
//初始化COM,创建ADO连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些想不到的错误
try
{
//打开本地SqlServer库student
m_pConnection->
Open("
Provider=Microsoft.Jet.OLEDB.4.0;
DataSource=student.mdb"
"
"
adModeUnknown);
"
//DataSource后是数据库名
//这里使用的windows验证,没有设置用户名和密码,
}
catch(_com_errore)
{
AfxMessageBox("
数据库连接失败!
);
returnFALSE;
}
在exec2Dlg.cpp文件中添加代码。
在#endif下面添加如下代码:
externCExec2ApptheApp;
//在此引用应用类中的theApp来获取库连接指针
在BOOLCExec2Dlg:
OnInitDialog()函数中添加如下代码:
//TODO:
Addextrainitializationhere
//使用ADO创建数据库记录集
m_pRecordset.CreateInstance(__uuidof(Recordset));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些想不到的错误
try
m_pRecordset->
SELECT*FROMs"
//查询s表中所有字段
theApp.m_pConnection.GetInterfacePtr(),//获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
catch(_com_error*e)
AfxMessageBox(e->
ErrorMessage());
至此,与ADO相关的代码都已添加完了。
下面在exec2Dlg.cpp文件中添加应用代码。
(4)与功能相关的代码设计
在界面上用到列表框,当鼠标点击列表框的某一行时,其中的数据能够在编辑框中显示出来,这要用到列表框的一个函数。
添加此函数的方法如下:
摁住Ctrl和w键,进入类向导,如图21所示。
图21
选择IDC_LIST,在右边的Messages下面选择LBN_SELCHANGE,然后点击“AddFunction”按钮,最后点击“确定”按钮,即为列表框添加了此函数。
具体代码如下:
//名称:
OnSelchangeList
//功能:
当每次选择新的记录时,都会移动指针到新的记录位置并将值显示出来
voidCExec2Dlg:
OnSelchangeList()
{
intcurSel=m_list.GetCurSel();
_variant_tvar,varIndex;
if(curSel<
0)
return;
//先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针
MoveFirst();
Move(long(curSel));
var=m_pRecordset->
GetCollect("
sname"
if(var.vt!
=VT_NULL)
m_sname=(LPCSTR)_bstr_t(var);
age"
m_age=(LPCSTR)_bstr_t(var);
sno"
m_sno=(LPCSTR)_bstr_t(var);
dept"
m_dept=(LPCSTR)_bstr_t(var);
comment"
m_comment=(LPCSTR)_bstr_t(var);
UpdateData(false);
}
将数据库中的数据显示在列表框中,添加函数ListData()。
添加的方法是,在工作区左边的树型结构中,选择ClassView,右键单击CExec2Dlg,在弹出的菜单中选择AddMemberFunction,出现如图22所示的窗口,类型为void,函数描述为ListData()。
图22
此函数的具体代码如下:
ListData
将数据库中的数据显示在列表框中
ListData()
_variant_tvar;
CStringstrname,strage,strsno,strdept,strcom;
//清空列表框
m_list.ResetContent();
strname=strage=strsno=strdept=strcom="
;
//因为它有时会经常出现一些想不到的错误。
if(!
m_pRecordset->
BOF)
m_pRecordset->
else
{
AfxMessageBox("
表内数据为空"
return;
}
//读入库中各字段并加入列表框中
while(!
adoEOF)
var=m_pRecordset->
if(var.vt!
strsno=(LPCSTR)_bstr_t(var);
strname=(LPCSTR)_bstr_t(var);
strage=(LPCSTR)_bstr_t(var);
strdept=(LPCSTR)_bstr_t(var);
strcom=(LPCSTR)_bstr_t(var);
m_list.AddString(strsno+"
-->
"
+strname+"
+strage+"
+strdept+"
+strcom);
MoveNext();
//默认列表指向第一项,同时移动记录指针并显示
m_list.SetCurSel(0);
OnSelchangeList();
插入按钮对应的函数代码如下:
OnWritedata
将编辑框中输入的学生信息插入到s表中
OnWritedata()
UpdateData();
if(m_sname=="
||m_sno=="
)
学号和姓名信息不能为空!
//写入各字段值
AddNew();
PutCollect("
_variant_t(m_sno));
_variant_t(m_sname));
atol(m_age));
_variant_t(m_dept));
_variant_t(m_comment));
Update();
插入成功!
//更新显示其库内容
intnCurSel=m_list.GetCurSel();
ListData();
m_list.SetCurSel(nCurSel);
//移动记录指针到新的位置
修改按钮对应的函数代码如下:
OnModify
修改学生信息
OnModify()
//更新对话框数据
if(m_list.GetCount()==0)
表中记录数为空!
elseif(m_list.GetCurSel()<
0||m_list.GetCurSel()>
m_list.GetCount())
//修改当前记录的字段值
//重新读入库记录更新显示
删除按钮对应的函数代码如下:
OnDelete
删除选中的学生信息
OnDelete()
//删除当前行记录
Delete(adAffectCurrent);
//删除列表中当前值
m_list.DeleteString(nCurSel);
if(nCurSel==0&
&
(m_list.GetCount()!
=0))
m_list.SetCurSel(nCurSel);
elseif(m_list.GetCount()!
=0)
m_list.SetCurSel(nCurSel-1);
查询按钮对应的函数代码如下:
OnQuery()
按照学号和姓名查询学生信息,如果只输入学号则只按照学号查询
//只输入姓名则只按照姓名查询,两者都没有输入则查询所有学生信息
UpdateData(TRUE);
//构造Sql语句
//为简单考虑,这里只把学号和姓名作为查询条件
CStringstrSql;
if(m_sname!
="
&
m_sno!
strSql.Format("
SELECT*FROMsWHEREsname='
%s'
ANDsno='
m_sname,m_sno);
elseif(m_sname!
m_sno=="
m_sname);
elseif(m_sname=="
SELECT*FROMsWHEREsno='
m_sno);
else
strSql="
//先关闭已经打开的记录集对象
Close();
//根据新的Sql查询语句,重新打开记录集对象
Open(strSql.AllocSysString(),
theApp.m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
//将查询后得到的新记录集显示出来
ListData();
刷新按钮对应的函数代码如下:
OnRefresh
刷新编辑框和列表框
OnRefresh()
m_sno="
m_sname="
m_age="
m_dept="
m_comment="
UpdateData(false);
(5)运行结果
图23
五、实验总结
1.通过上面两个例子可以看出,基于ODBC的连接需要事先建立数据源,但连接时代码相对简单;
基于ADO的连接不需要建立数据源,连接代码比较复杂。
2.vc中与数据库相关的控件比较多,在第二个例子中仅使用了ListBox一种,实际上常用的还有ListCtrl,DataGrid等,这里不能一一介绍,同学们用到时可以再学习。