670 likes | 914 Vues
第8章 数据库编程. 自动注册数据源的 ODBC 数据库编程 在 ODBC 应用程序中使用 SQL 查询 媒体播放器与 ODBC 数据库编程的整合 使用 ODBC 类进行数据库编程. 教学目标. Visual C++ 程序设计》电子教案----王明福编. 教学内容. §8.1 简易媒体点播放程序 §8.2 ODBC 类的编程基础 §8.3 多媒体数据库 §8.4 多媒体查询系统 §8.5 简易媒体点播放的开发. §8.1 简易 媒体点播系统. 程序运行结果. 程序运行演示. 返回目录. 媒体点播程序(续). 三大功能:
E N D
第8章 数据库编程 • 自动注册数据源的ODBC数据库编程 • 在ODBC应用程序中使用SQL查询 • 媒体播放器与ODBC数据库编程的整合 • 使用ODBC类进行数据库编程 教学目标 Visual C++程序设计》电子教案----王明福编
教学内容 • §8.1简易媒体点播放程序 • §8.2ODBC类的编程基础 • §8.3多媒体数据库 • §8.4多媒体查询系统 • §8.5简易媒体点播放的开发
§8.1简易媒体点播系统 • 程序运行结果 • 程序运行演示 返回目录
媒体点播程序(续) 三大功能: 1. 数据记录的浏览 2. 实现SQL查询 3. 播放当前媒体记录 开发步骤: 首先介绍ODBC类的编程基础,再根据应用程序功能,结合知识点进行目标分解,分三步完成该系统的开发。 (1) 利用MFC提供的ODBC类,开发一个简易多媒体数据库系统odbc.exe,具有数据记录的编辑和浏览; (2) 修改odbc.exe, 开发一个简易多媒体查询系统odbcsql.exe; (3) 将第7章的媒体播放器与ODBCSQL.EXE进行整合,完善odbcsql程序, 编写一个简易媒体点播系统。 返回目录
§8.2 ODBC类的编程基础 8.2.1 ODBC的结构 8.2.3应用ODBC编程 8.2.4创建数据源 8.2.5在程序中注册数据源 返回目录
8.2.1 ODBC的结构 1. ODBC的结构: (1) 应用程序(Application) (2) ODBC管理器(ODBC Manage) (3) ODBC驱动程序(ODBC Drivers)(4) 数据源(Data Sources) 2. 编程模型 应用程序ODBC管理器ODBC驱动程序数据库 返回目录
8.2.3 应用ODBC编程 1. 使用ODBC类编程的一般步骤 (1) 连接数据源 (2) 创建并执行SQL语句 (3) 检查结果记录 (4) 断开数据源 转下页 返回目录
应用ODBC编程(续一) 2. 记录的基本操作 假设 CRecordSet *m_pSet; m_pSet = new CRecordSet(); • 增加记录 • 使用AddNew()函数增加记录,但要求数据库必须是以允许增加的方式打开,增加一条记录的关键语句如下: • m_pSet->AddNew();//增加记录 • …… //输入新的字段值 • m_pSet->Update();//将新记录存入数据库 • m_pSet->Requery()//重建记录集 返回目录
记录基本操作 -- 删除、修改 • 直接使用Delete()函数,并且在调用Delete()函数之后不需调用Update()函数: • m_pSet->Delete(); //删除记录 • m_pSet->Requery();//重建记录集 • 修改记录使用Edit()函数,关键语句如下: • m_pSet->Edit(); //修改当前记录 • …… //修改当前记录字段值 • m_pSet->Update();//将新记录存入数据库 • m_pSet->Requery()//重建记录集 返回目录
8.2.4 创建数据源(DSN) • 先准备一数据库文件 • 在控制面板中,用ODBC数据源管理器 参考教材( §8.2.4 ) 返回目录
8.2.5 在程序中注册数据源 • 注册数据源打开记录集的步骤 注册数据源的核心是调用::SQLConfigDataSource()函数注册数据源。 返回目录
§8.3 多媒体数据库 • 目标程序演示 • 程序的开发 • 关键技术核心代码 返回目录
目标程序介绍 多媒体数据库程序, 具有数据记录的编辑和浏览,如下图所示 返回目录
目标程序分析 1. 功能 数据记录的编辑和浏览 返回目录
程序开发—创建工程 返回目录 创建基于单文档界面(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所示。
程序开发—可视化设计 返回目录 在IDD_ ODBC_FORM对话框中,根据表8-1中的定义编辑对话框资源,设计完毕的对话框如图8-12所示。
程序开发—关联变量 返回目录 为了在浏览数据记录时,各编辑框显示当前记录对应字段,利用MFC ClassWizard为它们引入变量。 参照§8.3.3方法,为编辑控件引入变量其结果如下图所示。
程序开发—添加消息函数 返回目录 为“记录(R)”菜单下的记录移动菜单项添加消息响应函数: OnRecordFirst() OnRecordLast() OnRecordNext() OnRecordPrev() 为“添加记录” 、“删除记录”和“修改记录” 按钮添加消息响应函数: OnRecordAdd() OnRecordDel() OnRecordEdit()。
核心代码–创建并打开数据集 返回目录 void COdbcView::OnInitialUpdate() { …… //创建并打开数据集 try { m_pSet=new COdbcSet(); m_pSet->Open(); MyUpdateData(); } catch (CDBException* pe) { AfxMessageBox(pe->m_strError); pe->Delete(); } }
核心代码– 添加记录 返回目录 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();} }
核心代码– 删除记录 返回目录 void COdbcView::OnRecordDel() { try { m_pSet->Delete(); m_pSet->Requery(); MyUpdateData(); } catch (CDBException* pe) { AfxMessageBox(pe->m_strError); pe->Delete(); } }
核心代码–编辑记录 返回目录 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();} }
核心代码– 移动记录(一) 返回目录 为各记录移动消息响应函数添加如下代码: void COdbcView::OnRecordFirst() { m_pSet->MoveFirst();//移动记录集指针至第一条记录处 MyUpdateData (); //更新记录显示 } void COdbcView::OnRecordLast() { m_pSet->MoveLast();//移动记录集指针至最后一条记录处 MyUpdateData (); //更新记录显示 }
核心代码– 移动记录(二) 返回目录 为各记录移动消息响应函数添加如下代码: void COdbcView::OnRecordNext() { m_pSet->MoveNext();//移动指针至下一条记录处 MyUpdateData (); //更新记录显示 } void COdbcView::OnRecordPrev() { m_pSet->MovePrev();//移动指针至前一条记录处 MyUpdateData (); //更新记录显示 }
§8.4 多媒体查询系统 • 目标程序演示 • SQL查询简介 • 程序的开发 • 关键技术核心代码 返回目录
目标程序介绍 返回目录 与ODBC.EXE程序相比,有如下改进: ● 避开必须先注册数据源,在创建应用程序框架时选定数据源等限制,而是在应用程序中自动注册数据源,更具灵活性和适用性。 ● 添加了SQL查询功能,具有随心所欲查看、修改数据库中各种数据的灵活性。 程序演示
SQL查询简介 返回目录 常用的SQL查询语句如表所示
SQL查询语句举例 例1: SELECT从句的语法 SELECT 要检索的字段 FROM 要检索的表。 SELECT “Table1.ID”,”Table1.name”‘FROM Table1’ 返回目录
查询系统开发--创建工程 返回目录 创建一个基于单文档的工程,工程取odbcsql。特别注意的是:在MFC AppWizard Step 6 of 6对话框中,选取CFormView作为视类的基类,其目的是在视图类增加对话框,用于添加控件,操作与显示数据。如图8-17所示,其它每一步均接受缺省设置。
查询系统开发—界面设计 从IDD_ ODBCSQL_FORM对话框中,根据教材表8-4中的定义编辑对话框资源,设计完毕对话框如下图所示 返回目录
查询系统开发—给控件引入变量 用MFC ClassWizard为IDD_ODBCSQL_FORM对话框中的5个Edit Box控件和5个Static Text控件附上关联变量,如下图所示。 返回目录
查询系统开发—修改视图类 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; …… }; 返回目录
核心代码—读取数据表字段 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; } } 返回目录
核心代码—读取当前记录 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; } } } 返回目录
核心代码—注册数据源 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" ); …… } 返回目录
核心代码—读出字段名和记录 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); } } 返回目录
核心代码—记录跳转 1. 跳到第一条记录 void COdbcsqlView::OnRecordFirst() { m_set->MoveFirst(); ReadDispalyRecord(); UpdateData(false); } 2. 跳到最后一条记录 void COdbcsqlView::OnRecordLast() { m_set->MoveLast(); ReadDispalyRecord(); UpdateData(false); } 返回目录
核心代码—记录后移 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); } 返回目录
核心代码—记录前移 void COdbcsqlView::OnRecordPrev() { m_set->MovePrev(); if(m_set->IsEOF())m_set->MoveLast(); if(m_set->IsBOF())m_set->MoveFirst(); ReadDispalyRecord(); UpdateData(false); } 返回目录
核心代码—实现SQL查询 1.为查询条件编辑框IDC_EDIT_SQL引入变量 CString m_sql; 2.为“执行查询”按钮编写程序代码 返回目录
核心代码—实现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); } 返回目录
核心代码—断开数据源 返回目录 当结束程序时,必须关闭同数据库的连接,关闭记录集,删除记录集对象。其方法是: 添加事件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();//如打开记录集,则关闭记录集 }
§8.4 多媒体查询系统 • 目标程序演示 • SQL查询简介 • 程序的开发 • 关键技术核心代码 返回目录
目标程序介绍 与ODBC.EXE程序相比,有如下改进: ● 避开必须先注册数据源,在创建应用程序框架时选定数据源等限制,而是在应用程序中自动注册数据源,更具灵活性和适用性。 ● 添加了SQL查询功能,具有随心所欲查看、修改数据库中各种数据的灵活性。 返回目录
SQL查询简介 返回目录 常用的SQL查询语句如表所示
SQL查询语句举例 返回目录 例1: SELECT从句的语法 SELECT 要检索的字段 FROM 要检索的表。 SELECT “Table1.ID”,”Table1.name”‘FROM Table1’
查询系统开发--创建工程 返回目录 创建一个基于单文档的工程,工程取odbcsql。特别注意的是:在MFC AppWizard Step 6 of 6对话框中,选取CFormView作为视类的基类,其目的是在视图类增加对话框,用于添加控件,操作与显示数据。如图8-17所示,其它每一步均接受缺省设置。
查询系统开发—界面设计 返回目录 从IDD_ ODBCSQL_FORM对话框中,根据教材表8-4中的定义编辑对话框资源,设计完毕对话框如下图所示
查询系统开发—给控件引入变量 用MFC ClassWizard为IDD_ODBCSQL_FORM对话框中的5个Edit Box控件和5个Static Text控件附上关联变量,如下图所示。 返回目录
查询系统开发—修改视图类 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; …… }; 返回目录