ODBC应用与流程概述

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.初始化环境
3.连接数据源
4.分配语句句柄
5.执行SQL语句
有无结果集
6.结果集处理
7.终止
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把查询结果绑定到应用程序缓冲区
SQLFetch/SQLFetchScroll移动游标获取结果集每一行数据
SQLClosecursor关闭游标
//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.终止处理
释放语句句柄
释放数据库连接
与数据库服务器断开
释放ODBC环境
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	//输入参数时指明数据的字节数大小
);
  • 31
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

去人777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值