应用程序使用 ODBC 访问数据源,可以按照以下几个基本步骤进行:
1. 调用函数 SQLAllocHandle 申请环境、连接句柄,调用函数 SQLSetEnvAttr 设置环
境句柄属性,调用函数 SQLSetConnectAttr 设置连接句柄属性,调用连接函数
SQLConnect、SQLDriverConnect 或 SQLBrowseConnect 连接相关的数据源;
2. 调用函数 SQLAllocHandle 申请语句句柄,通过语句句柄应用程序可以执行 SQL 语
句进行相关的 SQL 操作。调用函数 SQLPrepare 对 SQL 语句和操作进行准备,调
用 SQLDescribeCol、SQLDescribeParam 等函数取得相关的描述信息,依据描述信
息调用 SQLBindCol、SQLBindParam 等函数绑定相关的列和参数,然后调用
SQLExecute 执行 SQL 语句,实现相关的 SQL 操作。应用程序也可以调用函数
SQLExecDirect 直接执行 SQL 语句进行相关的 SQL 操作;
3. 应用程序可以通过调用 ODBC 编目函数 SQLTables、SQLColumns、SQLStatistics
等取得数据源相关的字典信息;
4. 如果连接属性自动提交选项设置为手动提交状态,应用程序可以调用函数
SQLEndTran 来提交或回滚事务,进行相关的事务处理;
5. 调用函数 SQLFreeHandle 来释放申请的语句句柄;
6. 调用函数 SQLDisconnect 来断开应用程序与数据源之间的连接;
7. 调用函数 SQLFreeHandle 来释放申请的连接、环境句柄。
使用 ODBC 编程的基本步骤如图 3.9 所示:
#include <windows.h> #include <stdio.h> #include <sql.h> #include <sqltypes.h> #include <sqlext.h> /* 检测返回代码是否为成功标志,当为成功标志返回 TRUE,否则返回 FALSE */ #define RC_SUCCESSFUL(rc) ((rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO) /* 检测返回代码是否为失败标志,当为失败标志返回 TRUE,否则返回 FALSE */ #define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc))) HENV henv; /* 环境句柄 */ HDBC hdbc; /* 连接句柄 */ HSTMT hsmt; /* 语句句柄 */ SQLRETURN sret;/* 返回代码 */ char szpersonid[11]; /*人员编号*/ SQLLEN cbpersonid=0; char szname[51]; /*人员姓名*/ SQLLEN cbname=0; char szphone[26]; /*联系电话*/ SQLLEN cbphone=0; void main(void) { /* 申请一个环境句柄 */ SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv); /* 设置环境句柄的 ODBC 版本 */ SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); /* 申请一个连接句柄 */ SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); SQLConnect(hdbc, (SQLCHAR *)"DM", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS); /* 申请一个语句句柄 */ SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hsmt); /* 立即执行查询人员信息表的语句 */ SQLExecDirect(hsmt, (SQLCHAR *)"SELECT personid, name, phone FROM person.person;", SQL_NTS); /* 绑定数据缓冲区 */ SQLBindCol(hsmt, 1, SQL_C_CHAR, szpersonid, sizeof(szpersonid), &cbpersonid); SQLBindCol(hsmt, 2, SQL_C_CHAR, szname, sizeof(szname), &cbname); SQLBindCol(hsmt, 3, SQL_C_CHAR, szphone, sizeof(szphone), &cbphone); /* 取得数据并且打印数据 */ printf("人员编号 人员姓名 联系电话\n"); for (;;) { sret = SQLFetchScroll(hsmt, SQL_FETCH_NEXT, 0); if (sret == SQL_NO_DATA_FOUND) break; printf("%s %s %s\n", szpersonid, szname, szphone); } /* 关闭游标,终止语句执行 */ SQLCloseCursor(hsmt); /* 释放语句句柄 */ SQLFreeHandle(SQL_HANDLE_STMT, hsmt); /* 断开与数据源之间的连接 */ SQLDisconnect(hdbc); /* 释放连接句柄 */ SQLFreeHandle(SQL_HANDLE_DBC, hdbc); /* 释放环境句柄*/ SQLFreeHandle(SQL_HANDLE_ENV, henv); }
评论