ODBC_API参考
使⽤ODBC API进⾏数据库编程
ODBC(Open Database Connectivity,开放数据库连接),是由 Microsoft 公司基于X/OPEN CLI 提出的⽤于访问数据库的应⽤程序编程接⼝,主要完成应⽤程序和数据库系统之间的中间件功能。基于 ODBC 的应⽤程序通过 ODBC 提供的 API 与数据库进⾏交互,在避免了应⽤程序直接操作数据库系统的同时,极⼤的增强了应⽤程序的可移植性、扩展性和可维护性。ODBC定义了访问数据库的API⼀个规范,这些API独⽴于不同⼚商的数据库产品。
在开始使⽤ODBC编程之前,需要安装ODBC驱动程序,并在ODBC驱动管理器中注册。Windows 操作系统⾃带了ODBC驱动程序管理器, 可以在“控制⾯板->管理⼯具->ODBC数据源管理器” 到。
⼀、使⽤ODBC需要包含的头⽂件和库⽂件
ODBC头⽂件有5个:sql.h, sqlext.h, sqltypes.h, sqlucode.h and odbcinst.h。⼀般情况下⽤到sql.h 和sqlext.h。
#include "sql.h" // This is the the main include for ODBC Core functions. #include "sqlext.h" // This is the include for applications using the Microsoft SQL Extensions
#include "sqltypes.h" // This file defines the types used in ODBC
#include "sqlucode.h" // This is the unicode include for ODBC Core functions
#include "odbcinst.h" // This is the application include file for the SQL Server driver specific defines.
库⽂件:odbc32.lib
⼆、ODBC 应⽤的结构
图 2.1 ⼀个简单的 ODBC 应⽤的概念模型
输入一个长度介于0到5之间的字符串是什么
⼀个 ODBC 程序通常可以分为三个模块:初始化、数据库操作和资源释放。初始化模块主要完成数据库句柄的创建,环境参数的设置及连接到数据库等操作;数据库操作部分是整个程序的主体,主要完成与业务逻辑相关的数据库对象及数据的增、删、改、查等操作;资源释放模块主要包括数据库连接及资源的释放等。
1.初始化
初始化模块主要进⾏分配和初始化系统资源,为稍后的数据库操作做准备。具体包括Environment handle 和 Connection handle 的创建和初始化、连接到指定的数据源、全局
及连接属性的设置等。图 2.2 所⽰为初始化部分的⽰意图,图中虚线表⽰的是可选项,即可以⾃定义全局或连接属性,也可以不进⾏设置,使⽤系统的默认值。
图 2.2 初始化模块
(1)分配 handle:使⽤ SQLAllocHandle() 来统⼀分配 handle。
(2)设置和查询全局属性:使⽤ SQLSetEnvAttr() 和 SQLGetEnvAttr() 来设置和查询全局属性。
(3)设置和查询连接属性:使⽤ SQLSetConnectAttr() 和 SQLGetConnectAttr() 来设置和获得连接属性。
(4)连接到数据源:使⽤ SQLConnect() 或者 SQLDriverConnect() 连接到指定的数据源。SQLConnect 和SQLDriverConnect 都可以完成连接到数据库的功能,但是SQLDriverConnect 能够在连接时通过指定连接字符串进⾏更加详细的设置。
2.数据库操作
数据库操作模块包括是整个程序的主体 , 根据业务需求 , 完成对数据库对象的创建、修改、删除及数据的增、删、改、查等。⼀个基本的 ODBC 数据库操作由以下五步组成,如图 2.3 所⽰。
图 2.3 数据库操作⽰意图
(1)分配 Stmt handle:包括 Stmt handle 的创建,并根据需要对其属性进⾏设置,例如设置绑定参数类型,游标是否可滚动等。Stmt handle 是执⾏数据库操作的句柄,所有涉及数据库数据的操作都由 Stmt handle 来实现,同时也可以针对需求对某些数据库操作进⾏特殊的属性设置,如游标是否可滚动,隔离级别的设置等。Stmt handle 由 Connection handle 分配,⼀个Connection handle 可以分配同时多个 Stmt handle 来进⾏不同的操作。
(2)执⾏数据库操作。其中数据库操作主要包括数据库对象 ( 表、视图、存储过程、触发器等 ) 的操作 ( 创建、修改、删除 )和数据的操作 ( 增、删、改、查 ) 两部分。执⾏数据库操作有两种⽅法:
对于只执⾏⼀次的操作,使⽤直接执⾏的⽅法即可。使⽤ SQLExecDirect() 完成直接执⾏的操作。
对于在程序中可能重复执⾏的操作,通常使⽤先准备后执⾏的⽅法,这样只需⼀次准备多次执⾏即可,有效地提⾼了程序的运⾏效率。使⽤ SQLPrepare() 准备操作,使⽤SQLExecute() 来执⾏对应的操作。SQLPrepare() 的参数描述与SQLExecDirect() 相同,SQLExecute() 只有⼀个参数,即准备完毕的 Stmt handle。
(3)处理操作结果:当数据库操作不涉及到数据的返回时,只需要检查操作的返回码rc 即可。当数据
库操作为数据查询操作时,通常会返回符合查询条件的结果集,此时需要对查询结果进⾏处理。使⽤ SQLFetch () 、SQLExtendedFetch() 和SQLFetchScroll() 来得到返回结果。这三个 API 中,SQLFetch () 是最常⽤的 API ,每次调⽤返回⼀条数据,后两个可以通过设置返回结果集的⼤⼩和接收数组的⼤⼩来得到多条数据。
(4)事务提交或回滚:使⽤ SQLEndTran() 或 SQLTransact() 来完成事物的提交和回滚操作。推荐使⽤ ODBC3.0 标准 API SQLEndTran() 。在默认状态下,ODBC 会⾃动提交每⼀次数据库操作,即每⼀次数据库操作为⼀个事务。当需要改变事务提交模式时,可以通过设置 Connection handle 属性或者改变 ODBC INI ⽂件来实现。
(5)释放 Stmt handle:在成功执⾏数据库操作后,需要进⾏释放 Stmt handle。如果还有后续的数据库操作,可以返回到步骤(1)重新分配 Stmt handle 后进⾏。因为重⽤ Stmt handle,参数和返回结果不同的数据库操作时需要进⾏额外的设置,因此不推荐重⽤ Stmt handle 进⾏下⼀次操作。使⽤ SQLFreeHandle() 或 SQLFreeStmt() 来释放 Stmt handle,推荐使⽤ODBC3.0 API SQLFreeHandle()。
3.资源释放
主要包括断开数据库连接,释放 Connection 及 Environment handle 等操作。使⽤SQLDisconnect() 来断开数据库连接。该API 只有⼀个参数,即要释放的 Connection handle 变量,在释放数据库连接之前,
需要保证当前连接下所有的事务操作已经提交或回滚。释放后的 Connection handle 可以被重⽤进⾏下⼀次数据库连接。
三、使⽤ODBC当中⼏个重要API函数的解释
1.SQLAllocHandle
⽤途:创建ODBC句柄。
SQLRETURN SQLAllocHandle (
SQL SMALLINT HandleType, // 需要申请的句柄类型
SQLHANDLE InputHandle, // 输⼊句柄
SQLHANDLE * OutputHandlePtr); // 输出句柄,即在第⼀参数指定需要申请的句柄
参数1:⽤来指⽰要创建的句柄的类型,主要有
SQL_HANDLE_ENV 环境句柄
SQL_HANDLE_DBC 连接句柄
SQL_HANDLE_STMT 语句句柄
参数2:⽤来指⽰被创建句柄依据哪个句柄来创建,⼀般⽽⾔,创建环境句柄使⽤参数SQL_NULL_HANDLE,创建连接句柄的时候使⽤环境句柄作为依据,创建语句句柄的时候使⽤连接句柄作为依据。
参数3:⼀个指向将要被创建句柄数据结构的指针。
2.SQLSetEnvAttr
⽤途:设置环境属性。
参数描述
参数序号
参数名称参数类型参数描述
1
EnvironmentHandle
SQLHENV 当前程序的 Environment handle 变量
2
Attribute
SQLINTEGER
属性名称,具体包括:
当前 ODBC 版本 SQL_ATTR_ODBC_VERSION ,输出字符串终结符属性 SQL_ATTR_OUTPUT_NTS ,连接类型
SQL_ATTR_CONNECTTYPE 等。
3 ValuePtr SQLPOINTER
指向属性值变量的指针
4 StringLength
SQLINTEGER
当 value 为字符类型时,value 的字节长度当 value 不为字符类型时,则忽略此参数
3.SQLConnect
⽤途:连接到指定的数据源。
SQLRETURN SQLConnect (
SQLHDBC ConnectionHandle, // DBC 句柄,hdbc SQLCHAR * ServerName, // 为ODBC 的DSN 名称
SQLSMALLINT NameLength1, // 指明参数ServerName 的长度(可以⽤SQL_NTS) SQLCHAR * UserName, // 数据库⽤户名SQLSMALLINT NameLength2, // 指明参数UserName 的长度(可以⽤SQL_NTS) SQLCHAR * Authentication, // 数据库⽤户密码
SQLSMALLINT NameLength3) // 指明参数Authentication 的长度(可以⽤SQL_NTS)
注:SQL_NTS 表⽰输⼊参数是 null 为终结符的字符串。
4.SQLSetStmtAttr
⽤途:设置ODBC 光标类型。
SQLRETURN SQLSetStmtAttr (
SQLHSTMT StatementHandle, // STMT 句柄
SQLINTEGER Attribute, // 指定需要设置的属性类型 SQLPOINTER ValuePtr, // 提供的参数值
SQLINTEGER StringLength); // 指定参数的长度,当参数是整数时设置为 SQL_IS_INTEGER, 当参数是字符串是设置为字符串长度或者是SQL_NTS
函数SQLSetStmtAttr 可以让我们在ODBC 中可以使⽤不同的光标类型
(1)向前光标:SQL_CURSOR_FORWARD_ONLY,光标仅仅向前滚动。
(2)静态光标:SQL_CURSOR_STATIC,结果集的数据是静态的,这就是说明在执⾏查询后,返回的结果集的数据不会再改变,即使是有其他程序更新了数据库中的记录,结果集中的记录也不会发⽣改变。
(3)动态光标:SQL_CURSOR_DYNAMIC,在光标打开以后,当结果集中的⾏所对应的数据值发⽣变化时,其变化能够反映到光标所对应的结果集上,这些变化包括:字段的修改,添加,结果集中⾏的顺序变化。但是请注意如果⾏被删除则⽆法在当前结果集中反映出,因为被删除的⾏不再出现在当前的结果集中。动态光标所对应的结果集在数据发⽣变化时会被重建。例如,假设动态光标已获取到了两⾏,然后,另⼀应⽤程序更新了这两⾏中的⼀⾏,并删除了另⼀⾏,如果动态游标再试图获取那些⾏,它将不能检测已删除的⾏(因为当前结果集中只有⼀⾏,但是不要利⽤这个办法去检测被删除的⾏,因为出现这种情况还可能是因为⾏的数据被改变后不能再满⾜查询条件),⽽是返回已更新⾏的新值。
(4)键集光标:SQL_CURSOR_KEYSET_DRIVEN,和上⾯的动态光标所不同的是键集光标能够检测到⾏的删除和修改,但是⽆法检测到⾏的添加和结果集顺序变化。因为在光标创建时就创建了整个结果集,结果集合中记录和顺序已经被固定,这⼀点和静态光标⼀样。所以键集光标可以说是⼀种介于静态光标和动态光标之间的光标类型。
如:SQLSetStmtAttr (hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_KEYSET_DRIVEN, 0);
5.SQLPrepare
⽤途:为稍后的执⾏预处理⼀个 SQL 语句
SQLPrepare() 的参数描述与SQLExecDirect() 相同。
6.SQLBindParameter
⽤途: SQLBindParameter() 完成参数绑定的过程。
参数描述
参数名称参数类型参数描述
参数
序号
1 hstmt SQLHSTMT 进⾏绑定的 stmt handle 变量;
2 ipar SQLUSMALLINT 参数通配符的序号,从 1 开始计数;
3 fParamType SQLSMALLINT 参数类型:
SQL_PARAM_INPUT :输⼊参数;
SQL_PARAM_ONPUT :输出参数,主要⽤于 store procedure ;
SQL_PARAM_INPUT_OUTPUT :输⼊输出参数,主要⽤于 stored
procedure ;
4 fCType SQLSMALLINT 指定参数的 C 的类型,包括 SQL_C_FLOAT, ,SQL_C_LONG, ,SQL_C_SHORT ,SQL_C_TYPE_DATE ,SQL_C_TYPE_TIME 等。
更多的类型请参看
《DB2 Version 9.1 for z/OS ODBC Guide and Reference》
5 fSqlType SQLSMALLINT 指定参数的 SQL 类型,包括 SQL_DOUBLE , SQL_FLOAT ,SQL_GRAPHIC ,SQL_INTEGER 等。
更多的类型请参看
《DB2 Version 9.1 for z/OS ODBC Guide and Reference》
6 cbColDef SQLUINTEGER 参数的精度;
7 ibScale SQLSMALLINT 参数的 scale ;
8 rgbValue SQLPOINTER 指向绑定数据的指针;
9 cbValueMax SQLINTEGER 当绑定参数为 binary 或者 character 时,指定其字节长度;
10 pcbValue SQLINTEGER * 指向包含绑定数据长度变量的指针;
7.SQLExecDirect
⽤途:完成直接执⾏的操作。
参数说明
参数名称参数类型参数描述
参数序
1 hstmt SQLHSTMT Stmt handle 变量
2 sqlstmt SQLCHAR * 指向数据库操作变量的指针

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。