____#include
____EXEC SQL BEGIN DECLARE SECTION;
____VARCHAR username[]; //声明宿主变量
____VARCHAR password[];
____VARCHAR dbname[];
____EXEC SQL END DECLARE SECTION;
____void db_connect()
____{
____strcpy((char *)usernamearrSCOTT);
____usernamelen = strlen((char *)usernamearr);
____strcpy((char *)passwordarrTIGER);
____passwordlen = strlen((char *)passwordarr);
____strcpy((char *)dbnamearrSUNDB);
____dbnamelen = strlen((char *)dbnamearr);
____EXEC SQL WHENEVER SQLERROR STOP;
____//隐式异常处理
____EXEC SQL CONNECT :usernameIDENTIFIED BY :password USING :dbname;
____/*if (sqlcasqlcode != ) //显式异常处理
____{
____AfxMessageBox(\n与 Oracle 数据库连接失败!);
____return;
____}*/
____}
____在VC中使用PRO*C时先用PRO*C编写所需的操作数据库的子程序再运行PRO*C预编译程序把PRO*C源程序转成相应的CPP源程序将该程序插入到用户工程文件中并在需要对插入函数进行调用的模块中说明函数然后就可以在此模块中调用所需的函数
____使用ODBC中间件访问数据库
____ODBC工作原理
____ODBC是Open Database Connect(开放数据库互连)的简称它是由Microsoft公司于 年提出的一个用于访问数据库的统一界面标准是应用程序和数据库系统之间的中间件它通过使用相应应用平台上和所需数据库对应的驱动程序与应用程序的交互来实现对数据库的操作避免了在应用程序中直接调用与数据库相关的操作从而提供了数据库的独立性
____ODBC主要由驱动程序和驱动程序管理器组成驱动程序是一个用以支持ODBC函数调用的模块(在WIN下通常是一个DLL)每个驱动程序对应于相应的数据库当应用程序从基于一个数据库系统移植到另一个时只需更改应用程序中由ODBC管理程序设定的与相应数据库系统对应的别名即可驱动程序管理器(包含在ODBCDLL中)可链接到所有ODBC 应用程序中它负责管理应用程序中ODBC函数与DLL中函数的绑定
____ODBC使用层次的方法来管理数据库在数据库通信结构的每一层对可能出现依赖数据库产品自身特性的地方ODBC都引入一个公共接口以解决潜在的不一致性从而很好地解决了基于数据库系统应用程序的相对独立性这也是ODBC一经推出就获得巨大成功的重要原因之一
____从结构上分ODBC分为单束式和多束式两类
____单束式驱动程序
图
____单束式驱动程序介于应用程序和数据库之间像中介驱动程序一样数据提供一个统一的数据访问方式
____当用户进行数据库操作时应用程序传递一个ODBC函数调用给ODBC驱动程序管理器 由ODBC API判断该调用是由它直接处理还是送交驱动程序执行
____可见单束式驱动程序本身是一个数据库引擎由它直接可完成对数据库的操作尽管该数据库可能位于网络的任何地方
____多束式驱动程序
图
____多束式驱动程序负责在数据库引擎和客户应用程序之间传送命令和数据它本身并不执行数据处理操作而用于远程操作的网络通信协议的一个界面
____前端应用程序提出对数据库处理的请求该请求转给ODBC驱动程序管理器驱动程序管理器依据请求的情况就地完成或传给多束驱动程序多束式驱动程序将请求翻译为特定厂家的数据库通信接口(如Oracle的SQLNet)所能理解的形式并交于接口去处理接口把请求经网络传送给服务器上的数据引擎服务器处理完后把结果发回给数据库通信接口 数据库接口将结果传给多束式ODBC驱动程序再由驱动程序将结果传给应用程序
____在VC中使用ODBC
____Visual C++中提供了CDatabaseCRecordsetCRecordViewCDBException和CFie ldExchange五个类这些类封装了ODBC SDK函数从而使用户可以无需了解SDK函数就可以很方便地操作支持ODBC的数据库
____CDatabase类封装了与数据库建立连接控制事务的提交和回滚及执行SQL语句的方法
____CRecordset类封装了大部分操纵数据库的方法包括浏览修改记录控制游标移动排序等操作
____CRecordView类提供了与Recordset对象相连接的视图可以建立视中的控件与数据库数据的对应同时支持移动游标修改记录等操作
____CDBException类提供了对数据库操作的异常处理可以获得操作异常的相关返回代码
____CFieldExchange类提供了用户变量与数据库字段之间的数据交换如果不需要使用自定义类型将不用直接调用该类的函数MFC Wizard将自动为程序员建立链接
____两种方法的比较
____综上所述使用这两种方法在Visual C++中都可以很方便地开发出基于Oracle数据库的应用程序同时这两种方法又各有其优缺点ODBC由于有MFC强大的类库支持而使得编程实现非常方便同时可移植性也很强在异构数据库之间移植也只需更改很少一部分程序但是由ODBC的实现机制我们可以看到与PRO*C相比应用程序需要经过ODBC驱动程序管理器和ODBC驱动程序两层才能和数据库通信接口建立联系而PRO*C是直接与通信接口联系因此建立在ODBC上应用程序的执行效率会相对低一些PRO*C具有执