ODBC应用与流程概述
概述
ODBC是微软公司开放服务体系中有关于数据库的一个组成部分;
提供了一组访问数据库的应用程序编程接口(API)
其作用是在不同厂家提供的数据库系统中屏蔽差异,方便我们管理不同的数据库,规范关系数据库管理系统内应用接口
体系结构
1.用户应用程序
2.ODBC驱动程序管理器
3.数据库驱动程序
4.数据源
1.用户应用程序
1.请求连接数据库
2.断开与数据源的连接
3.操作数据库以及获取数据库的执行状态
向数据源发送SQL语句
为SQL语句执行结果分配存储空间,定义所读取的数据格式
获取数据库操作结果或错误信息
进行数据处理并向用户提交处理结果
请求事务的提交和回滚操作
2.ODBC驱动程序
3.数据库驱动程序
厂商提供
ODBC API
连接句柄:连接某一个数据源的指针
语句句柄:执行SQL语句
环境句柄:管理多个连接句柄
每个ODBC应用程序需要一个环境句柄,一个环境句柄对应多个连接句柄,一个连接句柄对应多个语句句柄
ODBC标准数据类型
SQL数据类型:用于数据源
C数据类型:用于程序C代码
ODBC的工作流程
1.配置数据源
2.初始化环境
环境句柄
声明环境句柄变量
SQLHENV henv;//Handle environment
创建环境句柄变量
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//类型:环境句柄, 来源:无, 环境句柄地址
//专用环境句柄创建(从ODBC 2.x开始已被取代)
SQLAllocEnv(&henv);
初始化环境句柄变量
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,0);
3.建立连接
连接句柄
声明连接句柄
SQLHDBC hdbc;//handle database connect
创建连接句柄
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//类型:连接句柄,来源:环境句柄,连接句柄地址
//专用创建连接句柄(从ODBC 2.x开始已被上取代)
SQLAllocConnect(henv, &hdbc);
初始化连接句柄变量:连接实现创建的数据源
SQLConnect(hdbc, "DNS-NAME", SQL_NTS, "SYSTEM", SQL_NTS, "MANAGER", SQL_NTS)
// 数据源名称 用户名 密码
// Null-Terminated String,计算前面null结尾的字符串长度的长度
4.分配语句句柄
语句句柄
声明语句句柄变量
SQLHSTMT hstme;//Handle Statement
创建语句句柄变量
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//专用创建语句句柄(从ODBC 2.x开始已被上取代)
SQLAllocStmt(hdbc, &hstmt);
初始化语句句柄变量:设置语句句柄的属性
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)SQL_BIND_BY_COLUMN,
//语句句柄 行方向绑定 列方向绑定
SQL_IS_INTEGER);
//长度
5.执行SQL语句
直接执行
SQLExecDirect(hstmt, "SELECT * FROM STUDENT", SQL_NTS);
预处理执行(用于批量语句执行)
SQLPrepare(hstmt, "INSERT INTO STUDENT(SNO, SNAME, SSEX, SAGE, SDEPT) VALUES ('2020211304', '白涛', '男', 21, 'CS')", SQL_NTS);
SQLPrepare(hstmt, "INSERT INTO STUDENT(SNO, SNAME, SSEX, SAGE, SDEPT) VALUES ('2020211306', '樊谦益', '男', 20, 'CS')", SQL_NTS);
SQLExecute(hstmt);//这里一次性将前两条都执行了
当SQL语句有参数时,应用程序为每个参数调用SQL_BindParameter, 并把它们绑定至应用程序变量
SQLPrepare(hstmt, "INSERT INTO STUDENT(SNO, SNAME) VALUES (?, ?)", SQL_NTS);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, SNO_LEN, 0, sSno, 0,
//第一个 参数
&SQL_NTS);
SQLBindParameter(serverhstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, SNAME_LEN,
//第二个
0, sSname, 0, &SQL_NTS);
//参数
SQLExecute(hstmt);
应用程序根据语句类型进行的处理
有结果集的语句(select或是编目函数),则进行结果集处理
没有结果集,可以直接利用本语句句柄继续执行新的语句或是获取行计数(本次执行所影响行数)之后继续执行
6.结果集处理
ODBC中使用游标来处理结果集数据
ODBC中游标类型:
Forward-only游标, ODBC默认游标类型
Scroll游标
静态(static)
动态(dynamic)
码集驱动(keyset-driven)
混合型(mixed)
//SQLBindCol把查询结果绑定到应用程序缓冲区
SQLBindCol(hstmt, 1, SQL_C_CHAR, sSno, SNO_LEN, &SQLINTEGER);
SQLBindCol(hstmt, 2, SQL_C_CHAR, sName, NAME_LEN, &SQLINTEGER);
SQLBindCol(hstmt, 3, SQL_C_CHAR, sSex, SSex_LEN, &SQLINTEGER);
SQLBindCol(hstmt, 4, SQL_C_LONG, &sAge, 0, &SQLINTEGER);
SQLBindCol(hstmt, 5, SQL_C_CHAR, sDepart, DEPART_LEN, &SQLINTEGER);
//通过SQLFetch移动游标获取结果集中的每一行数据
while((ret = SQLFetch(hstmt)) != SQL_NO_DATA_FOUND)
process(sSno, sName, sSex, sAge, sDepart);//此处process代表数据处理函数,非标识符
7.终止处理
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
//同样有专用语句,均已被取代
SQLFreeStmt(hstmt, SQL_CLOSE);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
附录:ODBC API函数
执行时用到的
SQL_BindParameter(
SQLHSTMT StatementHandle, //执行SQL的语句句柄
SQLUSMALLINT ParameterNumeber, //指明变量与第几个参数绑定,parameter:参数
SQLSMALLINT InputOutputType, //指明是输入还是输出参数
SQLSMALLINT ValueType, //指明用于和参数绑定的C语言数据类型
SQLSMALLINT ParameterType, //指明SQL数据类型
SQLUINTEGER ColumnSize, //指明接受数据宽度
SQLSMALLINT DecimalDigits, //特殊:在某些数据类型时指明小数点精度,平常为0
SQLPOINTER ParameterValuePtr, //输入时指明参数的指针,输出时指明接收数据的变量的指针
SQLINTEGER BufferLength, //指明参数指针指向缓冲区大小,整数和浮点数设置为0
SQLINTEGER* StrLen_or_IndPtr //输入参数时指明数据的字节数大小
);