Visual C++上ODBC编程实例
microsoft developer studio为大多数标准的数据库格式提供了32位odbc驱动器。这些标准数据格式包括有:sql server、access、paradox、dbase、foxpro、excel、oracle以及microsoft text。如果用户希望使用其他数据格式,则需要安装相应的odbc驱动器及dbms。
用户使用自己的dbms数据库管理功能生成新的数据库模式后,就可以使用odbc来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关odbc的联机帮助。
一、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。在选定了数据库和数据表之后,就可以按照惯例继续进行appwizard操作。
特别需要指出的是:在生成的应用程序框架view类(如:csuper_esview)中,包含一个指向csuper_esset对象的指针m_pset,该指针由appwizard建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。
要使程序与数据源建立联系,需用cdatebase::openex()或cdatabase::open()函数来进行初始化。数据库对象必须在使用它构造记录集对象之前初始化。
三、实例
1.查询记录
[www.iocblog.net 来源]
查询记录使用crecordset::open()和crecordset::requery()成员函数。在使用crecordset类对象之前,必须使用crecordset::open()函数来获得有效的记录集。一旦已经使用过crecordset::open()函数,再次查询时就可以应用crecordset::requery()函数。
在调用crecordset::open()函数时,如果将一个已经打开的cdatabase对象指针传给crecordset类对象的m_pdatabase成员变量,则使用该数据库对象建立odbc连接;否则如果m_pdatabase为空指针,就新建一个cdatabase类对象,并使其与缺省的数据源相连,然后进行crecordset类对象的初始化。缺省数据源由getdefaultconnect()函数获得。也可以提供所需要的sql语句,并以它来调用crecordset::open()函数,例如:super_esset.open(afx_database_use_default,strsql);
如果没有指定参数,程序则使用缺省的sql语句,即对在getdefaultsql()函数中指定的sql语句进行操作:
cstring csuper_esset::getdefaultsql()
{return _t(″[bsicdata],[minsize]″);}
对于getdefaultsql()函数返回的表名,对应的缺省操作是select语句,即:
select *from basicdata,mainsize
在查询过程中,也可以利用crecordset的成员变量m_strfilter和m_strsort来执行条件查询和结果排序。m_strfilter为过滤字符串,存放着sql语句中where后的条件串;m_strsort为排序字符串,存放着sql语句中order by后的字符串。如:
super_esset.m_strfilter=″type=‘电动机’″;
super_esset.m_strsort=″voltage″;
super_esset.requery();
对应的sql语句为:
select *from basicdata,mainsize
where type=‘电动机’
order by voltage
除了直接赋值给m_strfilter以外,还可以使用参数化。利用参数化可以更直观、更方便地完成条件查询任务。使用参数化的步骤如下:
s声明参变量:
cstring p1;
float p2;
s在构造函数中初始化参变量:
p1=_t(″″);
p2=0.0f;
m_nparams=2;
s将参变量与对应列绑定:
pfx->setfieldtype(cfieldexchange::param)
rfx_text(pfx,_t(″p1″),p1);
rfx_single(pfx,_t(″p2″),p2);
完成以上步骤后就可以利用参变量进行条件查询:
m_pset->m_strfilter=″type=? and voltage=?″;m_pset->p1=″电动机″;
m_pset->p2=60.0;
m_pset->requery();
参变量的值按绑定的顺序替换查询字串中的“?”通配符。
如果查询的结果是多条记录,可以用crecordset类的函数move()、movenext()、moveprev()、movefirst()和movelast()来移动光标。[www.iocblog.net 来源]
2.增加记录
增加记录使用AddNew()函数,要求数据库必须是以允许增加的方式打开:
m_pSet->AddNew(); //在表的末尾增加新记录
m_pSet->SetFieldNull(&(m_pSet->m_type), FALSE);
m_pSet->m_type=″电动机″;
……
//输入新的字段值
m_pSet->Update();
//将新记录存入数据库
m_pSet->Requery();
//重建记录集
3.删除记录
可以直接使用Delete()函数来删除记录,并且在调用Delete()函数之后不需调用Update()函数:
m_pSet->Delete();
if (!m_pSet->IsEOF())
m_pSet->MoveNext();
else
m_pSet->MoveLast();
4.修改记录
修改记录使用Edit()函数:
m_pSet->Edit();
//修改当前记录
m_pSet->m_type=″发电机″;
//修改当前记录字段值
……
m_pSet->Update(); //将修改结果存入数据库
m_pSet->Requery();
5.撤消操作
如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用Update()函数之前调用:
CRecordSet::Move(AFX_MOVE_REFRESH)来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中,参数AFX_MOVE_REFRESH的值为零。
6.数据库连接的复用
在CRecordSet类中定义了一个成员变量m_pDatabase:
CDatabase* m_pDatabase;
它是指向对象数据库类的指针。如果在CRecordSet类对象调用Open()函数之前,将一个已经打开的CDatabase类对象指针传给m_pDatabase,就能共享相同的CDatabase类对象。如:
CDatabase m_db;
CRecordSet m_set1,m_set2;
m_db.Open(_T(″Super_ES″)); //建立ODBC连接
m_set1.m_pDatabase=&m_db;
//m_set1复用m_db对象
m_set2.m_pDatabse=&m_db;
// m_set2复用m_db对象
Tag: ODBC
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。