ODBC 编程API
转的ODBC API函数详细说明。
看了一遍,没有问题。
使用 ODBC API 之前要用到的头文件和 LIB 库
#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 the unicode include for ODBC Core functions
#include "odbcss.h" // This is the application include file for the SQL Server driver specific defines.
#pragma coment(lib, "odbc32.lib")
ODBC API 的返回值
ODBC API 的返回值定义为: SQLRETURN 。 在成功时返回值为: SQL_SUCCESS , SQL_SUCCESS_WITH_INFO ; 在失败时返回错误代码。一点需要注意的是如果 ODBC 返回值为: SQL_SUCCESS_WITH_INFO 并不表明执行完全成功,而是表明执行成功但是 带有一定错误信息。当执行错误时 ODBC 返回的是一个错误信息的结果集,你需要遍历结果集合中所有行,这点和后面讲到的查询 SQL 语句执行结果集的思路很 类似。
SQL_SUCCESS的enum值为0, SQL_SUCCESS_WITH_INFO的enum值为1.所以你可以用返回值是否小于0来简单判断。
SQLAllocHandle 创建 ODBC 句柄
SQLRETURN SQLAllocHandle (
SQL SMALLINT HandleType, // 需要申请的句柄类型
SQLHANDLE InputHandle, // 输入句柄
SQLHANDLE * OutputHandlePtr); // 输出句柄,即在第一参数指定需要申请的句柄
第一参数 HandleType 的取值可以为:
1. SQL_HANDLE_ENV
2. SQL_HANDLE_DBC
3. SQL_HANDLE_STMT
注意判断返回值,看创建是否成功。
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)
例如:
SQLConnect (
hdbc,
(SQLTCHAR*)szDSN, SQL_NTS,
(SQLTCHAR*)szUserId, SQL_NTS,
(SQLTCHAR*)szPassword, SQL_NTS);
SQLExecDirect 直接执行 SQL 语句
SQLRETURN SQLExecDirect (
SQLHSTMT StatementHandle, // STMT 句柄
SQLCHAR * StatementText, // SQL 语句
SQLINTEGER TextLength) // 参数 StatementText 的长度,可以用 SQL_NTS
如果函数执行成功,你将会得到一个结果集,否则将返回错误信息。
获取 SQL 语句执行的结果
对 于 SQL 查询语句, ODBC 会返回一个光标,与光标对应的是一个结果集合(可以理解为一个表格)。开发人员利用光标来浏览所有的结果,你可以利用 ODBC API 函数移动光标,并且获取当前光标指向的行的列字段的数值。此外还可以通过光标来对光标当前所指向的数据进行修改,而修改会直接反映到数据库中。
SQLFetch 移动光标
SQLRETURN SQLFetch (SQLHSTMT StatementHandle);
在你调用 SQLExecDirect 执行 SQL 语 句后,你需要遍历结果集来得到数据。 StatementHandle 是 STMT 句柄,此句柄必须是被执行过。当调用 SQLFetch 函数后,光标会被移动到下一条记录处,当光标移动到记录集的最后一条,函数将会返回 SQL_NO_DATA 。
SQLGetData 得到光标处的某列的值
SQLRETURN SQLGetData (
SQLHSTMT StatementHandlem, // STMT 句柄
SQLUSMALLINT ColumnNumber, // 列号,以 1 开始
SQLSMALLINT TargetType, // 数据缓冲区( TargetValuePtr )的 C 语言类型
SQLPOINTER TargetValuePtr, // 数据缓冲区
SQLINTEGER BufferLength, // 数据缓冲区( TargetValuePtr )的长度
SQLINTEGER * StrLen_or_IndPtr); // 返回当前字段得到的字节长度
SQLBindCol 通过列绑定获得字段数据
SQLRETURN SQLBindCol (
SQLHSTMT StatementHandle, // STMT 语句
SQLUSMALLINT ColumnNumber, // 列号,以 1 开始
SQLSMALLINT TargetType, // 数据缓冲区( TargetValuePtr )的 C 语言类型
SQLPOINTER TargetValuePtr, // 数据缓冲区
SQLINTEGER BufferLength, // 数据缓冲区( TargetValuePtr )的字节长度
SQLINTEGER * StrLen_or_IndPtr); // 返回当前字段得到的字节长度
在从结果集中读取字段值时可以利用 SQLGetData ,但为了速度可以利用列绑定 (SQLBindCol) 的方式,在每次移动光标后让 ODBC 将数据传送到指定的变量中
SQLNumResultCols 得到结果集中列数
SQLRETURN SQLNumResultCols (
SQLHSTMT StatementHandle, // STMT 句柄
SQLSMALLINT * ColumnCountPtr); // 返回的列数
SQLRowCount 执行 SQL 语句后得到影响的行数
SQLRETURN SQLRowCount (
SQLHSTMT StatementHandle, // STMT 句柄
SQLINTEGER * RowCountPtr); // 被影响的数据的行数
你 可以通过 SQLExecDirect 执行 SQL 语句来插入,修改和删除数据,在执行插入,修改和删除的 SQL 语句后就可以通过 SQLRowCount 函数 来得到被影响的数据的行数。
SQLDescribeCol 得到结果集中列的描述
SQLRETURN SQLDescribeCol (
SQLHSTMT StatementHandle, // STMT 句柄
SQLSMALLINT ColumnNumber, // 需要得到的列的序号,从 1 开始计算
SQLCHAR * ColumnName, // 得到列的名称
SQLSMALLINT BufferLength, // 指明 ColumnName 参数的最大长度
SQLSMALLINT * NameLengthPtr, // 返回列名称的长度
SQLSMALLINT * DataTypePtr, // 返回列的 ODBC 数据类型,见表
SQLUINTEGER * ColumnSizePtr, // 返回列的长度
SQLSMALLINT * DecimalDigitsPtr, // 当列为数字类型时返回小数点后数据的位数
SQLSMALLINT * NullablePtr); // 指明该列是否允许空值
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_ATTR_QUERY_TIMEOUT |
设置一个合法的整数 |
SQL 语句执行时的超时秒数,设置为 0 表示无超时 |
SQL_ATTR_CURSOR_TYPE |
整数,取值为: |
设置光标的类型 |
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);
SQLFetchScroll 利用可滚动光标进行 查询
SQLRETURN SQLFetchScroll (
SQLHSTMT StatementHandle, // STMT 语句
SQLSMALLINT FetchOrientation, // 光标滚动的方式,见下表
SQLINTEGER FetchOffset); // 光标滚动的位置
前面介绍的 SQLFetch 函数只能够让光标向前移动,但在很多时候我们需要光标能够前后移动。我们需要利用另 一个函数 SQLFetchScroll ,但是再这之前请利用 SQLSetStmtAttr 正确设置光标类型。
FetchOrientation |
含 义 |
SQL_FETCH_NEXT |
滚动到下一行,这时候调用相当与 SQLFetch ,参数 FetchOffset 将被忽略 ( 用 0 值 ) |
SQL_FETCH_PRIOR |
滚动到上一行,参数 FetchOffset 将被忽略 ( 用 0 值 ) |
SQL_FETCH_FIRST |
滚动到第一行,参数 FetchOffset 将被忽略 ( 用 0 值 ) |
SQL_FETCH_LAST |
滚动到最后一行,参数 FetchOffset 将被忽略 ( 用 0 值 ) |
SQL_FETCH_ABSOLUTE |
滚动到参数 FetchOffset 指定的绝对行 |
SQL_FETCH_RELATIVE |
由当前位置滚动到参数 FetchOffset 指定的相对行, FetchOffset 大于 0 表示向前滚 动, FetchOffset 小于 0 表示向后滚动 |
用法示例会在接下来的文章里给出。
ODBC 编程API相关推荐
- Visual C++ 中的ODBC编程
Visual C++ 中的ODBC编程 ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序 ...
- c语言odbc编程,c语言之odbc编程指南c语言之odbc编程指南.doc
c语言之odbc编程指南c语言之odbc编程指南 ?摘要本文在介绍了ODBC(开放性数据库连接,Open? DataBase? Connectivity)运行机制的基础上,着重讨论了VisualC++ ...
- 【梳理】数据库系统概论 第8章 数据库编程 8.1 嵌入式SQL 8.2 过程化SQL 8.3 存储过程和函数 8.4 ODBC编程
教材:王珊 萨师煊 编著 数据库系统概论(第5版) 高等教育出版社 注:文档高清截图在后 第8章 数据库编程 标准SQL是非过程化的查询语言,操作统一.面向集合.功能丰富.使用简单.非过程化语言是相对 ...
- c语言sqlserver进行odbc编程,c语言之odbc编程指南.doc
c语言之odbc编程指南 ?摘要本文在介绍了ODBC(开放性数据库连接,Open? DataBase? Connectivity)运行机制的基础上,着重讨论了VisualC++2.0下利用ODBCAP ...
- ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析 . / // datadase odbc1.cpp : 定义应用程序的入口点. // #inc ...
- Visual C++中的ODBC编程实例
Visual C++中的ODBC编程实例 Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器.这些标准数据格式包括有:SQL Server.Acce ...
- Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)
不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...
- HBase编程 API入门系列之HTable pool(6)
HTable是一个比较重的对此,比如加载配置文件,连接ZK,查询meta表等等,高并发的时候影响系统的性能,因此引入了"池"的概念. 引入"HBase里的连接池" ...
- Visual C++中的ODBC编程
Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器.这些标准数据格式包括有:SQL Server.Access.Paradox.dBase.FoxP ...
最新文章
- matlab textsac函数,哈工大-Matlab--2013年春季学期《MATLAB语言及应用》试题
- 为什么程序员要学GC
- CREATE SEQUENCE添加自增序列及NEXT VALUE FOR返回序列号
- 数据库中间件MyCAT源码分析:调试环境搭建
- 计算机中心防雷电安全措施,防雷电有哪些安全措施
- diff 比较两个文件的差异
- android.mk添加静态库,Android Gradle添加静态库
- LaTex问题解决集[2]:解决插入Visio图片有多余边框和白边的问题
- 您的主机不满足在启用 Hyper-V 或 Device/Credential Guard 的情况下运行 VMware Workstation 的最低要求
- 一名淘宝店长运营店铺靠谱指南
- 单细胞测序流程(二)数据整理
- Android开发:基站定位
- Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化
- 对话哈佛大学教授Lukin:量子计算将在我们有生之年普及! | AI英雄
- 一图必通 | 计网~TCP、IP
- Android案例手册 - 定位点圆形水波纹和椭圆水波纹
- 【OPC UA】C# 通过OpcUaHelper建立OPC客户端访问KEPServerEx6 OPC服务器数据
- 5.5 listen() --- 如果有“人”,请叫我?
- python爬虫数据挖掘_Python网页爬虫文本处理科学计算机器学习数据挖掘兵器谱...
- unity+opencv实时检测人脸及眼睛区域检测
热门文章
- 项目整体管理(6个过程:制定项目章程,制定项目管理计划,指导与管理项目工作,实施整体变更控制,结束项目或阶段)
- HDU 6595. Everything Is Generated In Equal Probability (期望+逆元)
- DB2 常用执行语句及命令
- 最短路径-迪杰斯特拉(Dijkstra)
- 我的极限Scrum实践
- windows bitlocker 控制台加密、解密脚本
- 【Android初级】什么是ANR?如何防止?如何修复?
- AGNES 数据挖掘算法 C语言
- 星起航:短视频内容的流量迸发让电商渠道看到了新的趋势
- Go面向对象编程的三大特性