VC++60入门第九章 连接数据库Word格式文档下载.docx
- 文档编号:21633323
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:23
- 大小:522.68KB
VC++60入门第九章 连接数据库Word格式文档下载.docx
《VC++60入门第九章 连接数据库Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VC++60入门第九章 连接数据库Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
BOOLbReadOnly=FALSE,
LPCTSTRlpszConnect=”ODBC;
”,BOOLbUseCursorLib=TRUE);
其中:
lpszDSN指定数据源名,若lpszDSN的值为NULL时,在程序执行时会弹出数据源对话框,供用户选择一个数据源。
lpszConnect指定一个连接字符串,连接字符串中通常包括数据源名、用户ID、口令等信息,与特定的DBMS相关。
例如:
CDatabasedb;
db.Open(NULL,FALSE,FALSE,”ODBC;
DSN=HotelInfo;
UID=SYSTEM;
PWD=123456”);
从断开与一个数据源的连接,可以调用CDatabase类的成员函数Close()。
2.CRecordset类
CRecordset类对象表示从数据源中抽取出来的一组记录集。
CRecordset类封装了大量操作数据库的函数,支持查询,存取,更新数据库操作。
记录集主要分为两种类型:
(1)快照(Snapshot)记录集
快照记录集相当于数据库的一张静态视图,一旦从数据库抽取出来,当别的用户更新记录的操作是不会改变记录集,只有调用Requry()函数重新查询数据,才能反映数据的变化。
自身用户的添加记录操作重要调用Requry()函数重新查询数据,但快照集能反应自身用户的删除和修改操作。
(2)动态(Dynaset)记录集
动态(Dynaset)记录集与快照记录集恰恰相反,是数据库的动态视图。
当别的用户更新记录时,动态记录集能即时反映所作的修改。
在一些实时系统中必须采用动态记录集,如火车标联网购票系统。
但别的用户添加记录,也需要调用Requry()函数重新查询数据后才能反映出来。
CRecordset有六个重要的数据成员如表9-1所示.。
表9-1CRecordset类的数据成员
数据成员
类型
说明
m_strFilter
CString
筛选条件字符串
m_strSort
排序关键字字符串
m_pDatabase
CDatabase类指针
指向CDatabasec对象的指针
m_hstmt
HSTMT
ODBC语句句柄
m_nField
UINT
记录集中字段数据成员总数
m_nParams
记录集中参数数据成员总数
CRecordset的主要成员函数如表9-2所示:
表9-2CRecordset类的成员函数
成员函数
类型
Move
当前记录指针移动若干个位置
MoveFirst
当前记录指针移动到记录集第一条记录
MoveLast
当前记录指针移动到记录集最后一条记录
MoveNext
当前记录指针移动到记录集下一条记录
MovePrev
当前记录指针移动到记录集前一条记录
SetAbsolutePosition
当前记录指针移动到记录集特定一条记录
AddNew
添加一条新记录
Delete
删除一条记录
Edit
编辑一条记录
Update
更新记录
CancelUpdate
取消一条记录的更新操作
Requry
重新查询数据源
GetDefaultConnect
获得默认连接字符串
GetDefaultSQL
获得默认SQL语句
DoFieldExchange
记录集中字段数据成员与数据源中交换数据
GetRecordCount
获得记录集记录个数
IsEOF
判断当前记录指针是否在最后一个记录之后
IsBOF
判断当前记录指针是否在第一个记录之前
CanUpdate
判断记录集是否允许更新
3.CRecordView类
CRecordView类是CFormView的派生类,支持以控件视图来显示当前记录,并提供移动记录的默认菜单和工具栏,用户可以通过记录视图方便地浏览、修改、删除和添加记录。
记录视图与对话框一样使用DDX数据交换机制在视图中的控件的记录集成员之间交换数据,只需使用ClassWizard将控件与记录集的字段数据成员一一绑定。
CRecordView的主要函数如表9-3所示:
表9-3CRecordView类的主要成员函数
OnGetRecordset
获得指向记录集的指针
OnMove
当前记录指针移动时,OnMove()函数更新对当前记录所作的修改,这是将更新记录保存的方式。
IsOnFirstRecord
判断当前记录是否为记录集的第一条记录
IsOnLastRecord
判断当前记录是否为记录集的最后一条记录
4.CFieldExchange类
CFieldExchange类支持记录字段数据的自动交换,实现记录集中字段数据成员与相应的数据源中字段之间的数据交换,类似于对话框数据自动交换机制。
9.2数据库应用程序的实现
9.2.1创建并注册数据源
在创建数据库应用程序之前,先要准备好数据源。
下面我们假设数据库应用程序要连接的数据库hotel.mdb存放在C盘根目录下,该数据库下有一张TblCustomer的表,如图9-2所示:
图9-2 数据表“tblCustomer”
在Windows操作系统的控制面板中,可以找到数据源ODBC管理器的图标,如图9-3所示为windowsXPhomeEditon中的ODBC的图标,它的位置在控制面板中的管理工具文件夹。
由于所要连接的数据库是由MicrosoftACCESS创建,要求ODBC管理器中安装有MicrosoftACCESS的ODBC驱动程序。
一般,只需安装了MicrosoftACCESS软件,相应的ODBC驱动程序就已经默认安装了。
图9-3 ODBC图标
鼠标双击ODBC图标,弹出“ODBC数据源管理器”对话框,如图9-4所示。
图9-4 ODBC数据源管理器
在用户DSN、系统DSN、文件DSN标签页中都可以创建一个数据源,但所创建的数据源的应用范围是不同的:
(1)用户DSN:
用户数据源只对当前用户可见,而且只能用于当前机器上。
(2)系统DSN:
系统数据源对当前机器上的所有用户可见。
(3)文件DSN:
文件数据源可以由安装了相同驱动程序的用户共享。
可以根据所创建的数据源的不同的应用场合选择在不同的标签页下创建数据源,在本例中选择系统DSN。
在标签页中的列表中显示的是在本机已创建的系统数据源的列表。
单击“Add”按钮,新建一个数据源,弹出“创建新数据源”对话框。
如图9-5所示,在ODBC驱动程序列表中选择“MicrosoftAccess Driver(*.mdb)”。
图9-5 选择ODBC驱动程序类别
单击“Finish”按钮,弹出“ODBC MicrosoftAccess 安装”对话框,如图9-6所示。
在数据源名文本框中填入:
HotelInfo,单击“选择”按钮,弹出“选择数据库”对话框,如图9-7所示,选择数据库文件c:
\hotel.mdb,连续单击“OK”按钮回到前一对话框。
图9-6 设置MicrosoftAccess数据源
图9-7 选择数据库
最后在系统DSN标签中可以看到创建的数据源HotelInfo出现在数据源列表中,如图9-8所示。
图9-8 创建好的系统数据源
9.2.2创建数据库应用框架
〖例9-1〗使用AppWizard可以方便地得到一个数据库应用程序的框架,创建一个MFC EXE应用程序Exam9_1,在向导的第2步中,选择单选项“Databaseviewwithoutfilesupport”,如图9-9所示。
图9-9 设置数据库支持
单击“DataSource”按钮,弹出“DataOptions”对话框,选择单选项ODBC,并在下拉框中选择事先建立好的数据源“HotelInfo”,如图9-10所示。
图9-10选择ODBC数据源
单击“OK”按钮,弹出“SelectDatabaseTables”对话框,列表框中列出了HotelInfo数据库中所包含的表和查询,选择应用程序所操作的表tblCustomer,如图9-11所示。
图9-11 选择数据库表
单击“OK”按钮,结束数据源的设置工作,在图9-9中“DataSource”按钮的下方会出现数据源的选择信息。
单击“Finish”按钮,完成数据库应用程序框架的创建,编译运行这个程序,运行结果如图9-12所示。
应用程序包含了数据库记录基本操作菜单和工具按钮,视图是一个对话框,可以添加控件。
图9-12 数据库应用程序框架运行效果
选择工作区的ClassView,展开类树,进一步观察AppWizard自动添加的与数据库支持有关的内容。
增加了一个CExam9_1Set类,该类代表从HotelInfo中选择的一组记录集。
程序可以选择一个表作为一个记录集,本例选择了表tblCustomer中的记录构建记录集,也可以选择一个查询的结果集作为一个记录集。
如程序清单9-1所示。
CExam9_1Set构造函数用于创建一个记录集对象,并把一个CDatabase对象的指针作为参数传递给构造函数,以便获得已由CDatabase对象建立起来的与数据源的连接。
CExam9_1Set类的成员函数GetDefaultConnect()用于获得定义了数据源类型和数据源名的连接字符串。
GetDefaulltSQL()函数中定义了定义SQL语句的字符串,本例的SQL语句定义了查询一张表的完整记录。
CExam9_1Set类中定义了与数据源表的字段相对应的数据成员,成员函数DoFieldExchange()完成记录集上的字段数据成员与数据源上当前记录对应列之间数据的自动交换。
程序清单9-1:
CExam9_1Set类
classCExam9_1Set:
publicCRecordset
{
public:
CExam9_1Set(CDatabase*pDatabase=NULL);
DECLARE_DYNAMIC(CExam9_1Set)
//Field/ParamData
//{{AFX_FIELD(CExam9_1Set,CRecordset)
longm_CustomerID;
CStringm_LastName;
CStringm_FirstName;
CStringm_HomeCountry;
CStringm_HomeState;
CStringm_PhoneNumber;
CStringm_Comments;
//}}AFX_FIELD
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CExam9_1Set)
public:
virtualCStringGetDefaultConnect();
//Defaultconnectionstring
virtualCStringGetDefaultSQL();
//defaultSQLforRecordset
virtualvoidDoFieldExchange(CFieldExchange*pFX);
//RFXsupport
//}}AFX_VIRTUAL
//Implementation
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&
dc)const;
#endif
};
CExam9_1Set:
:
CExam9_1Set(CDatabase*pdb)
:
CRecordset(pdb)
//{{AFX_FIELD_INIT(CExam9_1Set)
m_CustomerID=0;
m_LastName=_T("
"
);
m_FirstName=_T("
m_HomeCountry=_T("
m_HomeState=_T("
m_PhoneNumber=_T("
m_Comments=_T("
m_nFields=7;
//}}AFX_FIELD_INIT
m_nDefaultType=snapshot;
}
CStringCExam9_1Set:
GetDefaultConnect()
return_T("
ODBC;
DSN=HotelInfo"
GetDefaultSQL()
[tblCustomer]"
voidCExam9_1Set:
DoFieldExchange(CFieldExchange*pFX)
//{{AFX_FIELD_MAP(CExam9_1Set)
pFX->
SetFieldType(CFieldExchange:
outputColumn);
RFX_Long(pFX,_T("
[CustomerID]"
),m_CustomerID);
RFX_Text(pFX,_T("
[LastName]"
),m_LastName);
[FirstName]"
),m_FirstName);
[HomeCountry]"
),m_HomeCountry);
[HomeState]"
),m_HomeState);
[PhoneNumber]"
),m_PhoneNumber);
[Comments]"
),m_Comments);
//}}AFX_FIELD_MAP
视图类CExam9_1View是CRecordView的派生类,CRecordView是记录视图,支持在控件中显示数据库记录。
默认提供了移动记录功能的实现(第一个,上一个,下一个,最后一个)。
定义了一个指向记录集的指针m_pSet。
CRecordView类是CFormView类的派生类,CFormView类的视图对应一个对话框资源,所以CRecordView类从基类中继承的成员函数中最重要的是DoDataExchange()函数和UpdateData()函数,DoDataExchange()函数实现记录集的字段与视图中控件之间的自动数据交换,UpdateData()函数实现记录集的字段与视图中控件之间实时交换。
9.2.3设计记录操作界面
〖例9-2〗打开资源管理器的Dialog文件夹,选择IDD_EXAM9_1_FORM,在对话框中按图9-13添加静态控件和编辑框控件,设置ID编辑框的属性为只读。
图9-13记录操作界面
并按表9-4所示,修改编辑框控件的ID属性。
表9-4记录操作界面控件属性
控件ID
控件类型
标题
静态文本控件
ID
IDC_CustomerID
编辑框控件
名
IDC_LastName
姓
IDC_FirstName
国家
IDC_HomeCountry
电话
IDC_PhoneCall
备注
IDC_Comments
接下来,要将编辑框控件与一个记录集字段数据成员绑定,打开ClassWizard,选择MemberVariables标签页,为编辑框控件映射记录集字段数据成员,单击“AddVariable”,弹出“AddMemberVariable”对话框,在下拉框中选择由m_pSet指针所指向的记录集字段数据成员。
如图9-14所示,为控件IDC_Comments选择绑定的变量为m_pSet->
m_Comments。
设置完毕如图9-15所示。
图9-14为视图控件绑定记录集字段数据成员
图9-15所有控件ID与记录集的绑定
单击“OK”按钮,完成设置,重新运行程序,运行结果如图9-16所示。
使用移动记录的四个工具按钮,前后浏览每一条记录,当移动到第一条记录时,“第一条”和“上一条”按钮变灰,当移动到最后一条记录时,“最后一条”和“下一条”按钮变灰。
在浏览记录的过程中,你可以修改各个编辑框中的内容,紧接着作一次移动记录操作,所作的修改就能被保存到数据库中。
图9-16增加了浏览功能后的应用程序
9.2.4更新记录
更新记录操作包括修改,添加和删除记录,CRecordSet类提供了AddNew()、Delete()、Edit()、Update()、CancelUpdate()、Requery()等成员函数用于更新记录。
AddNew()函数用于添加一个新的空记录,所有字段数据成员的值都为NULL。
Delete()函数用于删除当前记录,Edit()函数用于修改当前记录各字段数据成员的值。
Update()函数用于AddNew和Edit操作后的数据的最后保存,CancelUpdate()函数用于取消任何由AddNew和Edit操作产生的待处理的更新。
Requery()函数用于重新执行对记录集的查询,当记录集类型是快照型时,快照不反映用户添加的记录,这时需要调用该函数重新查询更新后的记录集。
下面在Exam9_1中增加添加新记录和删除记录的功能。
〖例9-3〗在“record”记录下添加三个菜单项如下图图9-17所示。
一个菜单项是分割线,另外两个菜单项分别是“增加记录”和“删除记录”。
菜单ID设置为ID_RECORD_ADD和ID_RECORD_DELETE。
图9-17增加菜单项
使用ClassWizard在视图类为菜单项ID_RECORD_ADD和ID_RECORD_DELETE映射COMMAND消息处理函数,得到成员函数OnRecordAdd()和OnRecordDelete()。
添加CExam9_1View的BOOL类数据成员m_addflg,用以记录是否进入添加模式,当m_addflg的值为true时,进入添加模式。
在CExam9_1View的构造函数中初始化m_addflg的值为false。
为成员函数OnRecordAdd()添加代码,增加一条空记录,并清除ID编辑框的只读属性。
实现代码如程序清单9-2所示。
程序清单9-2:
AddRecord菜单消息处理函数
voidCExam9_1View:
OnRecordAdd()
//TODO:
Addyourcommandhandlercodehere
m_pSet->
AddNew();
//进入添加模式
m_addflg=true;
//设置添加模式标志
CEdit*m_pCtrl=(CEdit*)GetDlgItem(IDC_CustomerID);
m_pCtrl->
SetReadOnly(false);
//清除ID编辑框的只读属性
UpdateData(false);
//用新记录的字段数据成员值更新控件显示
使用ClassWizard添加CExam9_1View类的虚函数OnMove()函数,并在OnMove()函数中添加代码,通过移动记录将添加的新记录保存到表中。
实现代码如程序清单9-3所示
程序清单9-3:
OnMove()函数
BOOLCExam9_1View:
OnMove(UINTnIDMoveCommand)
Addyourspecializedcodehereand/orcallthebaseclass
if(m_addflg)//添加模式处理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC+60入门第九章 连接数据库 VC 60 入门 第九 连接 数据库