Visual C++ 数据库开发




  初级篇 

    几种VC++数据库开发技术的比较
    从功能简单的数据库(Jet Engine)到复杂的大型数据库系统(oracle)VC++6.0都提供了一些编程接口。本文主要介绍以下五种

    ODBC基本概念
    ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSAWindows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)

    Visual C++ 中的ODBC编程
    ODBCOpen Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。本文给出Windows 95 环境下用Visual C++ 进行ODBC 编程的具体方法及技巧

    Visual C++开发数据库应用程序
    Visual C++提供了多种多样的数据库访问技术——ODBC APIMFC ODBCDAOOLE DBADO等。这些技术各有自己的特点,它们提供了简单、灵活、访问速度快、可扩展性好的开发技术

  ADO  

    VCAdo接口连接和使用数据库  
    进行方法调用时,所传递的参数的类型的转换(可能存在比本文更简便的处理方法但我未发现)

    VC中利用ADO共同实现数据库的操作
    ADO是应用层的编程接口,它通过OLE DB提供的COM接口访问数据,它适合于各种客户机/服务器应用系统和基于Web的应用,尤其在一些脚本语言中访问数据库操作是ADO的主要优势

    ADO第一次亲密接触 -- ADO开发实践之一
    ADO(ActiveX Data Object)Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术

    使用ADO实现BLOB数据的存取 -- ADO开发实践之二
    在实际的开发过程中我们常常需要存储较大的二进制数据对象,比如:图像、音频文件、或其它二进制数据,这些数据我们称之为二进制大对象BLOBBinary Large Object,其存取的方式与普通数据有所区别

    单独使用CRecordSet
    一般情况下AppWizard会在数据库应用程序中自动产生CRecordset的派生类,并将派生类和某个数据源中的表联系起来也可以和视图上的子窗口联系起来

  高级篇

    Visual C++中实现对图像数据的读取显示
    在利用VC进行数据库编程时,经常需要处理数据库中的图像数据,将该图像从数据库中读取出来并显示,图像数据与文本字段不同,它是作为OLE字段在数据库中存储

    在Visual C++中用ADO进行数据库编程
    创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)

    ODBC中应用DDXRFX
    MFC ODBC 类。 ODBC API 用, 使 ODBC , 访 FoxprodBASE Sybase 件,
    
    Visual C++多线程DAO处理
    DAO多线程处理中,有许多局限性,所以我设计了这么一个类,通过GUI线程来使用DAO的强制调用

 

 

几种VC++数据库开发技术的比较

 

2001-12-04· ·陆尔东、邓利平··yesky

1 2  下一页


  从功能简单的数据库(Jet Engine)到复杂的大型数据库系统(oracle)VC++6.0都提供了一些编程接口。本文主要介绍以下五种:

  1.ODBC API

  2.MFC ODBC类;

  3.MFC DAO类;(数据访问对象)

  4.MFCOLE/DB

  5.ActiveX数据对象(ADO)

  1.开放数据库连接(ODBC API):提供了一个通用的编程接口,允许程序与多种不同的数据库连接。它为OracleSQL ServerMS Excel等都提供了驱动程序,使得用户可以使用SQL语句对数据库进行直接的底层功能操作。在使用ODBC API时,用户须引入的头文件为"sql.h""sqlext.h""sqltypes.h"。用ODBC API创建数据库应用程序遵循一定的基本步骤:

  第一步是分配ODBC环境,使一些内部结构初始化。完成这一步,须分配一个SQLHENV类型的变量在ODBC环境中做句柄使用。

  第二步是为将要使用的每一个数据源分配一个连接句柄,由函数SQLALLocHandle()完成。

  第三步是使用SQLConnect()把连接句柄与数据库连接,可以先通过SQLSetConnectAttr()设置连接属性。

  然后就可以进行SQL语句的操作,限于篇幅,相关的函数就不具体介绍了,读者可以参考相关书籍。

  操作完成后,用户取回相应的结果,就可以取消与数据库的连接。

  最后需要释放ODBC环境。

  ODBC API的特点是功能强大丰富,提供了异步操作,事务处理等高级功能,但相应的编程复杂,工作量大。

  2.MFC ODBC类:MFC1.5后的版本里引入封装了ODBC功能的类。通过这些类提供与ODBC的接口,使得用户可以不须处理ODBC API中的繁杂处理就可以进行数据库操作。主要的MFC ODBC类如下。

  CDatabase:一个CDatabase对象表示一个到数据源的连接,通过它可以操作数据源。应用程序可使用多个CDatabase对象:构造一个对象并调用OpenEx()成员函数打开一个连接。接着构造CRecordSet对象以操作连接的数据源,并向CDatabase对象传递记录集构造程序指针。完成使用后用Close()成员函数销毁CDatabase对象。一般情况下并不需要直接使用CDatabase对象,因为CRecordSet对象可以实现大多数的功能。但是在进行事务处理时,CDatabase就起到关键作用。事务(Transaction)指的是将一系列对数据源的更新放在一起,同时提交或一个也不提交,为的是确保多用户对数据源同时操作时的数据正确性。

  CRecordSet类:一个CRecordSet对象代表一个从数据源选择的一组记录的集合-记录集。记录集有两种形式:snapshotdynaset。前者表示数据的静态视图,后者表示记录集与其他用户对数据库的更新保持同步。通过CRecordSet对象,用户可以对数据库中的记录进行各种操作。

  CRecordView类:CRecordView对象是在空间中显示数据库记录的视图。这种视图是一种直接连到一个CRecordSet对象的格式视图,它从一个对话框模板资源创建,并将CRecordSet对象的字段显示在对话框模板的控件里。对象利用DDXRFX机制,使格式上的控件和记录集的字段之间数据移动自动化,也就是说,用户甚至不要编写一行代码就可以实现简单的数据库记录查看程序。

  CDBException类:由Cexception类派生,以三个继承的成员变量反映对数据库操作时的异常:

   m_nRetCode:以ODBC返回代码(SQL_RETURN)的形式表明造成异常的原因。

   m_strError:字符串,描述造成抛出异常的错误原因。

   m_strStateNativeOrigin:字符串,用以描述以ODBC错误代码表示的异常错误。

  MFC数据库类成员函数都能抛出CDBException类型的异常,所以在代码对数据库进行操作后监测异常是正确做法。

  MFC ODBC类在实际开发中应用最广,因为它功能丰富,操作相对简便

3.MFC DAO(数据访问对象)编程:DAO用于和微软的Access数据库接口。在数据库应用程序如果只需与Access数据库接口时,使用DAO编程较方便。其主要类如下。

  CDaoWorkspaceCDaoWorkspace对象可以让一个用户管理从登陆到离开期间,指定的密码保护的数据库会话全过程。大多数情况下不要多个工作区也不要创建明确的工作区对象。因为在打开数据库和记录集对象时,它们可以使用DAO缺省工作区。

  CDaoDatabase:代表一个连接,类似上述CDatabase类。

   CDaoRecordSet:用来选择记录集并操作,类似上述CRecordSet类。

   CDaoRecordView:类似上述CRecordView类。

   CDaoException:类似上述CDBException类。

   CDaoTableDef:表示基本表或附加表的定义。每个DAO数据库对象包括一个称为TableDef的收集,包含所有存储的DAO表定义对象。CDaoTableDef对象可以用来控制表定义。

   CDaoQueryDefCDaoQueryDef对象表示了一个查询定义(querydef)

   CDaoFieldExchange:支持数据库类使用的DAO字段交换(DFX)例程。也可处理事务,类似MFC ODBC类。

  MFC DAO仅用来支持Access数据库,应用范围相对固定。

  4.OLE DBOLE DB在数据提供程序和用户之间提供了灵活的组件对象模型(COM)接口,这种灵活性有时会使得操作复杂化。OLE DB框架定义了应用的三个基本类。

  数据提供程序Data Provider:拥有自己的数据并以表格形式显示数据的应用程序。提供OLE DB的行集COM接口,期显示范围可以从单一数据表格的简单提供者知道更复杂的分布式数据库系统。

  使用者Consumers:使用OLE DB接口对存储在数据提供程序中的数据进行控制的应用程序。用户应用程序归为使用类。

  服务提供程序Service Provider:是数据提供程序和使用者的组合。服务提供程序没有自己的数据,但使用

  OLE DB使用者接口来访问存储在数据提供程序中的数据。然后,服务提供程序通过打开数据提供程序接口使得数据对使用者有效。服务提供程序常用于向应用程序提供高层次服务,比如高级分布式查询。

  OLE DB编程时,用户使用组件对象开发应用程序。这些组件有:

   枚举器:用于列出可用的数据源;

   数据源:代表单独的数据和服务提供程序,用于创建对话;

   对话:用于创建事务和命令;

   事务:用于将多个操作归并为单一事务处理;

   命令:用于向数据源发送文本命令(SQL),返回行集;

   错误:用于获得错误信息。

  5.ActiveX数据对象(ADO):是微软提供的面向对象的接口,与OLE DB类似,但接口更简单,具有更广泛的特征数组和更高程度的灵活性。ADO基于COM,提供编程语言可利用的对象,除了面向VC++,还提供面向其他各种开发工具的应用,如VBVJ等。ADO在服务器应用方面非常有用,特别是对于动态服务器页面ASP(Active Server Page)

  ADO对象结构类似于OLE DB,但并不依靠对象层次。大多数情况下,用户只需要创建并只使用需要处理的对象。下面的对象类组成了ADO接口。

   Connection:用于表示与数据库的连接,以及处理一些命令和事务。

   Command:用于处理传送给数据源的命令。

   Recordset:用于处理数据的表格集,包括获取和修改数据。

   Field:用于表示记录集中的列信息,包括列值和其他信息。

   Parameter:用于对传送给数据源的命令之间来回传送数据。

   Property:用与操作在ADO中使用的其他对象的详细属性。

   Error:用于获得可能发生的错误的详细信息。

  在VC++使用ADO需要进行COM操作,详细方法在此就不赘述了。

  在当今流行的分布式开发环境下,VC++6.0在数据库开发方面有较强的优势,学会

  在不同的场合选用不同的技术,对开发人员来说是必要的技术。

 

ODBC基本概念

 

2002-03-21· · ··yeah

  ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSAWindows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC

  一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMSODBC驱动程序完成。也就是说,不论是FoxProAccess还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。

  一个完整的ODBC由下列几个部件组成:

  应用程序(Application)

  ODBC管理器(Administrator)。该程序位于Windows 95控制面板(Control Panel)32ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。

  驱动程序管理器(Driver Manager)。驱动程序管理器包含在ODBC32.DLL中,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件。

  ODBC API

  ODBC 驱动程序。是一些DLL,提供了ODBC和数据库之间的接口。

  数据源。数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。

  各部件之间的关系如图下图所示:

  应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBCODBC就能建立起与相应数据库的连接。

  在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。

  在访问ODBC数据源时需要ODBC驱动程序的支持。用Visual C++ 5.0安装程序可以安装SQL Server Access Paradox dBase FoxPro Excel Oracle Microsoft Text等驱动程序.在缺省情况下,VC5.0只会安装SQL Server Access FoxProdBase的驱动程序.如果用户需要安装别的驱动程序,则需要重新运行VC 5.0的安装程序并选择所需的驱动程序。

【责任编辑:】

 

 

Visual C++ 中的ODBC编程
2000-01-30 00:00:00· 董毅·CPCW


DBCOpen Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。本文给出Windows 95 环境下用Visual C++ 进行ODBC 编程的具体方法及技巧。

---- 关键字:ODBCVisual C++Windows 编程。

---- 一.概述

---- ODBC 是一种使用SQL 的程序设计接口。使用ODBC 让应用程序的编写者避免了与数据源相联的复杂性。这项技术目前已经得到了大多数DBMS 厂商们的广泛支持。

---- Microsoft Developer Studio 为大多数标准的数据库格式提供了32 ODBC 驱动器。这些标准数据格式包括有:SQL ServerAccessParadoxdBaseFoxProExcelOracle 以及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;而阆敕梦适菘獾男畔幌牖匦此龅母谋洌敲囱《―atabase 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 的详细用法可以参见Visual C++ Online Book

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

---- 下面举例说明在Visual C++ 环境中ODBC 的编程技巧:

---- 1 .查询记录

---- 查询记录使用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("[BasicData],[MainSize]");}
---- 对于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 以外,还可以使用参数化。利用参数化可以更直观,更方便地完成条件查询任务。使用参数化的步骤如下:

---- (1) .声明参变量:

CString p1;
float p2;
---- (2) .在构造函数中初始化参变量

p1=_T("");
p2=0.0f;
m_nParams=2;
---- (3) .将参变量与对应列绑定

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() 来移动光标。

---- 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() 函数: