1 / 67

第8章 数据库编程

第8章 数据库编程. 自动注册数据源的 ODBC 数据库编程 在 ODBC 应用程序中使用 SQL 查询 媒体播放器与 ODBC 数据库编程的整合 使用 ODBC 类进行数据库编程. 教学目标. Visual C++ 程序设计》电子教案----王明福编. 教学内容. §8.1 简易媒体点播放程序 §8.2 ODBC 类的编程基础 §8.3 多媒体数据库 §8.4 多媒体查询系统 §8.5 简易媒体点播放的开发. §8.1 简易 媒体点播系统. 程序运行结果. 程序运行演示. 返回目录. 媒体点播程序(续). 三大功能:

milica
Télécharger la présentation

第8章 数据库编程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第8章 数据库编程 • 自动注册数据源的ODBC数据库编程 • 在ODBC应用程序中使用SQL查询 • 媒体播放器与ODBC数据库编程的整合 • 使用ODBC类进行数据库编程 教学目标 Visual C++程序设计》电子教案----王明福编

  2. 教学内容 • §8.1简易媒体点播放程序 • §8.2ODBC类的编程基础 • §8.3多媒体数据库 • §8.4多媒体查询系统 • §8.5简易媒体点播放的开发

  3. §8.1简易媒体点播系统 • 程序运行结果 • 程序运行演示 返回目录

  4. 媒体点播程序(续) 三大功能: 1. 数据记录的浏览 2. 实现SQL查询 3. 播放当前媒体记录 开发步骤: 首先介绍ODBC类的编程基础,再根据应用程序功能,结合知识点进行目标分解,分三步完成该系统的开发。 (1) 利用MFC提供的ODBC类,开发一个简易多媒体数据库系统odbc.exe,具有数据记录的编辑和浏览; (2) 修改odbc.exe, 开发一个简易多媒体查询系统odbcsql.exe; (3) 将第7章的媒体播放器与ODBCSQL.EXE进行整合,完善odbcsql程序, 编写一个简易媒体点播系统。 返回目录

  5. §8.2 ODBC类的编程基础 8.2.1 ODBC的结构 8.2.3应用ODBC编程 8.2.4创建数据源 8.2.5在程序中注册数据源 返回目录

  6. 8.2.1 ODBC的结构 1. ODBC的结构: (1) 应用程序(Application) (2) ODBC管理器(ODBC Manage) (3) ODBC驱动程序(ODBC Drivers)(4) 数据源(Data Sources) 2. 编程模型 应用程序ODBC管理器ODBC驱动程序数据库 返回目录

  7. 8.2.3 应用ODBC编程 1. 使用ODBC类编程的一般步骤 (1) 连接数据源 (2) 创建并执行SQL语句 (3) 检查结果记录 (4) 断开数据源 转下页 返回目录

  8. 应用ODBC编程(续一) 2. 记录的基本操作 假设 CRecordSet *m_pSet; m_pSet = new CRecordSet(); • 增加记录 • 使用AddNew()函数增加记录,但要求数据库必须是以允许增加的方式打开,增加一条记录的关键语句如下: • m_pSet->AddNew();//增加记录 • …… //输入新的字段值 • m_pSet->Update();//将新记录存入数据库 • m_pSet->Requery()//重建记录集 返回目录

  9. 记录基本操作 -- 删除、修改 • 直接使用Delete()函数,并且在调用Delete()函数之后不需调用Update()函数: • m_pSet->Delete(); //删除记录 • m_pSet->Requery();//重建记录集 • 修改记录使用Edit()函数,关键语句如下: • m_pSet->Edit(); //修改当前记录 • …… //修改当前记录字段值 • m_pSet->Update();//将新记录存入数据库 • m_pSet->Requery()//重建记录集 返回目录

  10. 8.2.4 创建数据源(DSN) • 先准备一数据库文件 • 在控制面板中,用ODBC数据源管理器 参考教材( §8.2.4 ) 返回目录

  11. 8.2.5 在程序中注册数据源 • 注册数据源打开记录集的步骤 注册数据源的核心是调用::SQLConfigDataSource()函数注册数据源。 返回目录

  12. §8.3 多媒体数据库 • 目标程序演示 • 程序的开发 • 关键技术核心代码 返回目录

  13. 目标程序介绍 多媒体数据库程序, 具有数据记录的编辑和浏览,如下图所示 返回目录

  14. 目标程序分析 1. 功能 数据记录的编辑和浏览 返回目录

  15. 程序开发—创建工程 返回目录 创建基于单文档界面(SDI)的odbc程序,请参照§8.3.1,并特别注意: 1.在MFC AppWizard Step 1 对话框中,选择“Single document”; 2.在MFC AppWizard-Step 2 of 6对话框中,选择“Database view without file support”单选项,如图8-9所示。 3.单击“Data Source…”按钮,弹出Database Options对话框。在Database Options对话框中,选取下拉式列表框中的mysong数据源(8.2.4节创建的数据源),如图8-10所示。 4.单击“OK”按钮,将弹出Select Database Tables对话框。在Select Database Tables对话框中, 将列出mysong数据源中的所有数据表,选择你要操作的数据表“Table Song”,如图8-11所示。

  16. 程序开发—可视化设计 返回目录 在IDD_ ODBC_FORM对话框中,根据表8-1中的定义编辑对话框资源,设计完毕的对话框如图8-12所示。

  17. 程序开发—关联变量 返回目录 为了在浏览数据记录时,各编辑框显示当前记录对应字段,利用MFC ClassWizard为它们引入变量。 参照§8.3.3方法,为编辑控件引入变量其结果如下图所示。

  18. 程序开发—添加消息函数 返回目录 为“记录(R)”菜单下的记录移动菜单项添加消息响应函数: OnRecordFirst() OnRecordLast() OnRecordNext() OnRecordPrev() 为“添加记录” 、“删除记录”和“修改记录” 按钮添加消息响应函数: OnRecordAdd() OnRecordDel() OnRecordEdit()。

  19. 核心代码–创建并打开数据集 返回目录 void COdbcView::OnInitialUpdate() { …… //创建并打开数据集 try { m_pSet=new COdbcSet(); m_pSet->Open(); MyUpdateData(); } catch (CDBException* pe) { AfxMessageBox(pe->m_strError); pe->Delete(); } }

  20. 核心代码– 添加记录 返回目录 void COdbcView::OnRecordAdd() { try { m_pSet->AddNew(); UpdateData(true); m_pSet->m_ID=m_ID; m_pSet->m_name=m_name; m_pSet->m_singer=m_singer; m_pSet->m_writer=m_writer; m_pSet->m_position=m_position; m_pSet->Update(); m_pSet->Requery(); } catch (CDBException* pe) { AfxMessageBox(pe->m_strError);pe->Delete();} }

  21. 核心代码– 删除记录 返回目录 void COdbcView::OnRecordDel() { try { m_pSet->Delete(); m_pSet->Requery(); MyUpdateData(); } catch (CDBException* pe) { AfxMessageBox(pe->m_strError); pe->Delete(); } }

  22. 核心代码–编辑记录 返回目录 void COdbcView::OnRecordEdit() { try { m_pSet->Edit(); UpdateData(true); m_pSet->m_ID=m_ID; m_pSet->m_name=m_name; m_pSet->m_singer=m_singer; m_pSet->m_writer=m_writer; m_pSet->m_position=m_position; m_pSet->Update(); } catch (CDBException* pe) { AfxMessageBox(pe->m_strError); pe->Delete();} }

  23. 核心代码– 移动记录(一) 返回目录 为各记录移动消息响应函数添加如下代码: void COdbcView::OnRecordFirst() { m_pSet->MoveFirst();//移动记录集指针至第一条记录处 MyUpdateData (); //更新记录显示 } void COdbcView::OnRecordLast() { m_pSet->MoveLast();//移动记录集指针至最后一条记录处 MyUpdateData (); //更新记录显示 }

  24. 核心代码– 移动记录(二) 返回目录 为各记录移动消息响应函数添加如下代码: void COdbcView::OnRecordNext() { m_pSet->MoveNext();//移动指针至下一条记录处 MyUpdateData (); //更新记录显示 } void COdbcView::OnRecordPrev() { m_pSet->MovePrev();//移动指针至前一条记录处 MyUpdateData (); //更新记录显示 }

  25. §8.4 多媒体查询系统 • 目标程序演示 • SQL查询简介 • 程序的开发 • 关键技术核心代码 返回目录

  26. 目标程序介绍 返回目录 与ODBC.EXE程序相比,有如下改进: ● 避开必须先注册数据源,在创建应用程序框架时选定数据源等限制,而是在应用程序中自动注册数据源,更具灵活性和适用性。 ● 添加了SQL查询功能,具有随心所欲查看、修改数据库中各种数据的灵活性。 程序演示

  27. SQL查询简介 返回目录 常用的SQL查询语句如表所示

  28. SQL查询语句举例 例1: SELECT从句的语法 SELECT 要检索的字段 FROM 要检索的表。 SELECT “Table1.ID”,”Table1.name”‘FROM Table1’ 返回目录

  29. 查询系统开发--创建工程 返回目录 创建一个基于单文档的工程,工程取odbcsql。特别注意的是:在MFC AppWizard Step 6 of 6对话框中,选取CFormView作为视类的基类,其目的是在视图类增加对话框,用于添加控件,操作与显示数据。如图8-17所示,其它每一步均接受缺省设置。

  30. 查询系统开发—界面设计 从IDD_ ODBCSQL_FORM对话框中,根据教材表8-4中的定义编辑对话框资源,设计完毕对话框如下图所示 返回目录

  31. 查询系统开发—给控件引入变量 用MFC ClassWizard为IDD_ODBCSQL_FORM对话框中的5个Edit Box控件和5个Static Text控件附上关联变量,如下图所示。 返回目录

  32. 查询系统开发—修改视图类 1. 在odbcsqlView.h文件中,添加支持数据库所需头文件和自动注册数据源库函数所需的头文件: #include <afxdb.h> //数据库支持所需头文件 #include “ODBCINST.H”//SQLConfigDataSource()函数所在的头文件 2. 为COdbcsqlView类添加数据和函数成员 class COdbcsqlView : public CFormView { protected: // create from serialization only …… //添加数据成员 CRecordset* m_set; public: CDatabase m_Db; …… }; 返回目录

  33. 核心代码—读取数据表字段 void COdbcsqlView::ReadDisplayFields(void) { short i, nFields; CODBCFieldInfo Fi; nFields=m_set->GetODBCFieldCount();//获得字段个数 for(i=0;i<nFields;i++) { m_set->GetODBCFieldInfo(i,Fi); //获取字段名 if(i==0)m_item1 = Fi.m_strName; if(i==1)m_item2 = Fi.m_strName; if(i==2)m_item3 = Fi.m_strName; if(i==3)m_item4 = Fi.m_strName; if(i==4)m_item5 = Fi.m_strName; } } 返回目录

  34. 核心代码—读取当前记录 void COdbcsqlView::ReadDispalyRecord(void) { if(m_set->IsEOF()==0) { short j, nFields; CString str; nFields=m_set->GetODBCFieldCount(); for(j=0;j<nFields;j++) {m_set->GetFieldValue((short)j,str);//获取记录值 if(j==0)m_id = atol(str); if(j==1)m_name = str; if(j==2)m_singer= str; if(j==3)m_writer=str; if(j==4)m_position =str; } } } 返回目录

  35. 核心代码—注册数据源 void COdbcsqlView::OnInitialUpdate() { …… if(!SQLConfigDataSource( //1. 注册数据源 NULL, ODBC_ADD_DSN, //父窗口指针,请求的类型 "Microsoft Access Driver (*.mdb)",//驱动程序名;属性 "DSN=msong\0" //数据源名称 "Description=dbdata database\0" //数据源的说明 "FileType=Microsoft Access\0" //数据源文件类型说明 “DBQ=D:\\MyVc\\song.mdb\0”//数据源文件全路径名 "MaxScanRows=8\0" ); …… } 返回目录

  36. 核心代码—读出字段名和记录 void COdbcsqlView::OnInitialUpdate() { …… //1. 注册数据源 m_set=new CRecordset(&m_Db); if (!m_Db.OpenEx(_T("DSN=msong"),0))// 建立同数据库的连接 { AfxMessageBox(“你选择了取消”); return; } m_set->Open( CRecordset::dynaset, _T(m_Query));// 打开记录集 //2. 读出并显示数据库字段名 ReadDisplayFields(); m_set-> MoveFirst(); ReadDispalyRecord(); UpdateData(false); } } 返回目录

  37. 核心代码—记录跳转 1. 跳到第一条记录 void COdbcsqlView::OnRecordFirst() { m_set->MoveFirst(); ReadDispalyRecord(); UpdateData(false); } 2. 跳到最后一条记录 void COdbcsqlView::OnRecordLast() { m_set->MoveLast(); ReadDispalyRecord(); UpdateData(false); } 返回目录

  38. 核心代码—记录后移 void COdbcsqlView::OnRecordNext() { if(m_set->IsEOF()) { m_set->MoveLast(); AfxMessageBox("当前视图没有记录!"); return; } if(m_set->IsBOF())m_set->MoveFirst(); else m_set->MoveNext(); ReadDispalyRecord(); UpdateData(false); } 返回目录

  39. 核心代码—记录前移 void COdbcsqlView::OnRecordPrev() { m_set->MovePrev(); if(m_set->IsEOF())m_set->MoveLast(); if(m_set->IsBOF())m_set->MoveFirst(); ReadDispalyRecord(); UpdateData(false); } 返回目录

  40. 核心代码—实现SQL查询 1.为查询条件编辑框IDC_EDIT_SQL引入变量 CString m_sql; 2.为“执行查询”按钮编写程序代码 返回目录

  41. 核心代码—实现SQL查询(续) void COdbcsqlView::OnSqlOk() { //①用查询条件编辑框的值更新关联变量m_sql UpdateData(true); CString m_Statement=m_sql; //②如果记录集已打开,则关闭记录集 if(m_set->IsOpen())m_set->Close(); CString OldStr = OldStr=m_Query; TRY {//③执行一般的查询语句 m_Statement.MakeUpper(); if(m_Statement.Find("SELECT") == -1)m_set->m_pDatabase->ExecuteSQL(m_Statement); else m_Query = m_Statement; if(!m_set->IsOpen())m_set->Open(CRecordset::dynaset,m_Query); //④打开记录集 } CATCH_ALL(e){…/*异常处理 */} ReadDisplayFields(); //⑤ 读出并显示数据库字段名 m_set-> MoveFirst(); ReadDispalyRecord(); UpdateData(false); } 返回目录

  42. 核心代码—断开数据源 返回目录 当结束程序时,必须关闭同数据库的连接,关闭记录集,删除记录集对象。其方法是: 添加事件WM_DESTORY的消息响应函数OnDestroy(),在其中关闭同数据库的连接,关闭记录集,在析构函数中删除记录集对象。 void COdbcsqlView::OnDestroy() { CFormView::OnDestroy(); if(m_DSOK==FALSE) return;//如注册数据源没成功,则返回 if(m_Db.IsOpen()) m_Db.Close();//关闭数据库 if(m_set->IsOpen()) m_set->Close();//如打开记录集,则关闭记录集 }

  43. §8.4 多媒体查询系统 • 目标程序演示 • SQL查询简介 • 程序的开发 • 关键技术核心代码 返回目录

  44. 目标程序介绍 与ODBC.EXE程序相比,有如下改进: ● 避开必须先注册数据源,在创建应用程序框架时选定数据源等限制,而是在应用程序中自动注册数据源,更具灵活性和适用性。 ● 添加了SQL查询功能,具有随心所欲查看、修改数据库中各种数据的灵活性。 返回目录

  45. SQL查询简介 返回目录 常用的SQL查询语句如表所示

  46. SQL查询语句举例 返回目录 例1: SELECT从句的语法 SELECT 要检索的字段 FROM 要检索的表。 SELECT “Table1.ID”,”Table1.name”‘FROM Table1’

  47. 查询系统开发--创建工程 返回目录 创建一个基于单文档的工程,工程取odbcsql。特别注意的是:在MFC AppWizard Step 6 of 6对话框中,选取CFormView作为视类的基类,其目的是在视图类增加对话框,用于添加控件,操作与显示数据。如图8-17所示,其它每一步均接受缺省设置。

  48. 查询系统开发—界面设计 返回目录 从IDD_ ODBCSQL_FORM对话框中,根据教材表8-4中的定义编辑对话框资源,设计完毕对话框如下图所示

  49. 查询系统开发—给控件引入变量 用MFC ClassWizard为IDD_ODBCSQL_FORM对话框中的5个Edit Box控件和5个Static Text控件附上关联变量,如下图所示。 返回目录

  50. 查询系统开发—修改视图类 1. 在odbcsqlView.h文件中,添加支持数据库所需头文件和自动注册数据源库函数所需的头文件: #include <afxdb.h> //数据库支持所需头文件 #include “ODBCINST.H”//SQLConfigDataSource()函数所在的头文件 2. 为COdbcsqlView类添加数据和函数成员 class COdbcsqlView : public CFormView { protected: // create from serialization only …… //添加数据成员 CRecordset* m_set; public: CDatabase m_Db; …… }; 返回目录

More Related