C++中对ODBC的API详解和使用

2023-11-05

本文构成:定义、API、实例,实例在最下面

一、ODBC

1、定义

即开放数据库连接(Open Database Connectivity,ODBC)是数据库API的规范。该API独立于任何一个DBMS或操作系统,是为解决异构数据库间的数据共享而产生的。

2、作用

  • ODBC为异构数据库访问提供统一接口,允许应用程序以SQL为数据存取标准,存取不同DBMS管理的数据;
  • 使应用程序直接操纵DB中的数据,免除随DB的改变而改变。用ODBC可以访问各类计算机上的DB文件,甚至访问如Excel表和ASCII数据文件这类非数据库对象。

3、API

句柄介绍

3.1 句柄类型
类型 参数
申请环境句柄 SQL_HANDLE_ENV
申请连接句柄 SQL_HANDLE_DBC
申请描述符句柄 SQL_HANDLE_DESC
申请语句句柄 SQL_HANDLE_STMT
3.2 句柄分配
申请类型 提供类型
SQL_HANDLE_ENV SQL_NULL_HANDLE
SQL_HANDLE_DBC 必须是环境句柄
SQL_HANDLE_STMT 必须是连接句柄
SQL_HANDLE_DESC 必须是连接句柄

SQLAllocHandle

分配句柄
SQLRETURN SQLAllocHandle(  
      SQLSMALLINT   HandleType,  
      SQLHANDLE     InputHandle,  
      SQLHANDLE *   OutputHandlePtr);  
参数 类型 含义
HandleType 输入变量 需要从句柄类型中选择一个参数
InputHandle 输入变量 要在其上下文中分配新句柄的输入句柄,按句柄分配规则
OutputHandlePtr 输出变量 指向缓冲区的指针,在该缓冲区中返回新分配数据结构的句柄。

SQLSetEnvAttr

设置数据库环境各个方面的属性
SQLRETURN SQLSetEnvAttr(  
     SQLHENV      EnvironmentHandle,  
     SQLINTEGER   Attribute,  
     SQLPOINTER   ValuePtr,  
     SQLINTEGER   StringLength);  
参数 类型 含义
EnvironmentHandle 输入参数 环境句柄
Attribute 输入参数 要设置的属性,列在“注释”中。
ValuePtr 输入参数 指向要与Attribute关联的值的指针。根据Attribute的值,ValuePtr将是一个 32 位整数值或指向一个以空字符结尾的字符串。
StringLength 输入参数 如果ValuePtr指向字符串或二进制缓冲区,则此参数应为 * ValuePtr的长度。对于字符串数据,此参数应包含字符串中的字节数。如果ValuePtr是整数,则忽略StringLength。

SQLConnect

建立到驱动程序和数据源的连接。连接句柄引用存储有关连接到数据源的所有信息,包括状态、事务状态和错误信息。
SQLRETURN SQLConnect(  
     SQLHDBC        ConnectionHandle,  
     SQLCHAR *      ServerName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      UserName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      Authentication,  
     SQLSMALLINT    NameLength3);  
参数 类型 含义
ConnectionHandle 输入参数 连接句柄
ServerName 输入参数 数据源名称。数据可能与程序位于同一台计算机上,也可能在另一台计算机上。
NameLength1、2、3 输入参数 ServerName、UserName、身份验证的字符长度
UserName 输入参数 用户标识符
Authentication 输入参数 身份验证字符串(通常是密码)

SQLSetConnectOption

在ODBC3.x中,ODBC2.0函数SQLSetConnectOption已被SQLSetConnectAttr取代,参阅SQLSetConnectAttr。

SQLExecDirect

执行一条准备的语句,如果语句中存在任何参数,则使用参数标记变量的当前值。SQLExecDirect是提交一次性执行的 SQL语句的最快方式。
SQLRETURN SQLExecDirect(  
     SQLHSTMT     StatementHandle,  
     SQLCHAR *    StatementText,  
     SQLINTEGER   TextLength);  
参数 类型 含义
StatementHandle 输入参数 语句句柄
StatementText 输入参数 要执行的 SQL 语句
TextLength 输入参数 StatementText的字符长度

SQLFetch

从结果集中获取下一个数据行集并返回所有绑定列的数据
SQLRETURN SQLFetch(  
     SQLHSTMT     StatementHandle); 
参数 类型 含义
StatementHandle 输入参数 语句句柄

SQLGetData

检索指定列的内容,并将结果返回给该函数的第4个参数(TargetValuePtr)
SQLRETURN SQLGetData(  
      SQLHSTMT       StatementHandle,  
      SQLUSMALLINT   Col_or_Param_Num,  
      SQLSMALLINT    TargetType,  
      SQLPOINTER     TargetValuePtr,  
      SQLLEN         BufferLength,  
      SQLLEN *       StrLen_or_IndPtr);  
参数 类型 含义
StatementHandle 输入参数 句柄,使用连接句柄分配的OutputHandlePtr
Col_or_Param_Num 输入参数 对于检索列数据,它是要返回其数据的列数。 结果集列按从 1 开始增加列顺序进行编号。 书签列是列号 0;这只能在启用书签时指定。
TargetType 输入参数 TargetValuePtr 缓冲区的 C数据类型 的类型标识符。
TargetValuePtr 输出参数 指向要返回数据的缓冲区的指针, TargetValuePtr不能为NULL
BufferLength 输入参数 TargetValuePtr 缓冲区的长度(以字节为单位)
在返回可变长度的数据(如字符或二进制数据)时,驱动程序使用 BufferLength 避免写入 * TargetValuePtr 缓冲区的末尾。 请注意,将字符数据返回到 * TargetValuePtr 时,驱动程序会计算 null 终止字符。 因此,TargetValuePtr 必须包含 null 终止字符的空间,否则驱动程序将截断数据。 当驱动程序返回固定长度的数据(如整数或日期结构)时,驱动程序将忽略 BufferLength, 并假定缓冲区足够大以容纳数据。
StrLen_or_IndPt 输出参数 指向要返回长度或指示器值的缓冲区的指针
如果这是空指针,则不返回长度或指示器值。 当正在提取的数据为 NULL 时,这会返回错误。

SQLEndTran

请求对与连接关联的所有语句上的所有活动操作执行提交或回滚操作。
SQLEndTran还可以请求对与环境关联的所有连接执行提交或回滚操作。
SQLRETURN SQLEndTran(  
     SQLSMALLINT   HandleType,  
     SQLHANDLE     Handle,  
     SQLSMALLINT   CompletionType);  
参数 类型 含义
HandleType 输入参数 句柄类型标识符。
包含 SQL_HANDLE_ENV(如果Handle是环境句柄)或 SQL_HANDLE_DBC(如果Handle是连接句柄)。
Handle 输入参数 句柄,类型由HandleType指示,表示事务的范围。
CompletionType 输入参数 可选: SQL_COMMIT(提交)、 SQL_ROLLBACK(回滚)

SQLFreeStmt

停止与特定语句关联的处理,关闭与该语句关联的所有打开的游标,丢弃挂起的结果,或者(可选)释放与语句句柄关联的所有资源。
SQLRETURN SQLFreeStmt(  
     SQLHSTMT       StatementHandle,  
     SQLUSMALLINT   Option);  
参数 类型 含义
StatementHandle 输入参数 语句句柄(连接句柄)
Option 输入参数 SQL_CLOSE、SQL_DROP、SQL_UNBIND、SQL_RESET_PARAMS(具体含义见下表)
Option参数选择详情解析
参数 含义
SQL_CLOSE 关闭与StatementHandle关联的游标(如果已定义)并丢弃所有未决结果。应用程序可以稍后通过使用相同或不同的参数值再次执行SELECT语句来重新打开此游标。如果未打开游标,则此选项对应用程序无效。也可以调用 SQLCloseCursor来关闭游标。
SQL_DROP 不推荐使用此选项。对带有SQL_DROP选项的SQLFreeStmt的调用在驱动程序管理器中映射到SQLFreeHandle。
SQL_UNBIND 将 ARD 的 SQL_DESC_COUNT 字段设置为 0,为给定的StatementHandle释放由SQLBindCol绑定的所有列缓冲区。这不会解除书签列的绑定。
SQL_RESET_PARAMS 将 APD 的 SQL_DESC_COUNT 字段设置为 0,释放SQLBindParameter为给定StatementHandle设置的所有参数缓冲区。如果在一个被多个语句共享的显式分配的描述符上执行此操作,则此操作将影响共享该描述符的所有语句的绑定。

SQLDisconnect

关闭与特定连接句柄关联的连接。
SQLRETURN SQLDisconnect(  
     SQLHDBC     ConnectionHandle);  
参数 类型 含义
ConnectionHandle 输入参数 分配的连接句柄

SQLFreeHandle

释放与特定环境、连接、语句或描述符句柄相关联的资源
此函数是用于释放句柄的通用函数,取代了 ODBC 2.0 函数SQLFreeConnect(用于释放连接句柄)和SQLFreeEnv(用于释放环境句柄)。
SQLFreeConnect和SQLFreeEnv在 ODBC 3*.x* 中均已弃用。
SQLFreeHandle还替换了 ODBC 2.0 函数SQLFreeStmt(带有 SQL_DROP Option)以释放语句句柄。
SQLRETURN SQLFreeHandle(  
     SQLSMALLINT   HandleType,  
     SQLHANDLE     Handle);
参数 类型 含义
HandleType 输入参数 释放的句柄类型,和分配的句柄类型要求一致
Handle 输入参数 要释放的句柄

4、实例

· 准备工作,将数据库环境和连接设置完毕
	//环境句柄
	HANDLE henv=NULL;
	//连接句柄
	HANDLE hdbc=NULL;
	//创建环境句柄
	SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,henv);
	//设置环境参数
	SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
	//创建连接句柄
	SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
	//连接一个数据源(数据库名称(test数据库),访问数据库的用户名root、密码123456)
	//SQL_NTS代表字符串长度
	SQLConnect(hdbc,"test",SQL_NTS,
		"root",SQL_NTS,"123456",SQL_NTS);
	//设置连接数据源的可选项,是否自动提交
	SQLSetConnectOption(hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
· 开始数据库的增删改查操作
	//定义接受的结构体
	struct USER_INFO
	{	
		unsigned char Name;
		unsigned int ID;
	};
	//定义句柄
 	HANDLE hstmt;
 	//定义执行语句的返回值
 	int retcode;
 	//分配连接句柄
	SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
	//拷贝sql语句到Statement
	strcpy((char *)Statement,"SELECT * FROM users");
	//执行数据库SQL语句
	SQLExecDirect(hstmt,Statement,SQL_NTS);
	while(TRUE)
	{
		//绑定数据访问的每一行
		retcode = SQLFetch(hstmt);
		//如果数据找不到,退出
		if(retcode==SQL_NO_DATA_FOUND)
		{
			break;
		}
		//查找数据成功
		if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)
		{
			//定于接受数据的指针变量pUserInfo
			USER_INFO *pUserInfo = new USER_INFO;
			//初始化pUserInfo
			memset(pUserInfo, 0, sizeof(USER_INFO));
			//获取第一列的数据返回给pUserInfo->Name
			SQLGetData(hstmt,1,SQL_C_CHAR,pUserInfo->Name,SQL_NTS,&value);
			SQLGetData(hstmt,2,SQL_C_SLONG,&pUserInfo->GroupID,SQL_NTS,&value);
		}
	}
	//请求对与连接关联的所有语句上的所有活动操作执行提交
	SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
	//停止与特定语句关联的处理,关闭与hstmt语句关联的所有打开的游标
	SQLFreeStmt(hstmt,SQL_CLOSE);
	if(hstmt!=NULL)
	{
		//释放与特定环境、连接、语句或描述符句柄相关联的资源
		SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
	}
	return;
· 结束数据库操作,断开连接,释放内存
	//结束数据库操作
	if(hdbc!=NULL)
	{
		//断开连接
		SQLDisconnect(mibhandle.hdbc);
		//释放连接句柄
		SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
	}
	if(henv!=NULL)
	{
		//释放环境句柄
		SQLFreeHandle(SQL_HANDLE_ENV,henv);
	}
	//重新初始化
	hdbc=NULL;
	henv=NULL;
	return;
Tip:其他的增加、删除、更新操作一致,只是SQL语句不同,不再重复

参考文献:Microsoft 开放式数据库连接 (ODBC)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中对ODBC的API详解和使用 的相关文章

  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 是否可以从子查询中获取多个值?

    有没有办法让子查询在oracle db中返回多列 我知道这个特定的sql会导致错误 但它很好地总结了我想要的 select a x select b y b z from b where b v a v from a 我想要这样的结果 a
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • 深入理解java虚拟机【并发编程缓存】

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 随着多核CPU的高速发展 为了充分利用硬件的计算资源 操作系统的并发多任务功能正变得越来越重要 但是CPU在进行计算时 还需要从内存读取输出 并 将计算结果存放到内存中 然
  • 【华为OD机试】分苹果(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • 闲聊:自动化到底是干什么的?

    很多人会问 自动化到底是干什么的 也许是因为这个专业所要学习和掌握的知识太庞杂了 以至于自动化被称之为万能胶 干什么都行 却又都不专业 很大一部分同学上到大二大三还不知道自己具体能做什么 迷茫中便选择了转行 希望还在迷茫中的低年级的同学看了
  • C++11变长模板解析(深入理解C++11)

    参考自 深入理解C 11 变长模版 变长函数和变长的模版参数 变长函数 double sum int n 求n个double数据之和 double sum 0 va list args 接受输入数据的数据结构 需声明stdarg h va
  • 3D游戏设计作业9:游戏智能

    坦克对战游戏 AI 设计 游戏截图 1 作业要求 从商店下载游戏 Kawaii Tank 或 其他坦克模型 构建 AI 对战坦克 具体要求 使用 感知 思考 行为 模型 建模 AI 坦克 场景中要放置一些障碍阻挡对手视线 坦克需要放置一个矩
  • python 点名程序(随机点名不重复 可定义名字列表 语音播报 免费下载 多线程打包)

    python点名小程序 含有 调用windows本地语音播报 python多线程打包 等小技巧 软件获取 点击下方地址直接下载压缩包 免费为大家提供 软件获取地址 大家拿了软件别忘了给博主一个免费的赞 谢谢 解压压缩包 里面的MyAPP e
  • 配置和美化Arch Linux

    前面说了如何安装一个最小化的Arch Linux 现在来说说如何配置 配置网络 如果使用有线网络的话 将dhcp服务开机启动 systemctl enable dhcpcd 如果使用无线网络的话 使用wifi menu命令连接网络 如果在使
  • Base64图片上传

    文章目录 1 图片上传样式写法 2 Js写法 1 图片上传样式写法 div class form group div
  • python+OpenCV图像处理(五)图像的阈值分割

    图像的阈值处理 一幅图像包括目标物体 背景还有噪声 要想从多值的数字图像中直接提取出目标物体 常用的方法就是设定一个阈值T 用T将图像的数据分成两部分 大于T的像素群和小于T的像素群 这是研究灰度变换的最特殊的方法 称为图像的二值化 Bin
  • 分号与逗号的区别及举例_顿号与逗号与分号间的区别是什么?

    逗号把句子切分为意群 表示小于分号大于顿号的停顿 而逗号有哪些用法呢 以下是由小编整理关于逗号如何使用的内容 希望大家喜欢 逗号汉语用法句子内部主语与谓语之间如需停顿 用逗号 例如 我们看得见的星星 绝大多数是恒星 句子内部动词与宾语之间如
  • STM32设置为I2C从机模式

    STM32设置为I2C从机模式 目录 STM32设置为I2C从机模式 前言 1 硬件连接 2 软件编程 3 运行测试 3 1 I2C连续写入 3 2 I2C连续读取 3 3 I2C单次读写测试 4 总结 前言 STM32的I2C作为主机的情
  • pentaho安装

    注意 以下图片文字中的org mysql一律改为com mysql 1 pentaho社区版下载地址 https sourceforge net projects pentaho 2 下载以下两个文件 3 biserver ce 6 1 0
  • JMeter 设置请求头信息的详细步骤

    在使用 JMeter 的过程中 我们会遇到需要设置请求头信息的场景 比如 POST 传过去的 Body 数据是 json 格式的 需要填添加头信息 Content Type application json 在 header 中用 toke
  • python中错误Reshape your data either using array.reshape(-1, 1)

    1 错误 Traceback most recent call last File Users yuanbao PycharmProjects EnsembleLearning KNeighbors py line 16 in
  • 数据控制类别(CC1和CC2)——DO-178B/ED-12B学习笔记之七

    数据控制类别 CC1和CC2 DO 178B ED 12B学习笔记之七 为了理解数据控制类别 CC1和CC2 的定义 先看DO 178B的7 3条 原文 Software life cycle data can be assigned to
  • NUC980开源项目27-you should not run configure as root

    上面是我的微信和QQ群 欢迎新朋友的加入 项目码云地址 国内下载速度快 https gitee com jun626 nuc980 open source project 项目github地址 https github com Jun117
  • Shiro实战学习笔记(2)-自定义Realm

    1 自定义realm package org tzb realm import org apache shiro authc AuthenticationException import org apache shiro authc Aut
  • float32精度_模型压缩一半,精度几乎无损,TensorFlow推出半精度浮点量化工具包,还有在线Demo...

    鱼羊 发自 凹非寺 量子位 报道 公众号 QbitAI TensorFlow模型优化工具包又添一员大将 训练后的半精度浮点量化 float16 quantization 工具 有了它 就能在几乎不损失模型精度的情况下 将模型压缩至一半大小
  • 无监督学习K-means文本聚类实践

    无监督学习 Unsupervised Learning 希望能够发现数据本身的规律和模式 与有监督学习相比 无监督不需要对数据进行标记 这样可以节约大量的人力物力成本 某种程度上说 机器学习的终极目标就是无监督学习 从功能上看 无监督学习可
  • C++中对ODBC的API详解和使用

    本文构成 定义 API 实例 实例在最下面 一 ODBC 1 定义 即开放数据库连接 Open Database Connectivity ODBC 是数据库API的规范 该API独立于任何一个DBMS或操作系统 是为解决异构数据库间的数据