ODBC学习笔记(1)--句柄

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

常见的四个句柄有环境句柄,连接句柄,语句句柄和描述句柄。

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

当应用程序调用SQLAllocHandle的时候,Driver Manager 或者Driver根据句柄类型创建相应的句柄对象,并且分配内存。
所有的ODBC函数都需要用到上面的句柄。Driver Manager和Driver是根据不同的句柄来区分。
Driver Manager句柄仅仅可以被Driver Manager识别和解析。
driver 的句柄也仅仅可以被driver自己识别和解析。

例如,在一个应用程序中,driver创造了一个statement handle的句柄。在调用函数SQLPrepare函数的时候,
driver会将语句句柄传输给数据服务器,driver会为这个句柄做好准备,
然后当调用SQLExecute的时候,也使用相同的句柄,然后会返回相应的数据集,或者是执行结果。

在ODBC的结构中,有两个级别的句柄,1个是driver manager 另一个是dirver的句柄。

因为ODBC函数都在driver manager中,所以,应用程序在调用ODBC函数的时候,首先会调用driver manager中的函数,
然后driver manager会在相对应的driver中找到相应的driver handler,然后使用driver handler来调用driver中相应的函数。
在函数代码中,如果想了解更多driver相关的信息,你可以使用接口SQLGetInfo
 

一、环境句柄:

环境句柄在全局范围内一般只有一个。也就是一个应用程序只需要一个环境句柄。

环境句柄记录着全局的环境信息。其中包括:
1:环境的状态。
2:当前环境的诊断级别。 (current environment-level diagnostics)
3: 可以在环境句柄中创建连接句柄。
4:还有每个环境属性的当前设置。

在ODBC应用程序中,环境句柄的使用并不是特别的频繁。经常会被以下几个接口调用。
SQLDataSources, SQLDrivers
SQLAllocHandle, SQLFreeHandle, SQLEndTran
SQLGetDiagField, SQLGetDiagRec

每个代码段都包含1个或者多个环境句柄,
driver manager 维护不用的环境句柄,以区分不同的应用程序,
环境句柄的创建和释放分别由SQLAllocHandle和SQLFreeHandle完成。

二、连接句柄:


连接是指driver和data source的连接,每个连接都由连接句柄来区分。
在ODBC应用程序中,连接句柄通常包含下列信息。
1:连接的状态,
2:当前连接的诊断级别。(current connection-level diagnostics)
3: 创建和释放【语句句柄和描述句柄】
4:当前设置的每个连接属性。

ODBC是支持多个连接同时连接的,所以通常情况下,driver会支持多个连接同时连接。
因此在同一个ODBC应用程序中,可以有很多连接。
可以有多个driver和多个data source的多个连接。
也可以有一个driver和多个data source的多个连接。
也可以有一个driver和一个data srouce的多个连接。

不过同一个driver,有连接数量限制,可以使用SQLGetInfo 函数来获取连接数量限制,SQL_MAX_DRIVER_CONNECTIONS 

连接句柄是的最基本的句柄,例如下列接口会调用,
连接到数据源:SQLConnect, SQLDriverConnect, SQLBrowseConnect
关闭连接:SQLDisconnect
获取driver和数据源的信息:SQLGetInfo
诊断信息:SQLGetDiagField, SQLGetDiagRec
执行事务:SQLEndTran
设置或获取连接属性:SQLSetConnectAttr, SQLGetConnectAttr
获取本机格式的接口:SQLNativeSql

创建: SQLAllocHandle
释放: SQLFreeHandle

三、语句句柄:

语句句柄不仅仅包含sql语句,还包含和此sql语句所关联的所有信息,
例如返回的结果集,和执行语句的参数,
甚至于有些地方都不需要的sql语句,例如SQLTables,会使用预先定义的sql语句直接获取所有表的名字。


不同的语句是有语句句柄区别的。 一个语句仅仅属于一个连接,但是一个连接可以有多个语句句柄。

同一个连接会限制语句句柄的数量, 限制的数量是SQLGetInfo接口来获取,其中参数为SQL_MAX_CONCURRENT_ACTIVITIES


当通过sql语句 INSERT UPDATE DELETE关键字的sql语句,statement会返回行数,
这时 语句句柄就会处于激活状态。
当使用接口SQLPutData多次发送数据的时候,语句句柄也会处于激活状态。

在ODBC应用程序中,语句句柄通常包含下列信息:
1:语句的状态。
2:当前语句的诊断级别。
3:绑定到语句的参数和结果集合的地址。
3:当前的语句设置。

有很多的ODBC函数都会使用语句句柄。    
1:绑定参数和绑定列。 SQLBindParameter,SQLBindCol
2: 执行SQL语句:SQLPrepare, SQLExecute, SQLExecDirect
3: 获取列属性(检索元数据):SQLColAttribute, SQLDescribeCol
4:匹配结果: SQLFetch
5:诊断信息:SQLGetDiagField, SQLGetDiagRec
6: 目录的函数:SQLColumns, SQLTables
7:创建和释放:SQLAllocHandle, SQLFreeHandle

四、描述符句柄

描述符指的是SQL语句的参数和结果集的列的元数据的集合。一般担任下面四个角色的任意一个角色。
1:应用程序参数描述符(APD):C数据类型:例如地址,长度和C数据类型。
包含有关绑定到 SQL 语句中的参数的应用程序缓冲区的信息。
2:实现参数描述符(IPD):SQL 数据类型:SQL数据和长度或者 null 。
3:应用程序行描述符(ARD):包含有关绑定到结果集中的列的应用程序缓冲区的信息。
4:实现行描述符(IRD):包含有关结果集中的列的信息

自动分配的描述符:创建语句句柄的时候,会自动创建四个描述符,对应上面四个类型。
自动分配的描述符,始终和语句相关联。

显式分配的描述符:应用程序还可以使用SQLAllocHandle在连接上创建新的描述符,
并且可以与该连接上的一个或者多个语句相关联,满足ARD 和 APD的角色。

ODBC中,大多数操作都不需要显示创建描述符,但是某些操作可能为了方便快捷。例如:
某个应用程序要从两个不同的缓冲区集中插入数据。若要使用第一组缓冲区,需要
重复调用SQLBindParameter将其绑定到INSERT语句中的参数,然后执行该语句
 

五、状态转换

每种句柄都有多个状态。例如环境句柄的状态有三种情况:
1:Unallocated (没有分配内存)
2:Allocated   (已经分配了内存,但是还没有任何连接)
3:Connection     (已经分配了内存,并且有一个或者多个连接)

连接句柄有7个状态。
语句句柄有13个状态。

状态1->状态2  SQLAllocHandle
状态2->状态3  SQLAllocHandle
状态2->状态1  SQLFreeHandle
状态3->状态1 SQLDisconnect,SQLFreeHandle


环境句柄的三个状态的转换,使用SQLAllocHandle, SQLFreeHandle 来完成,
状态转换需要特定的函数顺序。

但是例如这种函数,不需要特定的函数顺序。例如:SQLGetConnectAttr

,如果环境句柄处于状态3,那么直接调用函数SQLFreeHandle的话,会导致释放失败。
也就是错误码SQLSTATE HY010 : 也就是函数调用顺序错误。
因为状态3到状态1,必须先关闭连接,进入状态2,然后才能释放。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值