Solaris下PRO*C和OCI程序设计分析与比较(2)
时间:2015-08-31 09:50
来源:发表吧
作者:发表吧编辑
点击:
次
3.2申请句柄
句柄是指向OCI库所分配的内存区域的指针,该内存区域中的数据由OCI库维护,应用程序可通过句柄访问其中的数据。下面是应用程序中最常用的几个句柄:
OCIHandleAlloc((dvoid*)m_envhp,(dvoid**)&m_errhp,OCI_HTYPE_ERROR,
(size_t)0,(dvoid**)0);
OCIHandleAlloc((dvoid*)m_envhp,(dvoid**)&m_srvhp,OCI_HTYPE_SERVER,
(size_t)0,(dvoid**)0);
OCIHandleAlloc((dvoid*)m_envhp,(dvoid**)&m_svchp,OCI_HTYPE_SVCCTX,
(size_t)0,(dvoid**)0);
OCIHandleAlloc((dvoid*)m_envhp,(dvoid**)&m_stmthp,OCI_HTYPE_STMT,
(size_t)0,(dvoid**)0);
其中m_errhp为新申请的句柄,m_envhp为它的父环境句柄,OCI_HTYPE_ERROR为句柄类型,表示这是一个错误报告句柄,OCI_HTYPE_SERVER表示服务器句柄,OCI_HTYPE_SVCCTX表示服务环境句柄,OCI_HTYPE_STMT表示语句句柄。
存储在句柄中的数据称为句柄属性,所有OCI句柄都具有属性,可以调用OCIAttrGet()和OCIAttrSet()函数来读取、设置句柄属性。
3.3连接服务器建立会话
首先调用OCIServerAttach(m_srvhp,m_errhp,(text*)"",strlen(""),OCI_DEFAULT);函数建立与指定服务器的连接,text*类型变量为空,表示连接默认数据库服务,OCI_DEFAULT表示应用程序的操作模式为阻塞模式,在这种方式下,只有当OCI调用完成后才将控制权返回给客户端应用程序。
然后调用OCILogon(m_envhp,m_errhp,&m_svchp,(text*)m_szUser,strlen(m_szUser),
(text*)m_szPassword,strlen(m_szPassword),(text*)m_szDbName,strlen(m_szDbName));建立数据库会话。此函数隐含申请服务器句柄和用户会话句柄,登录后,句柄是只读的,不能再设置句柄属性。
3.4执行SQL语句并处理数据
将要执行的SQL语句copy到szSqlStr字符串中,snprintf(szSqlStr,sizeof(szSqlStr),"selectPASSWORDfromUSERSwhereUSERNAME=’chen’");
执行下列语句:
OCIStmtPrepare(m_stmthp,m_errhp,(text*)szSqlStr,(ub4)strlen(szSqlStr),
(ub4)OCI_NTV_SYNTAX,(ub4)OCI_DEFAULT);//准备SQL语句
OCIDefine*defnp0=(OCIDefine*)0;//定义输出变量
OCIDefineByPos(m_stmthp,&defnp0,m_errhp,1,(dvoid*)szUSERNAME,100,SQLT_STR,
(dvoid*)0,(ub2*)0,(ub2*)0,OCI_DEFAULT);//绑定变量
OCIStmtExecute(m_svchp,m_stmthp,m_errhp,(ub4)1,(ub4)0,(OCISnapshot*)NULL,
(OCISnapshot*)NULL,(ub4)OCI_DEFAULT);//执行SQL语句
3.5结束会话断开数据库连接
OCILogoff(m_svchp,m_errhp);
3.6断开与数据源的连接,释放句柄
OCIServerDetach(m_srvhp,m_errhp,OCI_DEFAULT);//断开与数据源的连接
OCIHandleFree((dvoid*)m_stmthp,OCI_HTYPE_STMT);//释放句柄
OCIHandleFree((dvoid*)m_svchp,OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid*)m_srvhp,OCI_HTYPE_SERVER);
OCIHandleFree((dvoid*)m_errhp,OCI_HTYPE_ERROR)
3.7生成可执行文件(两种方法)
(1)同普通的C程序:
#gcc-oexampled–I.–I$(ORACLE_HOME)/precomp/publicexample.c
(2)利用Oracle自带的Make文件:
首先将$ORACLE_HOME/rdbms/demo/demo_rdbms.mk文件copy到OCI源程序所在的目录,将源文件编译为目标文件:#gcc–cexample.o-I$(ORACLE_HOME)/rdbms/demo
-I$(ORACLE_HOME)/network/public-I$(ORACLE_HOME)/rdbms/public/example.c
然后用命令:#make-fdemo_rdbms.mkbuildOBJS=example.oEXE=exampled,exampled就为生成的可执行文件。
4二者的比较
PRO*C程序的最大优点是简单易学,另外,因为PRO*C程序是把SQL语句翻译成相应的Oracle库函数调用,因此大大提高了应用程序的执行速度。
OCI程序使开发人员能使用已熟悉的C语言编程技术,通过Oracle的OCI函数调用快速开发应用程序,能充分发挥C语言的特点,使开发人员对程序设计和运行控制更加灵活,开发的应用程序具有更强的数据处理能力和更大的灵活性。
5结束语
文章从开发环境、开发流程、编译三个方面分别详细分析了PRO*C和OCI程序设计的方法,并对两者的性能进行了比较。希望能为广大的计算机技术工作者提供参考。由于OCI程序设计相对复杂,以上所述仅是用来实现基本的数据库操作,若要实现更复杂的应用,需要做大量的实践操作,积累经验。文中举例的程序,都是在实际中编译通过了的,更有说服力。
参考文献
[1]袁鹏飞著.Oracle数据库8i高级应用开发技术,人民邮电出版社,2000.7
[2]http://www.oradb.net/book.htm/OracleProC程序设计
[3]http://www.pgsqldb.org/pgsqldoc-cvs/index.html
[4]http://www.orafaq.com