第9章 连接数据库精选PPT.ppt
第第9章章 连接数据库连接数据库第1页,本讲稿共29页连接数据库的方式连接数据库的方式lODBC(Open Database Connectivity,开放数据库互连开放数据库互连)是微软公司开放服务结是微软公司开放服务结构中有关数据库的一个组成部分,它建构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库立了一组规范,并提供了一组对数据库访问的标准访问的标准API(应用程序编程接口)。(应用程序编程接口)。这些这些API利用利用SQL来完成其大部分任务。来完成其大部分任务。ODBC本身也提供了对本身也提供了对SQL语言的支持,语言的支持,用户可以直接将用户可以直接将SQL语句送给语句送给ODBC。第2页,本讲稿共29页连接数据库的方式连接数据库的方式lODBC(Open DataBase Connectivity)l应用程序使用应用程序使用ODBCAPI访问数据库时,访问数据库时,是由是由ODBC管理器将应用程序的数据库访问管理器将应用程序的数据库访问请示传递给相应的数据库驱动程序,驱动程请示传递给相应的数据库驱动程序,驱动程序再用序再用SQL语句完成语句完成DBMS的访问任务。的访问任务。lDAO(Data Access Objects)lDAO使用使用Microsoft Jet提供的数据库访问提供的数据库访问对象集直接访问对象集直接访问DBMS,速度比,速度比ODBC要快。要快。第3页,本讲稿共29页注册注册ODBC数据源数据源l应用程序要访问一个数据库,首先必须应用程序要访问一个数据库,首先必须用用ODBC管理器注册一个数据源,管理管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据器根据数据源提供的数据库位置、数据库类型及库类型及ODBC驱动程序等信息,建立驱动程序等信息,建立起起ODBC与具体数据库的联系。这样,与具体数据库的联系。这样,只要应用程序将数据源名提供给只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连就能建立起与相应数据库的连接。接。第4页,本讲稿共29页MFC ODBC的构成的构成lODBC管理器:位于管理器:位于控制面板控制面板l驱动程序管理器驱动程序管理器:ODBC32.dlllODBC驱动程序驱动程序:以以DLL文件形式出现文件形式出现第5页,本讲稿共29页MFC的的ODBC类简介类简介 lMFC的的ODBC类对较复杂的类对较复杂的ODBC API进行了封装,提供了简化的调用接口,进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发。从而大大方便了数据库应用程序的开发。程序员不必了解程序员不必了解ODBC API和和SQL的具的具体细节,利用体细节,利用ODBC类即可完成对数据类即可完成对数据库的大部分操作。库的大部分操作。第6页,本讲稿共29页MFC的的ODBC类简介类简介MFC的的ODBC类主要包括:类主要包括:lCDatabase类:类:主要功能是建立与数据源的连接。主要功能是建立与数据源的连接。lCRecordset类:类:该类代表从数据源选择的一组记录该类代表从数据源选择的一组记录(记录集),程序可以选择数据源中的某个表作为(记录集),程序可以选择数据源中的某个表作为一个记录集,也可以通过对表的查询得到记录集,一个记录集,也可以通过对表的查询得到记录集,还可以合并同一数据源中多个表的列到一个记录集还可以合并同一数据源中多个表的列到一个记录集中通过该类可对记录集中的记录进行滚动、修改、中通过该类可对记录集中的记录进行滚动、修改、增加和删除等操作。增加和删除等操作。第7页,本讲稿共29页MFC的的ODBC类简介类简介lCRecordView类类:提供了一个表单视图:提供了一个表单视图与某个记录集直接相连,利用对话框数与某个记录集直接相连,利用对话框数据交换机制据交换机制(DDX)在记录集与表单视图的在记录集与表单视图的控件之间传输数据。该类支持对记录的控件之间传输数据。该类支持对记录的浏览和更新,在撤销时会自动关闭与之浏览和更新,在撤销时会自动关闭与之相联系的记录集。相联系的记录集。l通常情况下,通常情况下,CDatabase针对某个数据针对某个数据库,它负责连接数据源;库,它负责连接数据源;CRecordset针针对数据源中的记录集,它负责对记录的对数据源中的记录集,它负责对记录的操作操作 第8页,本讲稿共29页CRecordset类的数据成员类的数据成员第9页,本讲稿共29页CRecordset类的成员函数类的成员函数.第10页,本讲稿共29页CRecordset类的成员函数类的成员函数第11页,本讲稿共29页数据库应用程序的实现数据库应用程序的实现创建并注册数据源创建并注册数据源 创建数据库应用框架创建数据库应用框架 设计记录操作界面设计记录操作界面 更新记录更新记录 排序和筛选排序和筛选 第12页,本讲稿共29页创建并注册数据源创建并注册数据源lODBC管理器的使用管理器的使用l用户用户DSNl用户数据源只对当前用户可见,而且只能用于用户数据源只对当前用户可见,而且只能用于当前机器上当前机器上 l系统系统DSNl系统数据源对当前机器上的所有用户可见系统数据源对当前机器上的所有用户可见 l文件文件DSNl文件数据源可以由安装了相同驱动程序的用户文件数据源可以由安装了相同驱动程序的用户共享共享 l数据源创建示例数据源创建示例第13页,本讲稿共29页创建数据库应用框架创建数据库应用框架lAppWizard的选项设置:的选项设置:step 2第14页,本讲稿共29页CExam9_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_FirstName;CStringm_HomeCountry;CStringm_HomeState;CStringm_PhoneNumber;CString m_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 Recordsetvirtual void DoFieldExchange(CFieldExchange*pFX);/RFX support/AFX_VIRTUAL/Implementation#ifdef _DEBUGvirtual void AssertValid()const;virtual void Dump(CDumpContext&dc)const;#endif;记录集字段数据成员第15页,本讲稿共29页构造函数构造函数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_INITm_nDefaultType=snapshot;记录集类型第16页,本讲稿共29页创建连接创建连接CString CExam9_1Set:GetDefaultConnect()return _T(ODBC;DSN=HotelInfo);CString CExam9_1Set:GetDefaultSQL()return _T(tblCustomer);用于获得定义了数据源类型和数据源名的连接字符串 定义SQL语句的字符串,本例的SQL语句定义了查询一张表的完整记录 第17页,本讲稿共29页记录集与数据库的数据交换记录集与数据库的数据交换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_FirstName);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 第18页,本讲稿共29页设计记录操作界面设计记录操作界面l视图控件与记录集字段数据成员视图控件与记录集字段数据成员第19页,本讲稿共29页更新记录更新记录lAddNew()lDelete()lEdit()lUpdate()lCancelUpdate()lRequery()第20页,本讲稿共29页进入添加模式进入添加模式void CExam9_1View:OnRecordAdd()/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);第21页,本讲稿共29页通过移动记录保存添加的新通过移动记录保存添加的新记录记录BOOL CExam9_1View:OnMove(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);/以更新后的记录集数据成员更新控件显示以更新后的记录集数据成员更新控件显示CEdit*m_pCtrl=(CEdit*)GetDlgItem(IDC_CustomerID);m_pCtrl-SetReadOnly(true);/设置设置ID编辑框为只读编辑框为只读return true;elsereturn CRecordView:OnMove(nIDMoveCommand);第22页,本讲稿共29页删除记录删除记录lvoid CExam9_1View:OnRecordDelete()ll/TODO:Add your command handler code herel m_pSet-Delete();/删除当前记录删除当前记录l m_pSet-MoveNext();/移到下一记录移到下一记录lif(m_pSet-IsEOF()/删除记录为最后一条记录处理删除记录为最后一条记录处理lm_pSet-MoveLast();lif(m_pSet-IsBOF()/删空记录集处理删空记录集处理lm_pSet-SetFieldNull(NULL);lUpdateData(false);/更新控件显示更新控件显示l 第23页,本讲稿共29页排序和筛选排序和筛选lm_strFilterlm_strSort 第24页,本讲稿共29页排序排序void CExam9_1View:OnViewSortId()/定义排序关键字按ID排序m_pSet-m_strSort=CustomerID;m_pSet-Requery();/重新查询UpdateData(false);/更新控件显示 第25页,本讲稿共29页查询查询lvoid CExam9_1View:OnViewFilter()ll/TODO:Add your command handler code herel CFilterDlg dlg;l CString str;l if(dlg.DoModal()=IDOK)/调用筛选对话框,按OK按钮返回lif(dlg.m_Filter.IsEmpty()/编辑框为空,显示整个记录集l str=;lelseltr=HomeCountry=+dlg.m_Filter+;/定义筛选字符串l m_pSet-m_strFilter=str;lm_pSet-Requery();/重新查询记录集lUpdateData(false);/更新控件显示ll 第26页,本讲稿共29页l实现书中例题:实现书中例题:l例例9-1l例例9-2l例例9-3l例例9-4第29页,本讲稿共29页