MFV_ODBC数据库编程
MFC提供的ODBC数据库类
本文由yyqyea贡献 doc1。
MFC 提供的 ODBC 数据库类 Visual C++的 MFC 基类库定义了几个数据库类。
在利用 ODBC 编程时,经常要使用到 CDatabase(数据库类)、CRecordSet(记录集类)和 CRecordView(可视记录集类)。
CDatabase 类对象提供了对数据源的连接,通过它可以对数据源进行操作。
CRecordSet 类对象提供了从数据源中提取出的记录集。
CRecordSet 对象通常用于两种 形式:动态行集(dynasets)和快照集(snapshots)。
动态行集能与其他用户所做的更改保持同 步,快照集则是数据的一个静态视图。
每种形式在记录集被打开时都提供一组记录,所不同的 是,当在一个动态行集里滚动到一条记录时,由其他用户或应用程序中的其他记录集对该记 录所做的更改会相应地显示出来。
CRecordView 类对象能以控件的形式显示数据库记录,这个视图是直接连到一 个 CRecordSet 对象的表视图。
二、应用 ODBC 编程 应用 Visual C++的 AppWizard 可以自动生成一个 ODBC 应用程序框架,步骤是:打开 File 菜单的 New 选项,选取 Projects,填入工程名,选择 MFC AppWizard (exe),然后按 AppWizard 的提示进行操作。
当 AppWizard 询问是否包含数据库支持时,如果想读写数据库,那么选定 Database view with file support;如果想访问数据库的信息而不想写回所做的改变,那么选定 Database view without file support。
选好数据库支持之后,Database Source 按钮会被激活,选中它去调用 Data Options 对话 框。
在 Database Options 对话框中会显示出已向 ODBC 注册的数据库资源,选定所要操作的 数据库,如:Super_ES,单击 OK 后出现 Select Database Tables 对话框,其中列举了选中的数据 库包含的全部表;选择要操作的表后,单击 OK。
MFC关于ODBC数据库连接
UpdateData(TRUE); if(m_pSet->CanUpdate()) m_pSet->Update(); } void CODBCView::OnUpdateUpdateRecord(CCmdUI* pCmdUI) //刷新 记录集 { pCmdUI->Enable(!m_pSet->IsEOFarDomain() //清除域 { m_pSet->SetFieldNull(NULL); UpdateData(FALSE); }
if(!UpdateData()) return; pSet->Update(); } long m_lNewID=m_pSet->GetMaxID()+1;//获取新的ID值 m_pSet->AddNew(); //添加一个新记录 m_pSet->m___ID=m_lNewID; //设置新的ID标识 m_pSet->Update(); //保存新的记录 m_pSet->Requery(); //刷新数据库 m_pSet->MoveLast(); //游标移到最后一条记录 UpdateData(FALSE); //更新表单 }
long CODBCSet::GetMaxID() { MoveLast(); //移到最后一条记录 return m___ID; //返回该ID值 } void CODBCView::OnAddRecord() {CRecordset * pSet=OnGetRecordset();//获取指向数据库的指针 if(pSet->CanUpdate()&&!pSet->IsDeleted()) //确认对数据库的任何修 改均已保存 { pSet->Edit();
第17章 MFC ODBC编程
17.4.1 创建工程
下面列出的是创建通讯录应用程序的具体步骤: 下面列出的是创建通讯录应用程序的具体步骤:
17.4.2 系统主界面
CMFCODBCDlg是系统主界面类,主要实现了联系人信息 是系统主界面类, 是系统主界面类 的显示、删除、查询等功能。 的显示、删除、查询等功能。下面详细介绍 CMFCODBCDlg类的主要函数。函数 类的主要函数。 类的主要函数 函数OnInitDialog()为系 为系 统自动生成,主要是设置界面元素及变量的初始值, 统自动生成,主要是设置界面元素及变量的初始值,在 该函数中添加如下代码。 该函数中添加如下代码。
打开、 17.3.5 打开、关闭记录集
应用程序要使用自己的CRecordset派生类,应该首先创建一 派生类, 应用程序要使用自己的 派生类 个记录集对象,然后调用其Open()或OpenEx()函数来打 个记录集对象,然后调用其 或 函数来打 开记录集并执行记录查询。当记录集使用完后, 开记录集并执行记录查询。当记录集使用完后,应调用 此对象的Close()成员函数,以关闭记录集。调用 成员函数, 此对象的 成员函数 以关闭记录集。调用Close() 函数后,如果想再次打开记录集,可以调用Open()函数 函数后,如果想再次打开记录集,可以调用 函数 如果不再使用,则应删除此对象。 。如果不再使用,则应删除此对象。
17.3.8 修改记录
要修改在当前记录集中的一条记录,应遵循下列步骤: 要修改在当前记录集中的一条记录,应遵循下列步骤: 类的CanUpdate()成员函数判断 (1)首先调用 )首先调用CRecordSet类的 类的 成员函数判断 该记录集是否为可更新的。 该记录集是否为可更新的。 成员函数, (2)调用 )调用Move()或MoveNext()成员函数,直到滚动到要编 或 成员函数 辑的记录为止。 辑的记录为止。 成员函数, (3)调用 )调用Edit()成员函数,该函数起缓冲器的作用。 成员函数 该函数起缓冲器的作用。 (4)编辑记录各字段数据成员的值。 )编辑记录各字段数据成员的值。 成员函数, (5)调用 )调用Update()成员函数,刷新数据源中修改的记录。 成员函数 刷新数据源中修改的记录。 调用CancelUpdate()放弃当前修改。 放弃当前修改。 调用 放弃当前修改
MFC ODBC数据库访问技术
4)用CDatabase::ExecuteSQL()执行SQL语句
对于返回结果集的一般查询,使用CRecordset很容 易。然而,可以不用CRecordset执行不返回结果集 的SQL语句,而是通过调用CDatabase类的 CDatabase::ExecuteSQL()成员函数执行。其函数 原型如下:
MFC ODBC数据库访问技术
在Visual C++中,MFC封装的ODBC数据库 类包括CDatabase(数据库类)、 CRecordSet(记录集类)和CrecordView (记录视图类),更为用户提供了切实可行 的解决方案。
1.1 MFC的ODBC过程
使用MFC ODBC类访问数据库,主要有以下几个步 骤: 1.建立数据库 建立数据库就是用户根据自己的需要设计数据库中 的表及各表之间的依赖关系。要想设计一个完整的 数据库,首先必须了解数据库的基本知识。
void ExecuteSQL(LPCTSTR lpszSQL);
Throw(CEBException);
参数lpszSQL是一个带SQL语句字符串的指针。
的使用
CRecordset类派生于CObject类。虽然CDatabase类允许对一 个数据库执行SQL语句,但实际上是CRecordset 类提供了应 用程序与数据交互的实际操作。CRecordset类用来封装数据 库的查询,包括记录的插入、修改、删除等操作。
记录集对象一般都可以进行如下的操作:在 记录间滚动、更新记录并设定锁定模式、以 记录信进行过滤、限制对数据源可选记录的 选择、对记录排序、当完成操作后调用 Close()函数销毁对象等。
3.CRecordView类的使用
CRecordView类对象直接与CRecordset(记录 集)类对象连接,为该记录集提供显示的视图。 它是数据库操作的界面,提供了以下几个操 作:移动到第一个记录、下一个记录、前一 个记录、最后一个记录,还可以更新数据库 中当前视图所显示记录。
学生信息管理系统(MFC、VC、ODBC数据库)
用MFC做的一个学生信息管理系统,有增加、删除、排序、筛选功能,系统通过ODBC方式连接数据库。
由于文库不支持RAR,故需要完整的程序以及数据库可以联系俺,希望对大家有帮助。
下面是简单的报告:C++程序设计报告设计题目:学生信息管理系统班级:姓名:学号:指导教师:时间:2011年12月13日目录1.设计目标……………………………………………………………2.设计内容……………………………………………………………3.设计思想……………………………………………………………4.设计说明……………………………………………………………5.设计步骤……………………………………………………………6.软件演示……………………………………………………………7.感想总结……………………………………………………………学生信息管理系统(MFC)1.设计目标了解Windows应用程序的结构与DOS程序的不同,掌握应用MFC类库编写Windows应用程序的基本模式与用ODBC方式访问数据库。
2.设计内容以学生信息管理系统为例,通过对简单应用软件系统的设计,编制、调试,实现简单的增加、删除、排序等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。
3. 设计思想基于MFC库类对对话框界面的设计,通过创建类成员函数成员变量,编辑控件创建消息映射,调用消息函数完成数据的输入输出,实现相关功能。
生成简单的应用软件。
4.设计说明(1)包含的功能有:查看、增加、删除、排序、筛选等功能。
(2)通过access创建数据库并通过OD方式访问数据库。
(3)编辑界面上的不同按钮,创建消息映射,以完成相关的各种操作。
5.设计步骤1、创建数据库:打开access,并创建一个新表“student”,输入相关内容,选择类型。
并创建主键后。
完成后保存。
2、添加ODBC数据源打开“ODBC数据源管理器”添加选择| 建立类向导| 成员变量标签|class name列表下选CmySet(数据库的结果集)。
MFC_ODBC_数据库访问技术
MFC_ODBC_数据库访问技术16.2 MFC ODBC 数据库访问技术16.2.1概述ODBC是⼀种使⽤SQL的程序设计接⼝。
使⽤ODBC让程序的编写避免了与数据库相连的复杂性。
Studio为⼤多数标准的数据库格式提供了32位的ODBC驱动器,Paradox、ForPro、Excel、Oracle等。
如果⽤户需要⽤其他的数据库格式,⽤户需要相应的ODBC驱动以及DBMS。
MFC的ODBC类对较复杂的ODBC API进⾏了封装,提供了简化的调⽤接⼝,从⽽⼤⼤⽅便了数据库应⽤程序的开发。
程序员不必了解ODBC API和SQL的具体细节,利⽤ODBC类就可以完成对数据库的⼤部分操作。
MFC 的ODBC类主要包括如下5类:● CDatabase类:主要功能是建⽴与数据源地联接。
● CRecordset类:代表从数据源选择的⼀组记录(记录集)● CRecordView类:提供了⼀个表单视图与某个记录集直接相连,利⽤对话框数据交换机制(DDX)在记录集与表单视图的空间之间传输数据。
● CFieldExchange类:⽀持记录字段数据交换(DFX)应的的数据库的表的字段之间的数据交换。
● CDBException类:代表ODBC类产⽣的异常。
16.2.2使⽤MFC ODBC编程建⽴应⽤程序编程模型相对于使⽤ODBC API,使⽤MFC ODBC访问数据库简单得多,其步骤如下:●⾸先创建数据库并在系统中设置好;●使⽤CDatabase打开数据源的连接,如果利⽤AppWizard⽣成⼀个ODBC数据库应⽤程序,则会⾃动完成操作。
●使⽤ClassWizard想到加⼊由CRecordset类派⽣的⽤户记录集,完成对数据库表的绑定。
●创建记录积累对象,如果利⽤AppWizard⽣成⼀个ODBC数据库应⽤程序,则会⾃动在⽂档类中创建。
●使⽤记录集对象对数据库进⾏遍历、增加、删除、和修改等操作。
●使⽤CDatabase类的ExecuteSQL函数直接执⾏SQL命令。
MFC+ODBC
MFC ODBC 数据存取ODBC是一种流行的数据库访问方法. 应用程序先调用ODBC访问ODBC驱动器管理器.ODBC驱动器管理器再调用数据库ODBC驱动器,通过数据库ODBC驱动器访问数据库数据.ODBC统一访问接口的结果是每个ODBC应用程序都可以使用相同的数据库调用,完成对不同的数据库的访问.例如用ODBC访问Oracle和SQL Server数据库,不需改变ODBC应用程序调用数据源的代码,仅需改变ODBC中数据源的配置.这样一来,就避免了ODBC应用程序直接与数据源打交道.用ODBC访问多种数据库虽然ODBC提供了访问数据库的接口,但是直接使用ODBC API创建应用程序需要编制大量的代码.而MFC ODBC数据库类将ODBC API函数进行了封装,这大大简化了ODBC数据库开发的编程工作.MFC ODBC实际上使用的是一个简化的编程模型,程序员无须考虑底层的很多细节.MFC ODBC有许多函数,这些函数使得编写ODBC应用程序变得很容易.2 MFC ODBC的数据库类进行MFC ODBC数据库开发时,所需的基础工具就是MFC ODBC数据库类的使用.利用MFC ODBC开发就是利用MFC ODBC数据库类来操纵ODBC数据源. Visual C++的大多数ODBC访问是通过MFC来完成的.有两个常常用于访问ODBC数据的MFC类,它们是CDatabase 类和CRecordset 类.这两个类被封装在CObject MFC类中,如下图所示.对于MFC ODBC数据库类来说,CDatabase类对象表示一个同数据源的连接,而CRecordset对象代表从数据源中选择的一组记录的集合,也就是通常所说的记录集对象.2.1 CDatabase 类CDatabase 类表示一个同数据源的连接,是操作ODBC数据源的基础.下面介绍CDatabase 类中的比较重要的函数.2.1.1 OpenEx( )成员函数为了创建一个新的CDatabase,且将它与一个数据库连接,可以建立一个新的CDatabase 对象,并调用它的OpenEx( )成员函数.OpenEx( )成员函数的原形为:virtual BOOL OpenEx( LPCTSTR lpszConnectString, DWORD dwOptions =0);2.1.2 Open( )成员函数构造了CDatabase 对象后,也可以调用Open( )函数以建立到指定数据源的连接.Open ( )成员函数的原形为:virtual BOOL Open( LPCTSTR lpszDSN, BOOL bExclusive=FALSE, BOOL bReadOnly=FALSE,LPCTSTR lpszConnect="ODBC; ",BOOL bUseCursorLib=TRUE);2.1.3 Close( ) 成员函数调用该函数将断开与数据源的连接.Close( )成员函数的原形为:virtual void Close( );2.2 CRecordset 类CRecordset 类代表从数据源中选择的一组记录的集合,它是操作数据源的工具. CRecordset 类提供了应用程序与数据交互的实质. CRecordset 类用来封装对数据库的查询,包括添加、修改、删除行.要注意的是在应用程序中,一般不直接使用CRecordset 类,而是使用其派生类.如果你没有自己的派生类,就几乎不可能使用CRecordset 类对象.因为CRecordset 类为你派生出的类提供了一个框架,当使用MFC Class Wizard 产生一个CRecordset 类的派生类时,MFC Class Wizard会自动添加相应于数据库表中字段的成员变量,并自动重载CRecordset 类的成员函数DoFieldExchange( ),该函数通过使用RFX_函数来完成数据库字段与记录集字段数据成员变量的数据交换.下面介绍CRecordset 类中的比较常用的函数.2.2.1 CRecordset( )构造函数在开始处理一个记录集之前,需要构造一个新的CRecordset派生类的对象.CRecordset( )构造函数的原形为:CRecordset( CDatabase * pDatabase=NULL);其中pDatabase是指向CDatabase对象的指针,该CDatabase对象用来处理数据库.如果已经产生一个CDatabase对象,可以把CDatabase对象的指针传递给CRecordset 类的构造函数.另一方面,可把NULL传给CRecordset结构,这时,MFC使用被CRecordset:: GetDefaultConnect( )返回的连接字符串构建一个新的CDatabase对象且打开它.如果用MFC Class Wizard 产生一个CRecordset 类的派生类时,那么Class Wizard会在你选用的数据源的基础上重载GetDefaultConnect( )函数,这是一种有用的简捷方式,它不需要应用程序在构造自己的记录集之前构造并连接一个CDatabase对象.2.2.2 Open( )成员函数在构造了一个新的CRecordset对象后,调用该对象的Open( )成员函数以打开记录集.Open ( )成员函数的原形为:virtual BOOL Open(UNIT nOpenType=AFX_DB_USE_DEFAULT_TYPE,LPCTSTR lpszSQL=NULL,DWORD dwOptions=none);2.2.3 AddNew( )成员函数调用该函数为表中增加一条新记录作准备.AddNew( )成员函数的原形为:virtual void AddNew( );注意在加入一个新行之前,可以调用CRecordset::CanAppend( )简单查看该记录集对象是否允许添加新记录.接着调用CRecordset::AddNew( )创建一个新的空行,然后将记录集的成员变量设为想加入新行中的值.最后,必须调动CRecordset::Update( )成员函数来向数据库加入新行.2.2.4 Edit( )成员函数调用该函数以开始对当前记录的修改.Edit( )成员函数的原形为:virtual void Edit( );注意在修改当前记录时,可以调用CRecordset::CanUpdata( )查看记录集是否允许修改现有的行.接着调用CRecordset::Edit( )开始对当前记录行的修改过程,然后改变当前记录的成员变量值.最后,必须调动CRecordset::Update( )成员函数使数据库保存修改结果. 2.2.5 Delete( )成员函数调用该函数以删除当前记录.Delete( )成员函数的原形为:virtual void Delete( );注意在完成删除操作后,需要重新定位记录集,使用户仍然可以看到记录.一般重新定位记录集在下一条记录.2.2.6 Close( )成员函数调用该函数以关闭记录集对象,其原形为:virtual void Close( );3 开发MFC ODBC程序应用程序实例本例描述了运用MFC ODBC对数据库进行增加,修改和删除等操作的具体过程.1) 在应用程序中建立数据源.此时需要创建一个CDatabase对象,并使用其成员函数Open( )或OpenEx( )来建立该数据源的连接.如:CDatabase * pDb = new CDatabase; //建立CDatabase 对象pDb->OpenEx("DSN=test; UID=sa; PWD=123"); //打开数据源或pDb->Open("test", FALSE, FALSE,"ODBC;UID=sa;PWD=123",FALSE); //打开数据源2) 使用Class Wizard来创建CRecordset类的派生类CMyRecordset.3) 在应用程序中构造一个新的CRecordset派生类的对象.并向该对象发送一个指向要使用数据源的指针. 如:CMyRecordset * pRecordset=new CMyRecordset(pDb); //建立CRecordset 对象4) 调用CRecordset派生类的Open( )成员函数以打开记录集.如:pRecordset->Open(CRecordset::dynamic, //打开记录集"SELECT name,age FROM test", CRecordset::none);5) 利用CRecordset派生类的对象对数据库进行增加,修改和删除等操作.如:进行添加操作:if(pRecordset->CanAppend( )) //查看记录集对象是否允许添加新记录{pRecordset->AddNew(); //创建一个新的空行pRecordset->m_Name="Tom"; //新行的name列值pRecordset->m_Age=12; //新行的age列值pRecordset->Update(); //完成添加新行工作}进行修改操作:if(pRecordset->CanUpdate( )) //查看记录集对象是否允许更新{pRecordset->Edit(); //开始修改当前行pRecordset->m_Name="Marry"; //将当前行的name值改为"Marry"pRecordset->m_Age=14; //将当前行的age值改为14pRecordset->Update(); //完成修改当前行的工作}进行删除操作:pRecordset->Delete( ); //删除当前纪录pRecordset->MoveNext( ); //移动到下一条记录if( pRecordset->IsDeleted( )){pRecordset->MoveFirst( ); //如果最后一条记录被删除,则定位在第一条记录上}6) 当完成对数据源的操作后,调用Close( )函数关闭记录集和数据源连接.如:pRecordset->Close( ); //关闭记录集delete pRecordset; //释放记录集指针pDb->Close( ); //关闭数据源delete pDb; //释放数据源指针对多个记录集的操作与对单个记录集的操作类似,只是增加了CRecordset类的派生类.。
(完整版)ODBC编程培训教程
单击上图中的【添加】按钮后显示如下:
图2.3.1
从上图驱动列表中选择相应数据库产品的ODBC驱动,单击【完成】后显示如下(选择GBase ODBC3.51 Driver):
图2.3.2
依次填写正确的数据源信息,上图中的数据源名项用户可以自定,描述项内容可以忽略,服务器项是服务器端IP或主机名称,用户和密码为在数据库中已创建的用户名和密码,数据库项为服务器端的数据库名称一正确填写完上图中的所有项,。点击[测试],可以测试填写的信息是否正确,单击[确定]关闭此窗体,完成该数据库dsn项的配置。
B.ODBC中表达数据的类型
C. C语言中表达数据的类型
在程序运行过程中数据需要经历两次转换:C语言的数据或结构类型与ODBC的数据类型的转换,ODBC与SQL间数据类型的转换。所以ODBC所定义的数据类型起到了中间桥梁的作用,在ODBC的驱动程序调用自己的DBMS数据库访问接口时就需要对数据类型进行转换。我们所需要关注的是C语言的数据类型和ODBC数据类型间的转换关系。
ODBC编程培训教程
1
本文主要介绍ODBC的功能,所有内容都与ODBC 3.X版本兼容。大致包括:
使用ODBC进行数据库连接
利用ODBC直接执行SQL语句
ODBC光标类型介绍
利用滚动光标或非滚动光标进行结果集查询
SQL语句的准备执行方式
BLOB数据字段的查询和修改
ODBC对事务的支持
本文的数据库利用了GBase,ODBC在使用时是与数据库无关的所以所有例程都可以运行在其他数据库上,例如Oracle。只是有些sql语句的语法需要修改。
2
2.1
ODBC(Open Database Connectivity)是由微软公司提出的一个用于访问数据库的统一界面标准,随着客户机/服务器体系结构在各行业领域广泛应用,多种数据库之间的互连访问成为一个突出的问题,而ODBC成为目前一个强有力的解决方案。ODBC之所以能够操作众多的数据库,是由于当前绝大部分数据库全部或部分地遵从关系数据库概念,ODBC看待这些数据库时正是着眼了这些共同点。虽然支持众多的数据库,但这并不意味ODBC会变得复杂,ODBC是基于结构化查询语言(SQL),使用SQL可大大简化其应用程序设计接口(API),由于ODBC思想上的先进性,而且没有同类标准或产品与之竞争,因而越来越受到众多厂家和用户的青睐。目前,ODBC已经成为客户机/服务器系统中的一个重要支持技术。
VC++数据库编程之MFC+ODBC
VC++数据库编程之MFC+ODBC在vc中,使用ODBC连接是数据库有两种方法,第一种就是使用ODBC API,第二种就是使用MFC ODBC,在这里我只谈一下MFCODBC。
为了使数据库开发变得更方便,Microsoft对ODBC API进行的封装,使得我们开发数据库时可以直接使用MFC ODBC类:CDatabase:建立与数据源的连接 CRecordset:获取记录集CRecordView:提供一个表单视图与某个记录集直接相连,利用对话框数据交换机制(DDX)在记录集与表单视图的空间之间传输数据CFieldExchange:支持记录字段数据交换(DFX),即记录集字段数据成员与相应的数据库的表的字段之间的数据交换CDBException:ODBC的异常类一、在实际开发中,使用MFC ODBC类访问数据库步骤如下: a . 使用CDatabase类方法打开数据源:定义CDatabase对象m_db;调用其OpenEx方法打开数据源,OpenEx原型如下:virtual BOOL OpenEx( LPCTSTR lpszConnectString, DWORD dwOptions=0 );参数一为连接字串:如\为数据源名称,注意到如果为lpszConnectString传递NULL,则将出现数据源对话框,提示用户选择一个数据源。
参数二为打开方式,缺省值0表示以共享方式打开数据库,带有写访问,不装入ODBC 游标库DLL,并且只有在没有足够信息形成连接时显示ODBC连接对话框。
可选参数如下:CDatabase::openExclusive:此类库版本不支持。
为共享数据源总是打开的。
如果选定此选项,断言失败。
CDatabase::openReadOnly:以只读方式打开CDatabase::UseCursorLib 装入ODBC游标库DLL。
游标掩盖了基础ODBC驱动程序的一些功能,有效地阻止使用动态集(如果驱动程序支持它们)。
MFC_ODBC访问数据库
主要内容撒:的撒旦将ODBC API封装在类CDatabase、CRecordSet、CFieldExchange、CRecordView和CDBException中使用MFC ODBC开发数据库应用程序的一般步骤使用AppWizard访问数据库使用类CDatabase连接数据库使用类CRecordSet打开记录集、获取数据使用类CRecordSet的函数MoveFirst()、MoveLast()、MoveNext()、MovePrev()、IsBOF()和IsEOF()进行记录集的遍历使用类CRecordSet的函数AddNew和Update增加记录使用类CRecordSet 的函数Edit和Update修改记录使用类CRecordSet的函数Delete删除记录使用类CDatabase的函数ExecuteSQL直接执行SQL命令使用类CDatabase 的函数BeginTrans、CommitTrans和Rollback处理事务目录MFC OBDC技术 (3)概述 (3)CDatabase类操作数据源 (3)CFieldExchange类处理数据交换 (6)CRecordView类显示记录 (6)CDBException类处理异常 (7)使用MFC ODBC编程建立应用程序 (7)MFC ODBC编程模型概述 (7)通过AppWizard建立数据库应用程序 (8)使用CDatabase类方法打开数据源 (8)使用CRecordste类打开记录集 (10)绑定记录集 (12)参数化记录集和查询 (13)遍历记录集合 (15)书签定位和绝对定位 (16)获取记录集的数据 (18)添加记录 (19)删除记录 (21)修改记录 (21)直接执行SQL语句(增加、删除表等) (22)事务处理 (23)使用多记录集 (25)MFC OBDC技术概述MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简化的调用接口。
VISUAL C++中用MFC ODBC操作ACCESS数据库
本实例是某项目中的一部分,目的是实现MFC ODBC数据库与Access数据表格之间的相互操作。
包括用Visual C++中的MFC ODBC技术实现对Access数据表格的内容的显示、添加、修改和删除的功能。
1、ODBC数据源的创建笔者使用的操作系统为Windows XP,工具是Visual C++6.0。
此例中建立的Access表格取名为“plc”。
在“控制面板”中双击“管理工具”图标,然后在新出现的窗口中双击“数据源(ODBC)”,在弹出的对话框中选中“用户DSN”中的“dBASE Files”,单击“添加”按钮,从弹出的对话框中选中“Microsoft Access Driver(*.mdb)”。
单击“完成”后,将弹出一个新的对话框,在数据源名及说明后的编辑框中填入表格名“plc”。
在命名数据源之后,需要把它连接到一个数据库。
单击“选择”,如图1所示,得到存储在数据目录中plc.mdb的拷贝文件,选中之,单击“确定”关闭此对话框。
然后单击“确定”,完成数据源的创建。
2、使用AppWizard创建一个数据库应用程序笔者开始从AppWizard开始创建一个新的MFC AppWizard(exe)项目。
命名为Jh,然后遵从以下步骤:1)在MFC AppWizard第一步对话框中,选择“单个文档”。
2)在MFC AppWizard第二步对话框中,选择“查看数据库不使用文件支持”,再单击“Data Source”。
3)在RecordSet Type组框中,选择Dynaset。
在Data Source组框中,单击ODBC单选按钮,然后从下拉列表中选择plc,如图2所示,单击ok,在弹出的新的对话框中选中message,即为本项目所要操作的表。
以后几步接收缺省值,单击“完成”即可。
至此,已创建一个应用程序,并且在程序中自行生成一个数据源和数据源中的一个表的相关程序,其程序清单如下:以下是代码片段:class CJhSet:public Crecordset//基于CRecordset的CjhSet新类{public:CJhSet(CDatabase*pDatabase=NULL);DECLARE_DYNAMIC(CJhSet)//Field/Param Data//{{AFX_FIELD(CJhSet,CRecordset)//对应表中一些被绑定字段的变量CString m_baudrate;CString m_type;CString m_unit;CString m_number;CString m_address;CString m_istart;CString m_iend;CString m_ostart;CString m_oend;//}}AFX_FIELD//Overrides//ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CJhSet)public:virtual CString GetDefaultConnect();//返回被连接的数据源名称virtual CString GetDefaultSQL();//返回数据源中所选表名称virtual void DoFieldExchange(CFieldExchange*pFX);//RFX support//}}AFX_VIRTUAL//Implementation#ifdef_DEBUGvirtual void AssertValid()const;virtual void Dump(CDumpContext&dc)const;#endif};3、实现程序的显示记录的功能一旦AppWizard完成编写这些文件,它将启动对话框编辑器,这样就可以设计自己的表单了。
VC数据库编程之MFC ODBC连接
VC数据库编程之MFC ODBC连接VC数据库编程的方法有很多,下面介绍MFC ODBC连接的方法。
MFC ODBC是MFC对ODBC进行的封装,以简化对ODBC API的调用,从而实现面向对象的数据库编程接口.MFC ODBC的封装主要开发了CDatabase类和CRecordSet类(1) CDatabase类CDatabase类用于应用程序建立同数据源的连接。
CDatabase类中包含一个m_hdbc变量,它代表了数据源的连接句柄。
如果要建立CDatabase类的实例,应先调用该类的构造函数,再调用Open函数,通过调用,初始化环境变量,并执行与数据源的连接。
在通过Close函数关闭数据源。
CDatabase类提供了对数据库进行操作的函数及事务操作。
(2) CRecordSet类CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,以实现对数据集的数据操作。
CRecordSet类的成员变量m_hstmt代表了定义该记录集的SQL语句句柄,m_nFields为记录集中字段的个数,m_nParams为记录集所使用的参数个数。
CRecordSet的记录集通过CDatabase实例的指针实现同数据源的连接,即CRecordSet的成员变量m_pDatabase.MFC ODBC编程更适合于界面型数据库应用程序的开发,但由于CDatabase类和CRecordSet类提供的数据库操作函数有限,支持的游标类型也有限,限制了高效的数据库开发。
在编程层次上属于高级编程。
应用实例:1.打开数据库CDatabase database;database.OpenEx( _T( "DSN=zhuxue" ),CDatabase::noOdbcDialog);//zhuxue 为数据源名称2.关联记录集CRecordset recset(&database);3.查询记录CString sSql1="";sSql1 = "SELECT * FROM tablename" ;recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly); int ti=0;CDBVariant var;//var可以转换为其他类型的值while (!recset.IsEOF()){//读取Excel内部数值recset.GetFieldValue("id",var);jiangxiang[ti].id=var.m_iVal;recset.GetFieldValue("name", jiangxiang[ti].name);ti++;recset.MoveNext();}recset.Close();//关闭记录集4.执行sql语句CString sSql="";sSql+="delete * from 院系审核";//清空表database.ExecuteSQL(sSql);sSql也可以为Insert ,Update等语句5.读取字段名sSql = "SELECT * FROM Sheet1" ; //读取的文件有Sheet1表的定义,或为本程序生成的表.// 执行查询语句recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);int excelColCount=recset.GetODBCFieldCount();//列数CString excelfield[30];//得到记录集的字段集合中的字段的总个数for( i=0;i {CODBCFieldInfo fieldinfo;recset.GetODBCFieldInfo(i,fieldinfo);excelfield[i].name =fieldinfo.m_strName;//字段名}6.打开excel文件CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动CString sSql,sExcelFile; //sExcelFile为excel的文件路径TRY{// 创建进行存取的字符串sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CRE ATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);// 创建数据库 (既Excel表格文件)if( database.OpenEx(sSql,CDatabase::noOdbcDialog) ){//可以把excel作为一个数据库操作}}catch(e){TRACE1("Excel驱动没有安装: %s",sDriver); AfxMessageBox("读取失败,请检查是否定义数据区Sheet1"); }。
实验15 ODBC数据库编程
实验内容对于大量数据处理,采用数据库更为安全、简便。
例如,对于学生成绩管理系统,常常需要处理学生的基本信息、课程成绩以及与学生相关的院系、专业情况等,这些信息用数据库表的形式来描述更为清晰。
本次实验按教程来练习MFCODBC 数据库编程过程。
实验准备和说明(1)在教程第8章“MFCODBC 应用编程”讲授后进行本次实验。
(2)复习教程相关内容。
实验步骤1.创建工作文件夹打开计算机,在“D:\V isual C++程序\Li Ming”文件夹中创建一个新子文件夹“实验15”。
2.创建数据库和数据表这里以 Microsoft Access2003为例说明数据库和数据表的创建过程。
(1)启动MicrosoftAccess2003。
(2)选择“文件”→“新建”菜单,在右边任务窗格中单击“空数据库”,弹出一个对话框,将文件路径指定到“D:\V isual C++程序\LiMing\实验15”,指定数据库名student.mdb 。
单击“创建”按钮,出现如图T15.1所示的“数据库设计”窗口。
(3)双击“使用设计器创建表”,出现表设计界面。
按如表T15.1所示的学生课程成绩表(score)结构添加字段名和数据类型,其结果如图T15.2所示。
表T15.1 学生课程成绩表(score)结构序号字段名称数据类型字段大小小数位字段含义1 studentno 文本8 学号2 course 文本7 课程号3 score 数字单精度 1 成绩4 credit 数字单精度 1 学分(4)选择“文件”→“保存”,弹出保存对话框,将刚才设计的表T15.1命名为score,单击“确定”按钮,出现一个消息对话框,询问是否要创建一个主键,单击“否” 按钮。
(5)关闭表设计器,双击数据库双击窗口中的score表,在score表中添加如图T15.3所以的记录,便于以后的测试。
(6)关闭Microsoft Access 2003.3.创建ODBC 数据按教程步骤进行4.在MFCAppWizard中选择数据在MFCAppWiazard中选择数据源的具体步骤如下。
MFC用ODBC方法连接mysql
VS2010 MFC用ODBC方法连接MYSQL教程1.安装mysql(已安装完的同学可以直接跳过这一步)既然要连接mysql,我们当然要安装mysql,这里附一个链接,下载最新版本的mysql:/downloads/mysql/,下载完之后就需要配置环境变量,按照下面的方法来将mysql路径添加到mysql环境变量中:右键,点击“我的电脑”-“属性”-“高级”-“环境变量”-“系统变量”-新建,变量名为MYSQL_HOME,然后变量值输入你的mysql安装中bin文件的路径,例如我的安装路径为:D:\InsInEnglish\MySQL\mysql-5.6.16-win32\mysql-5.6.16-win32\bin,截图如下:之后再系统变量中的path变量下添加我们刚刚新建的变量(MYSQL_HOME),形式为:%MYSQL_HOME%;注意不能少了百分号和后面的分号,到此,配置完成,然后点击确定。
截图如下:添加完毕之后,打开到你mysql安装的目录下bin目录下,里面有一个mysqlld.exe的可执行文件,点击执行,之后再打开cmd命令行,输入:mysql–u –p之后按回车键,配置成功的截图如下:2.建立数据库(已经建立好数据库的同学可以跳过这一步)建立数据库用sql语言显然是繁琐的,但是如果有了mysql workbench,做数据库就方便多了,附上mysql workbench的下载地址:/downloads/tools/workbench/下载之后安装,推荐和mysql 安装在同一个文件中,方便使用和管理,然后打开mysql,界面如下:左上角MySQL Connections中有个“+”的图标,点击这个图标,即新建连接,之后输入连接的名字-Test,如果要输入密码,就输入一个密码,然后点击确定,就会出现上图中名字为Test的一个连接,单击之后进入这个连接。
如下图所示:我们看到左下角有英文SCHEMAS,下面可以看到我们创建的数据库,我用的是大写的Test,到了这里面,系统自动改过来了,名字是test,如下图:Test里面可以看到Tables,右键单击,选择Creat tables,这样就可以创建表了,我创建了一个表,user,之后设置主键(PK),not null (NN)等等,之后点击apply(应用),表示建立这个表,系统会给你看相应的sql语言,点击apply,然后可以看到Tables下面已经有了user这个表了。
MFC数据库ODBC增加、删除、改、查询操作
航班订票系统MFC数据库ODBC增加,删除,改,查询操作void CMyView::OnBtnAdd(){// TODO: Add your control notification handler code hereCAddDialog dlg;if(dlg.DoModal()==IDOK){if(dlg.m_arrive_city.IsEmpty()||dlg.m_arrive_time.IsEmpty()||dlg.m_body_id.IsEmpty()||dlg.m_book_person_name.IsEmpty()|| dlg.m_date.IsEmpty()||dlg.m_hbh.IsEmpty()||dlg.m_lanch_time.IsEmpty()||dlg.m_seat_level.IsEmpty()||dlg.m_start_city.IsEmpty() ){AfxMessageBox("有信息未填写,请填写完毕!");}else{m_pSet->AddNew();m_pSet->m_arrive_city=dlg.m_arrive_city;m_pSet->m_arrive_time=dlg.m_arrive_time;m_pSet->m_body_id=dlg.m_body_id;m_pSet->m_date=dlg.m_date;m_pSet->m_dingpiaoren=dlg.m_book_person_name;m_pSet->m_hbh=dlg.m_hbh;m_pSet->m_lanch_time=dlg.m_lanch_time;m_pSet->m_seat_level=dlg.m_seat_level;m_pSet->m_start_city=dlg.m_start_city;m_pSet->Update();m_pSet->Requery();AfxMessageBox("订票成功!");UpdateData(false);}}/* if(dlg.DoModal()==IDOK){if(dlg.m_addnum.IsEmpty()||dlg.m_addpsw.IsEmpty()){}m_pSet->AddNew();m_pSet->m_column1 = dlg.m_addnum;m_pSet->m_column2 = dlg.m_addpsw;m_pSet->Update();m_pSet->Requery();AfxMessageBox("已经添加"+dlg.m_addnum+"密码为"+dlg.m_addpsw); UpdateData(false); */}//DEL void CMyView::OnBtnAsure()//DEL {//DEL // TODO: Add your control notification handler code here//DEL//DEL }void CMyView::OnBtnChange(){// TODO: Add your control notification handler code hereCAddDialog dlg;dlg.m_arrive_city=m_pSet->m_arrive_city;dlg.m_arrive_time=m_pSet->m_arrive_time;dlg.m_body_id=m_pSet->m_body_id;dlg.m_date= m_pSet->m_date;dlg.m_book_person_name= m_pSet->m_dingpiaoren;dlg.m_hbh= m_pSet->m_hbh;dlg.m_lanch_time=m_pSet->m_lanch_time;dlg.m_seat_level=m_pSet->m_seat_level;dlg.m_start_city=m_pSet->m_start_city;if(dlg.DoModal()==IDOK){if(dlg.m_hbh.IsEmpty()||dlg.m_book_person_name.IsEmpty()){AfxMessageBox("航班号,乘客姓名,身份证,不能为空!");}else{m_pSet->Edit();m_pSet->m_arrive_city=dlg.m_arrive_city;m_pSet->m_arrive_time=dlg.m_arrive_time;m_pSet->m_body_id=dlg.m_body_id;m_pSet->m_date=dlg.m_date;m_pSet->m_dingpiaoren=dlg.m_book_person_name;m_pSet->m_hbh=dlg.m_hbh;m_pSet->m_lanch_time=dlg.m_lanch_time;m_pSet->m_seat_level=dlg.m_seat_level;m_pSet->m_start_city=dlg.m_start_city;m_pSet->Update();m_pSet->Requery();AfxMessageBox("已经修改票成功!");UpdateData(false);}}}void CMyView::OnBtnRollBack(){// TODO: Add your control notification handler code hereif(AfxMessageBox("真的要退票吗",MB_OKCANCEL)==IDCANCEL) return;else{if(m_pSet->IsEOF()){AfxMessageBox("没有票可以退?");}else{m_pSet->Delete();if(m_pSet->IsEOF())m_pSet->MoveLast();else m_pSet->MoveNext();m_pSet->Requery();UpdateData(false);AfxMessageBox("退票成功!");}}}void CMyView::OnBtnSearchInfo(){// TODO: Add your control notification handler code here/* CDlgQuery Dlgquery;CString value;if(Dlgquery.DoModal()==IDOK){value="职工编号=+"+Dlgquery.m_query+"";m_pSet->m_strFilter=value;m_pSet->Requery();UpdateData(FALSE);}*/CSearchDlg search;CString str;if(search.DoModal()==IDOK){// str="订票人="+search.m_C_NAME+"and 身份证号="+search.m_C_SFZ+""; /* str.Format("订票人=%s and 身份证号=%s",search.m_C_NAME,search.m_C_SFZ);m_pSet->m_strFilter=str;m_pSet->Requery();UpdateData(FALSE);*//* m_pSet->m_strFilter="订票人=? and 身份证号= ?";m_pSet->m_dingpiaoren=search.m_C_NAME;m_pSet->m_body_id=search.m_C_SFZ;*/str.Format("身份证号= %s%s%s","'",search.m_C_SFZ,"'");m_pSet->m_strFilter=str;m_pSet->Requery();UpdateData(FALSE);}}。
odbc编程
odbc编程ODBC编程是一种常用的数据库访问方式,它提供了一种标准的接口,使得不同的应用程序可以通过相同的方式来访问不同的数据库。
本文将介绍ODBC编程的基本概念、使用方法以及一些常见的应用场景。
一、ODBC编程的基本概念ODBC全称为Open Database Connectivity,它是一种应用程序接口(API),用于访问各种数据库的标准。
通过ODBC,应用程序可以使用统一的方式来连接、查询和更新数据库。
ODBC的核心概念包括数据源、数据源名称(DSN)、驱动程序和连接。
1. 数据源(Data Source):数据源是指数据库的名称或位置,可以是本地的数据库文件,也可以是远程的数据库服务器。
在ODBC中,数据源可以用一个字符串来表示,比如一个文件路径或一个网络地址。
2. 数据源名称(Data Source Name,DSN):DSN是一个标识符,用于标识一个具体的数据源。
它包含了连接数据库所需的信息,比如数据库的类型、地址、用户名和密码等。
在ODBC编程中,我们可以通过DSN来连接数据库,而不需要关心具体的数据库类型和连接细节。
3. 驱动程序(Driver):驱动程序是ODBC的核心组成部分,它负责实际连接数据库并执行相应的操作。
不同的数据库类型通常需要不同的驱动程序来进行连接和操作。
在ODBC编程中,我们需要根据数据库类型选择合适的驱动程序。
4. 连接(Connection):连接是指应用程序与数据库之间建立的通信通道。
在ODBC编程中,我们首先需要建立一个连接,然后才能进行后续的查询和更新操作。
连接可以通过DSN来建立,也可以直接指定连接参数。
二、ODBC编程的使用方法ODBC编程主要包括以下几个步骤:加载驱动程序、建立连接、执行SQL语句、处理结果和关闭连接。
下面我们将分别介绍这些步骤的具体实现。
1. 加载驱动程序:在使用ODBC编程之前,我们首先需要加载相应的驱动程序。
驱动程序通常是一个动态链接库(DLL)文件,我们可以使用系统提供的函数来加载和卸载它。
mfc odbc 编程
MFC (Microsoft Foundation Classes) 是一种微软开发的跨平台应用程序框架,用于创建Windows 下的客户端和服务器应用程序。
ODBC (Open Database Connectivity) 是微软的开放数据库连接标准,允许应用程序与各种数据库连接。
在MFC 中使用ODBC 进行数据库编程是一个常见的做法。
以下是一个简单的步骤来实现MFC ODBC 编程:1. **设置ODBC 数据源**:在Windows 系统中,你需要首先设置ODBC 数据源,这将告诉应用程序如何与数据库连接。
2. **创建MFC 应用程序**:使用MFC 创建一个应用程序,你可以选择一个MFC 模板,例如"MFC ODBC AppWizard" 模板。
3. **连接到ODBC 数据源**:在你的MFC 应用程序中,你可以使用`CDatabase` 类来连接到ODBC 数据源。
例如:```cpp// 初始化ODBC 库CODBC::Initialize();// 连接到ODBC 数据源CDatabase db;if (!db.Open(NULL, // 默认ODBC 数据源"Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\my.mdb", // 数据库路径CDatabase::modeReadOnly)) // 只读模式{// 处理连接错误}```4. **执行查询和更新**:一旦你连接到数据库,你可以执行查询和更新。
例如:```cpp// 查询数据CRecordset rs(&db);if (!rs.Open(CRecordset::forwardOnly, "SELECT * FROM myTable")){// 处理查询错误}else{// 处理查询结果while (!rs.IsEOF()){// 处理每一行数据rs.MoveNext();}}// 更新数据CString query = "UPDATE myTable SET myField = 'new value' WHERE someField = 1";db.ExecuteSQL(query);```5. **处理错误和异常**:在数据库编程中,错误和异常处理是非常重要的。
数据库编程-ODBC
7.2
ODBC
1.CDatabase类 CDatabase对象表示到一数据源的连接,通过 该连接可以操作数据源。要使用CDatabase,需先 构造CDatabase 对象,并调用它的Open成员函数 ,打开一个连接。然后构造CRecordset对象用于 操作所连接的数据源,向CDatabase对象传递记录 集构造函数指针。完成时调用Close成员函数并销 毁CDatabase对象。成员函数Close关闭以前没有 关闭的任何记录集。
⑶ 参数化的方式不同。ODBC使用宏和枚举来定义可用的选项,而 DAO使用定义的常量。 ⑷ ODBC可以用于多种不同的数据库,而DAO只适用于少数几种数据 库。 ⑸ 在ODBC中,CDatabase类对象是直接与数据源打交道的;而在 DAO中,CDaoRecordset类对象和CDaoDatabase类对象之间有一 个CDaoWorkspace类对象存在,这使得DAO可以同时和多个数据 库对象处理事务。
更新操作: void CMyodbcView::OnRecordUpdate() { m_pSet->Edit(); UpdateData(TURE); If(m_pSet->CanUpdate()) { m_pSet->Update(); } } 重载虚函数OnMove:
程序运行过程中,当用户移动一个数据库记录时,将调用函 数CRecordset::OnMove更新数据库。重载该函数主要是为了保 存新增加的记录
排
序
CRecordSet类中有一个数据成员m_strSort,封装了SQL的 ORDER BY的功能,可以通过设置数据成员排序。 void CMyvc81View::OnSortLength() { m_pSet->Close();//关闭记录集 m_pSet->m_strSort="LENGTH"; m_pSet->Open();//创建新的记录集,并打开 UpdateData(FALSE); }
MFC_ODBC_编程
图6-1 ODBCDemo2实例应用程序的运行界面6.3.2 实例实现过程数据库设计我们利用Microsoft Access工具设计本实例的数据库结构。
在本实例里,我们需要利用数据库存放销售公司的如下信息:日常销售信息:指公司日常销售帐单中的客户信息、雇员信息、订购日期、货主信息、运货商信息。
产品信息:指公司现经营产品的产品名称、供应商信息、类别信息、单价以及库图6-2 工程创建向导选择应用程序的框架类型。
单击“工程创建向导”窗口的OK按钮,进入“ Step 1”对话框。
首先选择应用程序的框架类型。
如图6-3所示。
Single document”,保持资源的语言类型为“中文”,单击“Next >”按钮。
图6-3 选择应用程序的框架类型MFC AppWizard – Step 2 of 6”对话框,设置应用程序数据库特性。
在对话框6-4所示。
设置应用程序对复杂文档的支持。
在“MFC AppWizard – Step 2 of 6”按钮,进入“MFC AppWizard – Step 3 of 6”对话框。
在对话框里选择如下两ActiveX Controls图6-4 设置应用程序数据库特性所示,单击“Next >”按钮。
图6-5 设置应用程序对复杂文档的支持MFC AppWizard – Step 4 of 6”对话框,设置应用程序的特征信息。
如图所示对话框是工程的特征信息,在本例中,ODBCDemo2工程有如下特征:Docking toolbarInitial statusbarPrinting and print preview3D controlsAppWizard –Step 4 of 6”对话框里单击“Next >”按钮,进入“ Step 5 of 6”对话框,选择工程风格和MFC类库的加载方式。
在对话框里设MFC Standard图6-7 设置应用程序特征信息图6-8 选择工程风格和MFC类库的加载方式MFC AppWizard – Step 6 of 6”对话框显示工程创建中的类信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十ODBC数据库编程一、实验目的:1.学习VC++6.0中MFC应用程序的运用。
2.学习、运用ODBC数据库编程。
二、实验环境:一台PC机VC++6.0、Windows xp或Windows 7操作系统三、实验内容:创建一个基于CListView的单文档应用程序Ex_ODBC,用来操作ODBC源,“用于MFC ODBC的数据库”中指定数据库的score表。
初始时列表中以报表样式显示出score表当前的记录内容。
单击“操作”顶层菜单的下拉项“添加”、“修改”及“删除”可对score表进行相应操作,必要时还弹出“课程成绩信息”对话框四、实验记录1.创建数据库,在sql server2005创建数据库并创建一个score的表:2.在计算机中添加一个名为mystudent的ODBC数据源。
3.创建一个基于CListView的单文本运用程序,命名为Ex_ODBC。
4.在stdaf.h中文件中添加ODBC数据库支持的头文件包含#include <afxdb.h>,在MFC ClassWizard为数据库中的表score添加CRecordset的派生类CScoreset作为表score的映射类。
5.在Menu中添加“操作”顶层菜单,并在其下添加“添加”、“删除”、“修改”菜单项,命名ID。
6. 在CEx_ODBCView::PreCreateWindow函数初始视图,添加代码如下:BOOL CEx_ODBCView::PreCreateWindow(CREATESTRUCT& cs){cs.style|=LVS_REPORT;return CListView::PreCreateWindow(cs);}7.在CEx_ODBCView::OnInitialUpdate函数中添加下列代码:void CEx_ODBCView::OnInitialUpdate(){CListView::OnInitialUpdate();CListCtrl &m_ListCtrl=GetListCtrl();m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);CScoreSet cSet;cSet.Open();CODBCFieldInfo field;for(UINT i=0;i<cSet.m_nField;i++){cSet.GetODBCFieldInfo(i,field);m_ListCtrl.InsertColumn(i,field.m_strName,LVCFMT_LEFT,100);} cSet.Close();UpdateListItemData();}8.在CEx_ODBCView类中添加显示score表的成员函数UpdateListItemData:void CEx_ODBCView::UpdateListItemData(){CListCtrl&m_ListCtrl=GetListCtrl();m_ListCtrl.DeleteAllItems();CScoreSet cSet;cSet.m_strSort="studentno,courseno";cSet.Open();int nItem=0;CString str;while(!cSet.IsEOF()){for(UINT i=0;i<cSet.m_nFields;i++){cSet.GetFieldValue(i,str);if(i==0) m_ListCtrl.InsertItem(nItem,str);else m_ListCtrl.SetItemText(nItem,i,str);}nItem++;cSet.MoveNext();}cSet.Close();}8.为“添加”菜单项添加映射函数OnOpAdd()添加代码:void CEx_ODBCView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult){CListCtrl&m_ListCtrl=GetListCtrl();POSITION pos ;pos=m_ListCtrl.GetFirstSelectedItemPosition();if(pos==NULL){MessageBox("应双击要修改的列表项");return;}int nItem=m_ListCtrl.GetNextSelectedItem(pos);CString strStuNO=m_ListCtrl.GetItemText(nItem,0);CString strCourseNO=m_ListCtrl.GetItemText(nItem,1);CScoreset sSet;sSet.m_strFilter.Format("studentno='%s' AND courseno='%s'",strStuNO,strCourseNO);sSet.Open();CScoreDlg dlg;dlg.m_strCourseNO=sSet.m_courseno;dlg.m_strStuNO=sSet.m_studentno;dlg.m_fScore=sSet.m_score;dlg.m_fCredit=sSet.m_credit;if(IDOK!=dlg.DoModal()){if(sSet.IsOpen())sSet.Close();return;}sSet.Edit();sSet.m_score=dlg.m_fScore;sSet.m_credit=dlg.m_fCredit;sSet.Update();sSet.Requery();if(sSet.IsOpen())sSet.Close();MessageBox("当前只能修改成绩和学分,修改成功");UpdateListItemData();*pResult = 0;}void CEx_ODBCView::OnOpAdd(){CScoreDlg dlg;if(dlg.DoModal()==IDOK){CScoreset cSet;cSet.m_strFilter.Format("studentno='%s' AND courseno='%s'",dlg.m_strStuNO,dlg.m_strCourseNO);cSet.Open();if(!cSet.IsEOF()){MessageBox("有相同的记录存在");cSet.Close();return ;}cSet.AddNew();cSet.m_studentno=dlg.m_strStuNO;cSet.m_courseno=dlg.m_strCourseNO;cSet.m_score=dlg.m_fScore;cSet.m_credit=dlg.m_fCredit;cSet.Update();cSet.Requery();cSet.Close();MessageBox("记录已添加");UpdateListItemData();}}9.为“删除”菜单项添加映射函数OnOpDel()添加代码:void CEx_ODBCView::OnOpDel(){CListCtrl & m_ListCtrl=GetListCtrl();POSITION pos;pos=m_ListCtrl.GetFirstSelectedItemPosition();if(pos==NULL){MessageBox("你还没有选中列表项");return;}int nItem=m_ListCtrl.GetNextSelectedItem(pos);CString strItem,str;strItem=m_ListCtrl.GetItemText(nItem,0);str.Format("你确定要删除 %s 列表项(记录)吗?",strItem);if(IDOK!=MessageBox(str,"删除确认",MB_ICONQUESTION|MB_OKCANCEL))return;CString strStuNO=m_ListCtrl.GetItemText(nItem,0);CString strCourseNO=m_ListCtrl.GetItemText(nItem,1);CScoreset infoSet;infoSet.m_strFilter.Format("studentno='%s' AND courseno='%s'",strStuNO,strCourseNO);infoSet.Open();if(!infoSet.IsEOF()){CRecordsetStatus status;infoSet.GetStatus(status);infoSet.Delete();if(status.m_lCurrentRecord==0) infoSet.MoveNext();else infoSet.MoveFirst();}if(infoSet.IsOpen()) infoSet.Close();MessageBox("当前指定的记录已删除");UpdateListItemData();}10.为Ex_ODBCView添加NM_DBLCLK映射函数,为修改功能,实现代码如下:void CEx_ODBCView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult){CListCtrl&m_ListCtrl=GetListCtrl();POSITION pos ;pos=m_ListCtrl.GetFirstSelectedItemPosition();if(pos==NULL){MessageBox("应双击要修改的列表项");return;}int nItem=m_ListCtrl.GetNextSelectedItem(pos);CString strStuNO=m_ListCtrl.GetItemText(nItem,0);CString strCourseNO=m_ListCtrl.GetItemText(nItem,1);CScoreset sSet;sSet.m_strFilter.Format("studentno='%s' AND courseno='%s'",strStuNO,strCourseNO);sSet.Open();CScoreDlg dlg;dlg.m_strCourseNO=sSet.m_courseno;dlg.m_strStuNO=sSet.m_studentno;dlg.m_fScore=sSet.m_score;dlg.m_fCredit=sSet.m_credit;if(IDOK!=dlg.DoModal()){if(sSet.IsOpen())sSet.Close();return;}sSet.Edit();sSet.m_score=dlg.m_fScore;sSet.m_credit=dlg.m_fCredit;sSet.Update();sSet.Requery(); if(sSet.IsOpen())sSet.Close();MessageBox("当前只能修改成绩和学分,修改成功");UpdateListItemData();*pResult = 0;}11.运行测试程序:五、思考题:(1)上述表score的记录操作与对话框中的数据是如何一一对应的?例如说出记录添加的完整过程。