VC++环境下连接SQLServer数据库方法实验六.docx
《VC++环境下连接SQLServer数据库方法实验六.docx》由会员分享,可在线阅读,更多相关《VC++环境下连接SQLServer数据库方法实验六.docx(25页珍藏版)》请在冰豆网上搜索。
VC++环境下连接SQLServer数据库方法实验六
VC++环境下连接SQLServer数据库方法指导
实验类型:
设计型
一、实验环境
1.WindowsXP操作系统;
2.VC++6.0开发环境;
3.SQLserver2000数据库管理系统。
二、实验内容和要求
利用VC开发应用程序,要求能够通过界面完成对数据库中数据的查询、插入、删除以及修改。
三、实验原理
VC访问SQLServer数据库,常用的方法有两种:
通过ODBC连接和通过ADO连接。
下面分别介绍一下。
采用ODBC方式要求先创建ODBC数据源,应用程序通过数据源与数据库连接;并且在创建应用程序时,只能是基于单文档或多文档,而无法直接创建基于对话框的应用程序。
采用ADO方式无需创建数据源,应用程序可通过ADO直接与数据库连接;ADO方式可以创建基于对话框的应用程序。
两种方式都要在应用程序中添加代码以完成相应的初始化功能。
四、实验步骤
下面通过两个例子分别介绍基于ODBC方式和基于ADO方式的实验步骤。
1基于ODBC方式的实验步骤
(1)在SQLServer2000中创建数据库student,该数据库中有学生表s用来存放学生信息。
s表的结构如下:
属性名
类型
是否为主键
允许空
备注
sno
char(8)
是
学号
sname
varchar(10)
否
√
姓名
age
int
否
√
年龄
dept
char(4)
否
√
所在系号
comment
varchar(8)
否
√
评语
s表的创建方法在此不详述。
(2)创建ODBC数据源
“开始”--〉“设置”--〉“控制面板”—〉“管理工具”—〉“数据源(ODBC)”,打开之后出现如图1所示窗口。
图1
点击“添加”按钮,出现图2。
图2
选择SQLServer,点击“完成”,出现图3。
图3
名称中填写所创建的数据源的名称,本例中为student,描述可以不填。
因为SQLServer的服务器和客户端均安装在本地计算机上,所以服务器为(local)。
如果本地计算机上只安装了客户端,服务器安装在另外的机器上,服务器为另一台机器的名称。
点击“下一步”,出现图4。
图4
SQLServer如何验证ID的真伪,使用哪种方法要看安装SQLServer2000时选择的是哪种验证方式。
如果是Windows验证,选择使用网络登录ID的WindowsNT验证;如果是混合验证模式则要选择下面一种。
本例中采用Windows验证。
进入数据库无需另外的用户名和密码。
点击“下一步”,出现图5。
图5
这里要更改默认的数据库,默认情况下数据源所连接的数据库为master,这里要改为student数据库。
点击“下一步”,出现图6。
图6
这里无需修改,点击“完成”出现图7。
图7
点击“测试数据源”,如果测试成功说明数据源已成功创建。
(3)创建VC应用程序。
打开VC++6.0,新建工程,如图8所示。
选择MFCAppWizard(exe),工程名为exec1,存放在D盘实验文件夹里。
图8
点击“确定”,在出现的窗口中选择“单文档”,点击“下一步”,出现图9。
图9
这里选择“查看数据库不使用文件支持”,还要选择数据源,点击“数据源…”,弹出如图10所示窗口。
图10
选择“student”数据源,点击“OK”,在弹出的窗口中选择表dbo.s,点击“OK”返回图9所示的界面。
以后的创建步骤中没有需要修改的地方可以直接点击完成。
这样工程exec1就创建完成了,并且通过数据源与数据库发生了关联。
创建好的工程可以运行,结果如图11所示。
图11
(4)界面设计
在工作区左边的树型结构中,选择ResourceView,展开Dialog节点,双击IDD_EXEC1_FORM,打开该对话框。
在这里添加所需控件。
如图12所示。
图12
此时运行程序,结果如图13所示。
图13
从界面可以看出程序要完成的功能。
完整的程序运行后,界面默认显示表中的第一条数据,点击工具栏中的“下一记录”可以显示下一条记录;点击“删除”按钮可将当前显示的数据从库中删除;点击“清除”按钮,将所有编辑框清空;在界面输入学生信息,点击“添加”按钮可将此学生信息输入至数据库;点击“修改”按钮可修改当前显示的学生信息。
为界面上的编辑框和按钮添加变量和函数。
在界面右键单击,选择“建立类向导”,弹出如图14所示窗口。
图14
本例中需要为编辑框IDC_AGE,IDC_COMMENT,IDC_DEPARTMENT,IDC_NAME,IDC_SNO添加变量。
以IDC_AGE为例,点击“ADDVariable”弹出如图15所示窗口。
图15
在下拉框中选择m_pSet->m_age为变量名,这里的变量是与数据库表s中的字段相对应的,变量类型也与s中的字段类型对应。
其它变量的添加方法相同。
为按钮添加函数比较简单,双击按钮即可。
添加的函数在exec1View.cpp文件中。
(5)代码设计
“清除”按钮所添加的函数为OnClear(),具体代码如下:
//名称:
OnClear
//功能:
清除编辑框中的内容
voidCExec1View:
:
OnClear()
{
CWnd*c1;
c1=CWnd:
:
GetDlgItem(IDC_SNO);//获得编辑框
c1->SetWindowText("");//将编辑框置空
c1=CWnd:
:
GetDlgItem(IDC_NAME);
c1->SetWindowText("");
c1=CWnd:
:
GetDlgItem(IDC_DEPARTMENT);
c1->SetWindowText("");
c1=CWnd:
:
GetDlgItem(IDC_AGE);
c1->SetWindowText("");
c1=CWnd:
:
GetDlgItem(IDC_COMMENT);
c1->SetWindowText("");
}
“添加”按钮所添加的函数为OnAdd(),具体代码如下:
//名称:
OnAdd
//功能:
插入一条记录
voidCExec1View:
:
OnAdd()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//判断年龄是否合适
CStringstrAge;
GetDlgItem(IDC_AGE)->GetWindowText(strAge);
intnAge=atoi(strAge.GetBuffer(0));
if(nAge<0||nAge>120)
{
AfxMessageBox("输入的年龄不符合实际!
");
return;
}
//呈增加状态
m_pSet->AddNew();
UpdateData();
//更新数据库
m_pSet->Update();
//重新获得数据
m_pSet->Requery();
UpdateData(FALSE);
}
“删除”按钮所添加的函数为OnDelete(),具体代码如下:
//名称:
OnDelete
//功能:
删除当前记录
voidCExec1View:
:
OnDelete()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//发出删除命令
m_pSet->Delete();
//重新获得记录集
m_pSet->Requery();
UpdateData(FALSE);
}
“修改”按钮所添加的函数为OnEdit(),具体代码如下:
//名称:
OnEdit
//功能:
修改当前记录
voidCExec1View:
:
OnEdit()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//判断年龄是否合适
CStringstrAge;
GetDlgItem(IDC_AGE)->GetWindowText(strAge);
intnAge=atoi(strAge.GetBuffer(0));
if(nAge<0||nAge>120)
{
AfxMessageBox("输入的年龄不符合实际!
");
return;
}
//呈编辑状态
m_pSet->Edit();
UpdateData();
//更新数据库
m_pSet->Update();
//重新获得记录集
m_pSet->Requery();
UpdateData(FALSE);
}
(6)运行结果
图16
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连接、命令、记录集变量指针
_ConnectionPtrm_pConnection;
_CommandPtrm_pCommand;
_RecordsetPtrm_pRecordset;
该指针为整个应用程序共享,所以放在public下面。
初始化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("driver={SQLServer};Server=lenovo-pc;Database=student;UID="";PWD=""",
"","",adModeUnknown);
//Server后是服务器的计算机名,Database后是数据库名
//这里使用的windows验证,没有设置用户名和密码,
//如果是windows和SQLserver混合验证,UID="";PWD=""要写入相应的用户名和密码
}
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->Open("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;
try
{
//先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针
m_pRecordset->MoveFirst();
m_pRecordset->Move(long(curSel));
var=m_pRecordset->GetCollect("sname");
if(var.vt!
=VT_NULL)
m_sname=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("age");
if(var.vt!
=VT_NULL)
m_age=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("sno");
if(var.vt!
=VT_NULL)
m_sno=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("dept");
if(var.vt!
=VT_NULL)
m_dept=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("comment");
if(var.vt!
=VT_NULL)
m_comment=(LPCSTR)_bstr_t(var);
UpdateData(false);
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
}
将数据库中的数据显示在列表框中,添加函数ListData()。
添加的方法是,在工作区左边的树型结构中,选择ClassView,右键单击CExec2Dlg,在弹出的菜单中选择AddMemberFunction,出现如图22所示的窗口,类型为void,函数描述为ListData()。
图22
此函数的具体代码如下:
//名称:
ListData
//功能:
将数据库中的数据显示在列表框中
voidCExec2Dlg:
:
ListData()
{
_variant_tvar;
CStringstrname,strage,strsno,strdept,strcom;
//清空列表框
m_list.ResetContent();
strname=strage=strsno=strdept=strcom="";
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些想不到的错误。
try
{
if(!
m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}
//读入库中各字段并加入列表框中
while(!
m_pRecordset->adoEOF)
{
var=m_pRecordset->GetCollect("sno");
if(var.vt!
=VT_NULL)
strsno=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("sname");
if(var.vt!
=VT_NULL)
strname=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("age");
if(var.vt!
=VT_NULL)
strage=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("dept");
if(var.vt!
=VT_NULL)
strdept=(LPCSTR)_bstr_t(var);
var=m_pRecordset->GetCollect("comment");
if(var.vt!
=VT_NULL)
strcom=(LPCSTR)_bstr_t(var);
m_list.AddString(strsno+"-->"+strname+"-->"+strage+"-->"+strdept+"-->"+strcom);
m_pRecordset->MoveNext();
}
//默认列表指向第一项,同时移动记录指针并显示
m_list.SetCurSel(0);
OnSelchangeList();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
}
插入按钮对应的函数代码如下:
//名称:
OnWritedata
//功能:
将编辑框中输入的学生信息插入到s表中
voidCExec2Dlg:
:
OnWritedata()
{
UpdateData();
if(m_sname==""||m_sno=="")
{
AfxMessageBox("学号和姓名信息不能为空!
");
return;
}
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些想不到的错误。
try
{
//写入各字段值
m_pRecordset->AddNew();
m_pRecordset->PutCollect("sno",_variant_t(m_sno));
m_pRecordset->PutCollect("sname",_variant_t(m_sname));
m_pRecordset->PutCollect("age",atol(m_age));
m_pRecordset->PutCollect("dept",_variant_t(m_dept));
m_pRecordset->PutCollect("comment",_variant_t(m_comment));
m_pRecordset->Update();
AfxMessageBox("插入成功!
");
//更新显示其库内容
intnCurSel=m_list.GetCurSel();
ListData();
m_list.SetCurSel(nCurSel);
//移动记录指针到新的位置
OnSelchangeList();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
}
修改按钮对应的函数代码如下:
//名称:
OnModify
//功能:
修改学生信息
voidCExec2Dlg:
:
OnModify()
{
UpdateData();//更新对话框数据
if(m_l