ODBC应用程序框架

ODBC应用程序的最终目的是通过ODBC API函数执行SQL语句,完成各种数据库操作。ODBC对数据库的访问通过句柄来实现,常用的三个基本的句柄是:

       环境句柄:建立应用程序与ODBC系统之间的联系,只有一个环境句柄。

    连接句柄:把ODBC与数据源建立起联系,可以有多个连接句柄。
    语句句柄:用来与SQL语句操作建立联系,以便执行SQL语句。ODBC应用程序中,任何一个处理SQL语句的ODBC函数都需要一个语句句柄作参数。
   环境句柄、连接句柄和语句句柄是ODBC应用程序中使用最为频繁的三个对象,一个应用程序只应该创建一个环境句柄,由该环境句柄实现应用程序与ODBC动态链接库的连接。但在一个环境句柄下可以创建多个连接句柄,通过这些连接句柄,应用程序可以实现与多个不同数据源的连接,为应用程序提供同时处理不同数据库系统数据的能力。同样,在一个连接句柄下可以申请多个语句句柄,使用这些语句句柄执行多个SQL语句。
  语句句柄的申请和释放操作与环境句柄和连接句柄类似,下面介绍应用程序应该怎样申请和释放语句句柄,以及SQL语句的执行过程。图6-19给出ODBC申请和释放语句句柄的流程。
 1.申请语句句柄
 2.释放语句句柄

 3.执行SQL语句


1.申请语句句柄 
  SQLAllocStmt函数为应用程序分配语句句柄,其格式为:
   RETCODE SQLAllocStmt(
              HDBC hdbc,
              HSTMT FAR * phstmt
              )其中,hdbc为连接句柄。每个语句句柄总是与一个连接句柄相关联,所以在申请语句句柄时,要提供一个有效的连接句柄,否则,SQLAllocStmt函数将返回错误码:SQL_INVALID_HANDLE。
  Phstmt为输出参数,它是一个指向语句句柄变量的指针,当SQLAllocStmt函数执行成功时,它返回SQL_SUCCESS,并将为应用程序分配的语句句柄存储到指定的语句句柄变量中,否则返回SQL_ERROR。


 2. 释放语句句柄 
  在使用语句句柄处理完数据库操作后,应用程序应调用SQLFreeStmt函数关闭语句句柄的游标、释放为结果集合所分配的缓冲区、释放语句句柄,从而释放它占用的系统资源。      SQLFreeStmt函数的格式为:
            RETCODE SQLFreeStmt(
            HSTMT hstmt,
            UWORD fOption
            )
   其中,hstmt为待释放的语句句柄,fOption参数控制SQLFreeStmt函数的动作。因为SQLFreeStmt函数不仅仅用来释放语句句柄,它还有其它多种功能,如能够关闭游标,释放列和参数缓冲区等,SQLFreeStmt函数的所有这些功能由fOption参数的取值决定。
  FOption参数取值如下:
 .SQL_CLOSE:关闭与hstmt句柄相关联的游标,废除所有正在处理的结果。关闭游标后,再次执行SELECT语句可以重新打开游标;
 .SQL_DROP:关闭所有与hstmt相关联的游标,废除正在处理的结果,结束一切对hstmt句柄的访问,并释放hstmt 句柄;
 .SQL_UNBIND:解除SQLBindCol函数为hstmt结果集合所关联的所有列缓冲区;
 .SQL_RESET_PARAS:释放SQLBinParameter函数为hstmt句柄所关联的参数缓区。


  图6-19 ODBC各种句柄的申请和释放流程图



3. 执行SQL语句 
  ODBC应用程序的最终目的是通过ODBC API函数执行SQL语句,完成各种数据库操作。前面介绍的内容都是为执行SQL语句做准备。图6-20是ODBC执行SQL语句的简单流程。

  图6-20



ODBC应用程序设计的核心内容之一是执行SQL语句。内容包括申请和释放语句句柄、SQL语句的执行方式及参数传递、选择SQL语句执行方式(同步执行和异步执行)执行SQL语句,以及事务管理等。ODBC应用程序通过执行SQL语句实现各种数据库操作,完成用户指定的程序功能。有关SQL语句的执行方式有两种:
 (1) 直接执行:调用ODBC的SQLExecDriect()函数
如果以下两方面都成立,用直接执行方式提交SQL语句:
 · 该SQL语句只执行一次;
 · 应用在执行前不需要结果集的信息。
  采用立即执行方式执行一条SQL语句比较简单,实现过程也很直观。首先将要执行的SQL语句文本传递给SQLExecDirect函数,SQL语句经驱动程序分析后立即提交给数据源执行。
  SQLExecDirect函数的格式是:
  SQLExecDirect(HSTMT hstmt,UCHAR FAR * szSqlstr, SCWORD cbSqlstr)
  其中:
 · Hstmt为语句句柄。
 · SzSqlStr为SQL语句文本缓冲区;
 · cbSqlStr参数说明SQL语句文本的长度。使用C或C++编程时,可将它设置为SQL_NTS。
  语句成功执行后,SQLExecDirect函数返回SQL_SUCCESS。
  例如,下面代码通过SQLExecDirect函数立即执行一个数据库查询语句:
  rc=SQLExecDirect(hstmt,'SELECT*FROM authors', SQL_NTS);

 (2) 准备执行:应用程序执行一条SQL语句需要两步实现先调用ODBC的SQLPrepare()函数准备SQL语句,再调用ODBC的SQLExecute()函数执行准备好SQL语句。
  如果以下两条件之一成立,用准备执行方式提交SQL语句:
 * 该SQL语句要执行多次;
 * 应用在执行前需了解结果集的信息
  在准备过程中,驱动程序将SQL语句转换为数据源本地SQL格式(有些驱动程序还对SQL语句进行句法分析)之后将它提交给数据源,数据源再对SQL语句进行编译,设计访问计划,最后将访问计划描述符返回给驱动程序。
  与立即执行相比,SQLExecute函数执行一个准备好的SQL语句的速度要快于前者,因为它省去了驱动程序和数据源对SQL语句的处理时间。应用程序究竟采用哪种方式执行SQL语句,主要考虑该语句是否要多次执行。
  SQLPrepare 函数的格式是:
  RETCODE SQLPrepare(HSTMT hstmt,UCHAR FAR * szSqlstr, SCWORD cbSqlstr)
  其中:
 · Hstmt为语句句柄。
 · SzSqlStr为SQL语句文本缓冲区;
 · cbSqlStr参数说明SQL语句文本的长度。
  准备好的SQL语句通过SQLExecute函数执行,SQLExecute函数的格式比较简单,它只需一个准备语句使用的语句句柄,即:
  RETCODE SQLExecute(HSTMT hstmt)
  SQLPrepare函数准备好的SQL语句可以被SQLExecute函数多次执行。在每次执行时,可使用不同的语句参数。但是,当调用SQLExecute函数再次执行一个SELECT语句时,应用程序必须先使用SQL_CLOSE参数调用SQLFreeStmt函数,关闭与该语句句柄相关联的游标,废除它正在处理的结果集合,然后再执行SELECT语句,生成新的结果集合。

  与立即执行相比,SQLExecute函数执行一个准备好的SQL语句的速度要快于前者,因为它省去了驱动程序和数据源对SQL语句的处理时间。应用程序究竟采用哪种方式执行SQL语句,主要考虑该语句是否要多次执行。
  说明:
 · 异构数据库访问和ODBC技术,对开发人员和用户的好处是十分明显的。但是,用ODBC技术进行异构数据库访问还有一些不足:
 · 每个DBMS都提供自己的ODBC接口,自己的数据类型、单独的SQL版本和功能。许多接口不符合标准,使得相同的代码访问不同的数据库时,结果会出现不一致;
 · 使用ODBC接口应用程序的效率会降低。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值