VC常用数据库操作方法 下载本文

VC中常用数据库操作的实现

1. 常用的数据库结构体系概述

ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。 Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle以及Microsoft Text。如果用户希望使用其他数据格式,用户需要相应的ODBC驱动器及DBMS。用户使用自己的DBMS数据库管理 功能生成新的数据库模式后,就可以使用ODBC来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC的联机帮助。

ADO(ActiveX Data Object, Active 数据对象)是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE.DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。

OLE DB是”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。您需要的API 应该是一座连接应用程序和 OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。

2. 操作对象

MFC提供的ODBC数据库类:

VisualC++的MFC基类库定义了几个数据库类。在利用ODBC编程时,经常要使用到CDatabase(数据库类),CRecordSet(记录集类)和CRecordView(可视记录集类)。 其中:

CDatabase类对象提供了对数据源的连接,通过它你可以对数据源进行操作。

CRecordSet类对象提供了从数据源 中提取出的记录集。CRecordSet对象通常用于两种形式: 动态行集(dynasets)和快照集(snapshots)。动态行集能保 持与其他用户所做的更改保持同步。快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录,所不同的是,当你在一个动态行集里滚 动到一条记录时,由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来。

CRecordView类对象能以控制的形式 显示数据库记录。这个视图是直接连到一个CRecordSet对象的表视图。

ADO模型包括了下列对象:连接(Connection)、命令 (Command)、记录集 (Recordset)、字段 (Field)、参数 (Parameter)、错误 (Error)、属性 (Property)、集合 、事件.它们之间的关系如下图:

3. ODBC的数据库操作

应用VisualC++的AppWizard可以自动生 成一个ODBC应用程序框架。方法是:打开File菜单的New选 项,选取Projects,填入工程名,选择MFCAppWizard(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建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。有关m_pSet的详细 用法可以参见VisualC++ OnlineBook。

程序与数据语言建立联系,使 用CDatebase::OpenEx()或CDatabase::Open()函数来进行初始化。数据库 对象必须在你使用它构造一个记录集对象之前被初始化。

下面举例说明在VisualC++环境中ODBC 的编程技巧: 1.注册ODBC数据源:

SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,\Access Driver (*.mdb)\\0\BASE\\0\\0\

---- 您可以根据您不同的设置需要修改上面的语句,SQLConfigDataSource一般有以下几个许可的参数:

ODBC_ADD_DSN: 加入一个新的用户数据源,

ODBC_CONFIG_DSN: 修改一个存在的用户数据源,

ODBC_REMOVE_DSN: 删除一个存在的用户数据源,ODBC_ADD_SYS_DSN: 增加一个新的系统数据源,

ODBC_CONFIG_SYS_DSN: 修改一个存在的系统数据源, ODBC_REMOVE_SYS_DSN: 删除一个存在的系统数据源, ODBC_REMOVE_DEFAULT_DSN: 删除省缺的数据源说明部分。

需要注意的是,当我们使用SQLConfigDataSource ODBC API函数时必须声明包含系统的odbcinst.h头文件,所以我们再选择workspace窗口中FileView打开Header Files中try.h,在其中加入#include \,如果不加入这个头文件,系统编译时就会显示undeclared identifier错误,在完成上述步骤后,假如我们立即编译并Link这个项目,会发现出现下面的错误: tryDlg.obj :

error LNK2001: unresolvedexternal symbol _SQLConfigDataSource

@16Debug/try.exe :

fatal error LNK1120: 1 unresolved externals

这是因为当我们使用SQLConfigDataSource 这个API函数时候必须用到odbccp32.dll,它是Microsoft提供的32位ODBC安装和管理的DLL,如果是16位必须用到odbcinst.dll,odbccp32.dll有一个import library,所以解决的办法就是把这个odbccp32.lib加到我们的项目中,我们可以打开Project系统菜单项,选Add to Project子菜单,在其中选Files项,打开VC安装目录下的\\vc\\lib\\目录,文件类型选Library Files(.lib), 选择其中Odbccp32.lib后按OK键,然后重新编译即可通过

2.查询记录

查询记录使用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(\

----对于GetDefaultSQL()函数返回的表名, 对应的缺省操作是SELECT语句,即:

----SELECT * FROM BasicData,MainSize

----查询过程中也可以利用CRecordSet的 成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter 为过滤字符串,存放着SQL语句中

WHERE后的条件串;m_strSort 为排序字符串,存放着SQL语句中ORDERBY后的字符串。 如:

Super_ESSet.m_strFilter=\电动机'\ Super_ESSet.m_strSort=\ Super_ESSet.Requery(); 对应的SQL语句为:

SELECT * FROM BasicData,MainSize WHERE TYPE='电动机' ORDER BY VOLTAGE

----除了直接赋值给m_strFilter以外,还 可以使用参数化。利用参数化可以更直观,更方便地 完成条件查询任务。使用参数化的步骤如下: ----(1).声明参变量: CStringp1; floatp2;

----(2).在构造函数中初始化参变量 p1=_T(\ p2=0.0f;

m_nParams=2;

----(3).将参变量与对应列绑定

pFX->SetFieldType(CFieldExchange::param) RFX_Text(pFX,_T(\ RFX_Single(pFX,_T(\

----完成以上步骤之后就可以利用 参变量进行条件查询了: m_pSet->m_strFilter=\ m_pSet->p1=\电动机\ m_pSet->p2=60.0; m_pSet->Requery();

----参变量的值按绑定的顺序替换 查询字串中的“?”适配符。

----如果查询的结果是多条记录的 话,可以用CRecordSet类的函数Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()来移动光标。 ----3.增加记录

----增加记录使用AddNew()函数,要求数据库必须是以允许增加的方式打开: m_pSet->AddNew(); //在表的末尾增加新记录

m_pSet->SetFieldNull(&(m_pSet->m_type),FALSE); m_pSet->m_type=\电动机\ ... //输入新的字段值

m_pSet-> Update(); //将新记录存入数据库 m_pSet->Requery(); //重建记录集