ODBC API参考资料 联系客服

发布时间 : 星期三 文章ODBC API参考资料更新完毕开始阅读fabe74ec6294dd88d0d26b70

使用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 \This is the the main include for ODBC Core functions. #include \This is the include for applications using the Microsoft SQL Extensions

#include \

#include \#include \driver specific defines.

库文件:odbc32.lib

二、ODBC 应用的结构

图 2.1 一个简单的 ODBC 应用的概念模型

一个 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 等。

SQLPOINTER

SQLINTEGER

3 ValuePtr 指向属性值变量的指针

4 StringLength

当 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中可以使用不同的光标类型

Attribute ValuePtr 整数,取值为: SQL_ATTR_ASYNC_ENABLE SQL_ASYNC_ENABLE_OFF, SQL_ASYNC_ENABLE_ON 是否使用异步执行功能 作用