南昌大学数据库实验报告8.docx
- 文档编号:6434232
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:16
- 大小:92.18KB
南昌大学数据库实验报告8.docx
《南昌大学数据库实验报告8.docx》由会员分享,可在线阅读,更多相关《南昌大学数据库实验报告8.docx(16页珍藏版)》请在冰豆网上搜索。
南昌大学数据库实验报告8
一、实验项目名称
使用ADO数据库编程
二、实验目的
VC++是面向对象的可视化编程工具,通过ADO可以在vc中访问数据库。
三、实验步骤及处理结果
1.为在VisualC++中使用ADO,需要在头文件中加入下面代码:
#import"c:
\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","adoEOF")rename("BOF","adoBOF")
#import语句告诉编译器把此指令中的动态链接库文件引入到程序中,并从库中抽取出其中的对象的类的信息,并产生出两个头文件包含在工程中。
其中的no_namespace用来对动态链接库的名称域进行隔离。
最后的rename,把ADO中的EOF重新命名,避免和其他地方定义的EOF产生冲突。
2.创建新工程Ado
在基于对话框的新工程中添加新类:
3.定义连接数据库类ADOConn
classADOConn//ADOConn.h
{//定义成员变量
public:
//添加一个指向Connection对象的指针:
_ConnectionPtrm_pConnection;
//添加一个指向Recordset对象的指针:
_RecordsetPtrm_pRecordset;
public:
//定义成员函数
ADOConn();
virtual~ADOConn();
voidOnInitADOConn();//初始化—连接数据库
_RecordsetPtr&GetRecordSet(_bstr_tbstrSQL);//执行查询
//执行SQL语句,InsertUpdate_variant_t
BOOLExecuteSQL(_bstr_tbstrSQL);
voidExitConnect();
};
建立到数据源的连接
voidADOConn:
:
OnInitADOConn()//ADOConn.cpp
{:
:
CoInitialize(NULL);//初始化OLE/COM库环境
try
{//创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
//设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_tstrConnect="Provider=SQLOLEDB;Server=a5;Database=HrMan;uid=sa;pwd=;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}//捕捉异常
catch(_com_errore)
{//显示错误信息
AfxMessageBox(e.Description());
}
}
取得表中的记录到记录集
_RecordsetPtr&ADOConn:
:
GetRecordSet(_bstr_tbstrSQL)
{try
{//连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
//创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
//取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}//捕捉异常
catch(_com_errore)
{//显示错误信息
AfxMessageBox(e.Description());
}//返回记录集
returnm_pRecordset;
}
执行SQL语句
{//_variant_tRecordsAffected;
try{//是否已经连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
//Connection对象的Execute方法:
(_bstr_tCommandText,
//VARIANT*RecordsAffected,longOptions)
//其中CommandText是命令字串,通常是SQL命令。
//参数RecordsAffected是操作完成后所影响的行数,
//参数Options表示CommandText的类型:
adCmdText-文本命令;adCmdTable-表名
//adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
returntrue;}
catch(_com_errore)
{AfxMessageBox(e.Description());
returnfalse;
}}
关闭连接
voidADOConn:
:
ExitConnect()
{
//关闭记录集和连接
if(m_pRecordset!
=NULL)
m_pRecordset->Close();
m_pConnection->Close();
//释放环境
:
:
CoUninitialize();
}
4.为表创建类
classCEmployees//Employees.h
{private:
intEmp_id;
CStringEmp_name;
CStringSex;
CStringTitle;
floatWage;
intDep_id;
public:
CEmployees();
virtual~CEmployees();
//设置和读取成员变量值
intGetEmp_id();
voidSetEmp_id(intvEmpId);
CStringGetEmp_name();
voidSetEmp_name(CStringvEmpName);
CStringGetSex();
voidSetSex(CStringvSex);
CStringGetTitle();
voidSetTitle(CStringvTitle);
floatGetWage();
voidSetWage(floatvWage);
intGetDep_id();
voidSetDep_id(intvDepId);
//数据库操作
voidsql_insert();
voidsql_update(CStringcEmpId);
voidsql_delete(CStringcEmpId);
//根据员工编号读取所有字段值
voidGetData(CStringcEmpId);
};
表类成员函数的实现
CEmployees:
:
CEmployees()
{
Emp_id=0;
Emp_name="";
Sex="";
Title="";
Wage=0;
Dep_id=0;
}
intCEmployees:
:
GetEmp_id()
{
returnEmp_id;
}
voidCEmployees:
:
SetEmp_id(intvEmpId)
{
Emp_id=vEmpId;
}
CStringCEmployees:
:
GetEmp_name()
{returnEmp_name;
}
voidCEmployees:
:
SetEmp_name(CStringvEmpName)
{Emp_name=vEmpName;
}
CStringCEmployees:
:
GetSex()
{returnSex;
}
voidCEmployees:
:
SetSex(CStringvSex)
{
Sex=vSex;
}
CStringCEmployees:
:
GetTitle()
{
returnTitle;
}
voidCEmployees:
:
SetTitle(CStringvTitle)
{
Title=vTitle;
}
floatCEmployees:
:
GetWage()
{
returnWage;
}
voidCEmployees:
:
SetWage(floatvWage)
{
Wage=vWage;
}
intCEmployees:
:
GetDep_id()
{
returnDep_id;
}
voidCEmployees:
:
SetDep_id(intvDepId)
{
Dep_id=vDepId;
}
5.表类成员插入函数
voidCEmployees:
:
sql_insert()
{//连接数据库
ADOConnm_AdoConn;
m_AdoConn.OnInitADOConn();
//设置INSERT语句
CStringstrWage;
strWage.Format("%f",Wage);
_bstr_tvSQL;
vSQL="INSERTINTOEmployees(Emp_name,Sex,Title,Wage,Dep_id)VALUES('"+Emp_name+"','"+Sex+"','"+Title+"',"+strWage+",1)";//执行INSERT语句
m_AdoConn.ExecuteSQL(vSQL);//断开与数据库的连接
m_AdoConn.ExitConnect();
}
voidCEmployees:
:
sql_update(CStringcEmpId)
{ADOConnm_AdoConn;//连接数据库
m_AdoConn.OnInitADOConn();//设置UPDATE语句
CStringstrWage;
strWage.Format("%f",Wage);
_bstr_tvSQL;
vSQL="UPDATEEmployeesSETEmp_name='"+Emp_name+"',Sex='"+Sex+"',Title='"+Title+"',Wage="
+strWage+"WHEREEmp_id="+cEmpId;
//执行UPDATE语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();
}
表类成员删除函数
voidCEmployees:
:
sql_delete(CStringcEmpId)
{
//连接数据库
ADOConnm_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_tvSQL;//设置DELETE语句
vSQL="DELETEFROMEmployeesWHEREEmp_id="+cEmpId;
//执行DELETE语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();
}
读取员工信息
voidCEmployees:
:
GetData(CStringcEmpId)
{ADOConnm_AdoConn;//连接数据库
m_AdoConn.OnInitADOConn();
_bstr_tvSQL;//设置SELECT语句
vSQL="SELECT*FROMEmployeesWHEREEmp_id="+cEmpId;
_RecordsetPtrm_pRecordset;//执行SELETE语句
m_pRecordset=m_AdoConn.GetRecordSet(vSQL);
if(m_pRecordset->adoEOF==1)//返回各列的值
CEmployees();
else
{Emp_id=atoi(cEmpId);
Emp_name=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Emp_Name");
Sex=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Sex");
Title=(LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Title");
Wage=atof((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Wage"));
Dep_id=atoi((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Dep_id"));
}//断开与数据库的连接
m_AdoConn.ExitConnect();
}
添加:
IDC_ADD_BUTTON
修改:
IDC_MODI_BUTTON
删除:
IDC_DEL_BUTTON
关闭:
IDC_CLOSE_BUTTON
IDC_ADODC1
COMMANDTYPE1-TEXTCOMMANDTYPE
RecordSourceSELECT*FROMEmployees
IDC_DATAGRID1
CAPTION:
员工信息
DataSource:
IDC_ADODC1
6.添加成员变量
添加成员函数
voidCAdoDlg:
:
RefreshData()
{//设置ADOData控件的数据源
m_adodc.SetRecordSource("SELECTEmp_id,Emp_nameAS员工姓名,SexAS性别,TitleAS职务,WageAS工资FROMEmployees");
m_adodc.Refresh();//设置列宽度
_variant_tvIndex;
vIndex=long(0);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(0);
vIndex=long
(1);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
vIndex=long
(2);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(80);
vIndex=long(3);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
vIndex=long(4);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(90);
}
在AdoDlg.cpp中的成员函数OnInitDialog()中添加代码:
RefreshData();
并在其中包括
#include"Columns.h"
#include"Column.h"
#include"COMDEF.H"
#include"EditDlg.h"
#include"_recordset.h"
#include"datagrid.h"
#include"Employees.h"
在datagrid.cpp中添加成员函数
CStringCDataGrid:
:
GetItem(intColNum)
{CColumnscols=GetColumns();
VARIANTv_ColNum,v_Value;
//设置列编号
v_ColNum.vt=VT_I2;
v_ColNum.iVal=ColNum;
//根据列编号返回CColumn对象
CColumncol=cols.GetItem(v_ColNum);
//读取列的
v_Value=col.GetValue();
returnv_Value.bstrVal;
}
并添加#include"Column.h"
并在datagrid.h中声明
CStringGetItem(intColNum);
6.添加对话框资源
IDD_DIALOG1编辑员工信息。
为这个对话框创建新类CEditDlg。
为其添加成员变量:
public:
CStringcEmpId;//员工号添加时为空
CStringstrSex;//员工性别
设置控件属性和连接成员变量
为CEditDlg成员变量初始化
CEditDlg:
:
CEditDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CEditDlg:
:
IDD,pParent)
{//{{AFX_DATA_INIT(CEditDlg)
m_EmpName=_T("");
m_Title=_T("");
m_Wage=0.0f;
//}}AFX_DATA_INIT
}
voidCEditDlg:
:
DoDataExchange(CDataExchange*pDX)
{CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEditDlg)
DDX_Control(pDX,IDC_SEX_COMBO,m_Sex);
DDX_Text(pDX,IDC_EMPNAME_EDIT,m_EmpName);
DDX_Text(pDX,IDC_TITLE_EDIT,m_Title);
DDX_Text(pDX,IDC_WAGE_EDIT,m_Wage);
//}}AFX_DATA_MAP
}
voidCEditDlg:
:
OnOK()
{CEmployeesemp;//TODO:
Addextravalidationhere
UpdateData(true);
if(m_EmpName=="")//检查数据有效性
{MessageBox("请输入员工姓名");return;
}//对CEmployees对象赋值
m_Sex.GetLBText(m_Sex.GetCurSel(),strSex);
emp.SetEmp_name(m_EmpName);
emp.SetSex(strSex);
emp.SetTitle(m_Title);
emp.SetWage(m_Wage);
emp.SetDep_id
(1);
//根据成员变量cEmpId的值,决定是插入数据,还是修改数据
if(cEmpId=="")//插入数据emp.sql_insert();
elseemp.sql_update(cEmpId);
CDialog:
:
OnOK();
}
voidCEditDlg:
:
OnCancel()
{CDialog:
:
OnCancel();//TODO:
Addextracleanuphere
}
BOOLCEditDlg:
:
OnInitDialog()
{CDialog:
:
OnInitDialog();
if(strSex=="男")//TODO:
Addextrainitializationhere
m_Sex.SetCurSel(0);
else
m_Sex.SetCurSel
(1);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
在EditDlg.cpp中添加
#include"Employees.h“
在Employees.cpp中添加
#include"ADOConn.h
在AdoDlg.cpp中添加成员函数
voidCAdoDlg:
:
OnAddButton()
{//TODO:
Addyourcontrolnotificationhandlercodehere
CEditDlgdlg;
dlg.cEmpId="";
dlg.strSex="男";
if(dlg.DoModal()==IDOK)
RefreshData();
}
voidCAdoDlg:
:
OnCloseButton()
{//TODO:
Addyourcontrolnotificationhandlercodehere
OnCancel();
}voidCAdoDlg:
:
OnModiButton()
{//TODO:
Addyourcontrolnotificationhandlercodehere
if(m_adodc.GetRecordset().GetEof()==1)
{MessageBox("没有数据");
return;
}
CEditDlgdlg;
dlg.cEmpId=m_datagrid.GetItem(0);
dlg.m_EmpName=m_datagrid.GetItem
(1);
dlg.strSex=m_datagrid.GetItem
(2);
dlg.m_Title=m_datagrid.GetItem(3);
dlg.m_Wage=atof(m_datagrid.GetItem(4));
if(dlg.DoModal()==IDOK)
RefreshData();
}
voidCAdoDlg:
:
OnDelButton()
{//TODO:
Addyourcontrolnotificationhandlercodehere
if(m_adodc.GetRecordset().GetEof()==1)
{MessageBox("请选择要删除的数据");
return;
}
if(MessageBox("是否删除当前记录?
","请确认",MB_YESNO)==IDYES)
{CEmployeesemp;
emp.sql_delete(m_data
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南昌大学 数据库 实验 报告