《九章节连接数据库.ppt》由会员分享,可在线阅读,更多相关《九章节连接数据库.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、九章节连接数据库 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望连接数据库的方式lODBC(Open DataBase Connectivity)l应用程序使用ODBCAPI访问数据库时,是由ODBC管理器将应用程序的数据库访问请示传递给相应的数据库驱动程序,驱动程序再用SQL语句完成DBMS的访问任务。lDAO(Data Access Objects)lDAO使用Microsoft Jet提供的数据库访问对象集直接访问DBMS,速度比ODBC要快。MFC ODB
2、C的构成lODBC管理器:位于控制面板控制面板l驱动程序管理器:ODBC32.dlllODBC驱动程序:以DLL文件形式出现MFC ODBC类lCDatabaselCRecordsetl快照记录集(snapshot)l动态记录集(Dynaset)lCRecordViewCRecordset类的数据成员CRecordset类的成员函数.CRecordset类的成员函数数据库应用程序的实现l创建并注册数据源 l创建数据库应用框架 l设计记录操作界面 l更新记录 l排序和筛选 创建并注册数据源lODBC管理器的使用l用户DSNl用户数据源只对当前用户可见,而且只能用于当前机器上 l系统DSNl系统数
3、据源对当前机器上的所有用户可见 l文件DSNl文件数据源可以由安装了相同驱动程序的用户共享 l数据源创建示例创建数据库应用框架lAppWizard的选项设置:step 2CExam9_1Set类class CExam9_1Set:public CRecordsetpublic:CExam9_1Set(CDatabase*pDatabase=NULL);DECLARE_DYNAMIC(CExam9_1Set)/Field/Param Data/AFX_FIELD(CExam9_1Set,CRecordset)longm_CustomerID;CStringm_LastName;CStringm_
4、FirstName;CStringm_HomeCountry;CStringm_HomeState;CStringm_PhoneNumber;CStringm_Comments;/AFX_FIELD/Overrides/ClassWizard generated virtual function overrides/AFX_VIRTUAL(CExam9_1Set)public:virtual CString GetDefaultConnect();/Default connection stringvirtual CString GetDefaultSQL();/default SQL for
5、 Recordsetvirtual void DoFieldExchange(CFieldExchange*pFX);/RFX support/AFX_VIRTUAL/Implementation#ifdef _DEBUGvirtual void AssertValid()const;virtual void Dump(CDumpContext&dc)const;#endif;记录集字段数据成员构造函数CExam9_1Set:CExam9_1Set(CDatabase*pdb):CRecordset(pdb)/AFX_FIELD_INIT(CExam9_1Set)m_CustomerID=0;
6、m_LastName=_T();m_FirstName=_T();m_HomeCountry=_T();m_HomeState=_T();m_PhoneNumber=_T();m_Comments=_T();m_nFields=7;/AFX_FIELD_INITm_nDefaultType=snapshot;记录集类型创建连接CString CExam9_1Set:GetDefaultConnect()return _T(ODBC;DSN=HotelInfo);CString CExam9_1Set:GetDefaultSQL()return _T(tblCustomer);用于获得定义了数据
7、源类型和数据源名的连接字符串 定义SQL语句的字符串,本例的SQL语句定义了查询一张表的完整记录 记录集与数据库的数据交换void CExam9_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);RFX_Text(pFX,_T(FirstName),m_First
8、Name);RFX_Text(pFX,_T(HomeCountry),m_HomeCountry);RFX_Text(pFX,_T(HomeState),m_HomeState);RFX_Text(pFX,_T(PhoneNumber),m_PhoneNumber);RFX_Text(pFX,_T(Comments),m_Comments);/AFX_FIELD_MAP 设计记录操作界面l视图控件与记录集字段数据成员更新记录lAddNew()lDelete()lEdit()lUpdate()lCancelUpdate()lRequery()进入添加模式void CExam9_1View:OnR
9、ecordAdd()/TODO:Add your command handler code herem_pSet-AddNew();/进入添加模式进入添加模式 m_addflg=true;/设置添加模式标志设置添加模式标志CEdit*m_pCtrl=(CEdit*)GetDlgItem(IDC_CustomerID);/清除清除ID编辑框的只读属性编辑框的只读属性m_pCtrl-SetReadOnly(false);/用新记录的字段数据成员值更新控件显示用新记录的字段数据成员值更新控件显示UpdateData(false);通过移动记录保存添加的新记录BOOL CExam9_1View:OnM
10、ove(UINT nIDMoveCommand)/TODO:Add your specialized code here and/or call the base classif(m_addflg)/添加模式处理添加模式处理m_addflg=false;UpdateData(true);/使用控件值更新记录集字段数据成员使用控件值更新记录集字段数据成员if(m_pSet-CanUpdate()/将记录集更新保存到表中将记录集更新保存到表中m_pSet-Update();m_pSet-Requery();/重新查询记录集重新查询记录集UpdateData(false);/以更新后的记录集数据成员
11、更新控件显示以更新后的记录集数据成员更新控件显示CEdit*m_pCtrl=(CEdit*)GetDlgItem(IDC_CustomerID);m_pCtrl-SetReadOnly(true);/设置设置ID编辑框为只读编辑框为只读return true;elsereturn CRecordView:OnMove(nIDMoveCommand);删除记录lvoid CExam9_1View:OnRecordDelete()ll/TODO:Add your command handler code herelm_pSet-Delete();/删除当前记录删除当前记录l m_pSet-Move
12、Next();/移到下一记录移到下一记录lif(m_pSet-IsEOF()/删除记录为最后一条记录处理删除记录为最后一条记录处理lm_pSet-MoveLast();l if(m_pSet-IsBOF()/删空记录集处理删空记录集处理lm_pSet-SetFieldNull(NULL);l lUpdateData(false);/更新控件显示更新控件显示l l 排序和筛选lm_strFilterlm_strSort 排序void CExam9_1View:OnViewSortId()/定义排序关键字按定义排序关键字按ID排序排序m_pSet-m_strSort=CustomerID;m_pS
13、et-Requery();/重新查询重新查询UpdateData(false);/更新控件显示更新控件显示 查询lvoid CExam9_1View:OnViewFilter()ll/TODO:Add your command handler code herel CFilterDlg dlg;lCString str;lif(dlg.DoModal()=IDOK)/调用筛选对话框,按调用筛选对话框,按OK按钮返回按钮返回lif(dlg.m_Filter.IsEmpty()/编辑框为空,显示整个记录集编辑框为空,显示整个记录集l str=;lelselstr=HomeCountry=+dlg.
14、m_Filter+;/定义筛选字符定义筛选字符串串l m_pSet-m_strFilter=str;lm_pSet-Requery();/重新查询记录集重新查询记录集lUpdateData(false);/更新控件显示更新控件显示ll MFC DAOl开发DAO数据库应用程序的过程与开发ODBC数据库程序却惊人地相似,只需在选择数据源的时候选择DAO单选项。lDaoDatabase类类lCDaoDatabase类对应于CDatabase类,支持与数据库的连接,但它不需要在ODBC管理器中注册DSN,直接与一个数据库相连。lDaoRecordset类类lCDaoRecordset类对应CReco
15、rdset类,CDaoRecordset类的数据成员和成员函数与CRecordset类的数据成员和成员函数非常相似,支持同样的记录集操作。l但由于DAO是直接与数据库相连,所以ODBC中的GetDefaultConnect()函数在DAO中是GetDefaultDBName。此外,CDaoRecordset类与数据源之间的数据交换是采用DFX(Dao record Field eXchange)机制,而OBDC采用的是RFX机制。lCDaoRecordView类类lCDaoRecordView类对应CRecordView类,功能几乎完全相同。lCDaoFieldExchange类类lCDaoFieldExchange类对应CFieldExchange类,支持数据交换。lCDaoTableDef类类实践1l重新实现Exam9_1示例程序,要求在AppWizqrd向导的第二步不作指定数据源和选择数据库表的操作,在生成程序框架后,使用ClassWizard创建一个CRecordset的派生类CCustomerset,再按DAO访问方式设置连接数据库。实践2l独立设计一个简单的数据库应用系统,用于管理旅行社的游客信息管理。需要知道信息一般有:身份证号,姓名,性别,住址,电话,参加的旅游项目编号,团队编号等,程序要有浏览、修改、添加、删除游客信息的功能。
限制150内