unixODBC编程(三)查询数据库表中的数据

连接数据库成功后,就可以对数据库进行操作了,我们先看一下怎样从数据库表中查询数据。查询数据在ODBC中也有几个步骤。

1. 分配一个语句句柄,使用SQLAllocHandle()函数,句柄类型为SQL_HANDLE_STMT。

2. 准备语句,使用SQLPrepare()函数。

3. 执行语句,使用SQLExecute()函数。

4. 绑定输出的变量,使用SQLBindCol()函数。

5. 循环取回结果集数据,使用SQLFetch()函数。

下面看看这几个函数的原型和参数。

准备语句函数。

SQLRETURN SQLPrepare(
     SQLHSTMT       StatementHandle,
     SQLCHAR *       StatementText,
     SQLINTEGER    TextLength);

StatementHandle是一个输入参数,语句句柄。

StatementText是一个输入参数,SQL文本字符串。

TextLength是一个输入参数,SQL文本字符串 StatementText 的长度。

执行语句函数。

SQLRETURN SQLExecute(
     SQLHSTMT     StatementHandle);

StatementHandle是一个输入参数,语句句柄。

绑定输出变量函数。

SQLRETURN SQLBindCol(
      SQLHSTMT           StatementHandle,
      SQLUSMALLINT   ColumnNumber,
      SQLSMALLINT      TargetType,
      SQLPOINTER        TargetValuePtr,
      SQLLEN                 BufferLength,
      SQLLEN *               StrLen_or_IndPtr);

StatementHandle是一个输入参数,语句句柄。

ColumnNumber是一个输入参数,要绑定的结果集列的序号。列从 0 开始递增编号,其中列 0 是书签列。如果没有使用书签列,则列号从 1 开始。

TargetType是一个输入参数,是TargetValuePtr 缓冲区的 C 数据类型。

TargetValuePtr是一个输入/输出参数,指向要绑定到列的数据缓冲区的指针。

BufferLength是一个输入参数,TargetValuePtr 缓冲区的长度(以字节为单位)。

StrLen_or_IndPtr是一个输入/输出参数,指向要绑定到列的长度/指示器缓冲区的指针。

取回结果集中数据的函数。

SQLRETURN SQLFetch(
     SQLHSTMT     StatementHandle);

StatementHandle是一个输入参数,语句句柄。

现在来看一个例子,连接到数据库后,从user_table中查询表名,表空间名和表的状态。SQL语句为select table_name, tablespace_name, status from user_tables。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sql.h"
#include "sqlext.h"
#include "sqltypes.h"SQLHANDLE       envh;           /* env handle */
SQLHANDLE       dbch;           /* connect handle */
SQLHANDLE       stmth;          /* statement handle */int main(int argc, char *argv[])
{int         conn = 0;SQLRETURN   rc;SQLLEN      rlen1;SQLLEN      rlen2;SQLLEN      rlen3;char        dsn_str[32];char        usrname[32];char        passwd[32];char        table_name[256];char        ts_name[32];char        status[16];/* 从命令行参数中输入数据源名称,数据库用户名和密码 */if (argc < 3) {fprintf(stderr, "usage: %s dsn username password\n", argv[0]);return (-1);}strncpy(dsn_str, argv[1], 32);dsn_str[31] = '\0';strncpy(usrname, argv[2], 32);usrname[31] = '\0';strncpy(passwd, argv[3], 32);passwd[31] = '\0';/* 分配环境句柄 */rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &envh);if (rc != SQL_SUCCESS) {fprintf(stderr, "Allocate environment handle error.\n");return (-1);}/* 设置ODBC版本 */rc = SQLSetEnvAttr(envh, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);if (rc != SQL_SUCCESS) {fprintf(stderr, "Set ODBC version error.\n");goto free_exit;}/* 分配连接句柄 */rc = SQLAllocHandle(SQL_HANDLE_DBC, envh, &dbch);if (rc != SQL_SUCCESS) {fprintf(stderr, "Allocate DB connection handle error.\n");goto free_exit;}/* 设置连接超时时间 */rc = SQLSetConnectAttr(dbch, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);if (rc != SQL_SUCCESS) {fprintf(stderr, "Set connection timeout value error.\n");goto free_exit;}/* 连接到数据库 */rc = SQLConnect(dbch, (SQLCHAR *)dsn_str, SQL_NTS,(SQLCHAR *)usrname, SQL_NTS, (SQLCHAR *)passwd, SQL_NTS);if (rc != SQL_SUCCESS) {fprintf(stderr, "Connect to DB error.\n");goto free_exit;}/* 设置连接数据库成功的标志 */conn = 1;fprintf(stdout, "connect DB ok ......\n");/* 分配语句句柄 */rc = SQLAllocHandle(SQL_HANDLE_STMT, dbch, &stmth);if (rc != SQL_SUCCESS) {fprintf(stderr, "Allocate statment handle error.\n");goto free_exit;}/* 准备SQL语句文本 */rc = SQLPrepare(stmth,(SQLCHAR *)"select table_name, tablespace_name, status from user_tables",SQL_NTS);if (rc != SQL_SUCCESS) {fprintf(stderr, "Prepare statment error.\n");goto free_exit;}/* 执行语句 */rc = SQLExecute(stmth);if (rc != SQL_SUCCESS) {fprintf(stderr, "Execute statment error.\n");goto free_exit;}/* 绑定第一列的输出变量,类型是C语言的char类型,rlen1是返回的数据长度 */rc = SQLBindCol(stmth, 1, SQL_C_CHAR, (SQLCHAR *)table_name, 256, &rlen1);if (rc != SQL_SUCCESS) {fprintf(stderr, "Bind column 1 error.\n");goto free_exit;}/* 绑定第二列输出变量 */rc = SQLBindCol(stmth, 2, SQL_C_CHAR, (SQLCHAR *)ts_name, 32, &rlen2);if (rc != SQL_SUCCESS) {fprintf(stderr, "Bind column 2 error.\n");goto free_exit;}/* 绑定第三列输出变量 */rc = SQLBindCol(stmth, 3, SQL_C_CHAR, (SQLCHAR *)status, 16, &rlen3);if (rc != SQL_SUCCESS) {fprintf(stderr, "Bind column 3 error.\n");goto free_exit;}while (1) {/* 返回结果集数据 */rc = SQLFetch(stmth);if (rc == SQL_NO_DATA) {/* 结果集中没有数据了,退出循环 */break;} else if (rc == SQL_ERROR) {/* 出错,返回 */fprintf(stderr, "Fetch data error.\n");goto free_exit;}/* 打印返回的变量值 */fprintf(stdout, "table_name=%s, tablespace_name=%s, status=%s\n",table_name, ts_name, status);}/* 释放语句句柄 */SQLFreeHandle(SQL_HANDLE_STMT, stmth);/* 断开数据库连接 */SQLDisconnect(dbch);/* 释放连接句柄 */SQLFreeHandle(SQL_HANDLE_DBC, dbch);/* 释放环境句柄 */SQLFreeHandle(SQL_HANDLE_ENV, envh);return (0);free_exit:if (stmth != NULL) {SQLFreeHandle(SQL_HANDLE_STMT, stmth);}if (conn) {SQLDisconnect(dbch);}if (dbch != NULL) {SQLFreeHandle(SQL_HANDLE_DBC, dbch);}if (envh != NULL) {SQLFreeHandle(SQL_HANDLE_ENV, envh);}return (-1);
}

编译程序,需要包含unixODBC的include路径和连接库的路径,比如源文件叫odbc_test.c,编译命令如下。

cc -I$HOME/unixODBC/include -L$HOME/unixODBC/lib -lodbc odbc_test.c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149460.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

峟思助力堤防工程安全:构建多功能防洪屏障

堤防工程&#xff0c;作为水利建设中至关重要的防护体系&#xff0c;不仅守护着江河、湖泊及滨海区域的安全&#xff0c;更是确保人民生命财产安全的坚固防线。在现代社会&#xff0c;随着技术的进步与安全意识的提升&#xff0c;堤防工程不仅限于传统的防洪功能&#xff0c;更…

CVPR最牛图像评价算法!

本文所涉及所有资源均在 传知代码平台可获取。 目录 概述 一、论文思路 1.多任务学习框架&#xff1a; 2.视觉-语言对应关系&#xff1a; 3.动态损失权重&#xff1a; 4.模型优化和评估&#xff1a; 二、模型介绍 三、详细实现方法 1.图像编码器和语言编码器&#xff08;Image…

Solidity语言:重点学习Solidity编程语言,这是EVM上最常用的智能合约语言。

Solidity是一种面向合约的编程语言,用于在以太坊虚拟机(EVM)上编写智能合约。它是Solidity开发者在以太坊平台上创建智能合约的主要选择之一。 学习Solidity的重点包括以下几方面: 语法和数据类型:学习Solidity的基本语法、数据类型、变量声明和函数定义等。 智能合约:了…

刷完这个笔记,17K不能再少了....

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到理想…

cobaltstrike之execute-assembly内存加载—后渗透利用

通过execute-assembly内存加载来执行文件&#xff0c;从而避免后渗透中被杀毒软件静态报毒&#xff0c;使更多的工具能够继续利用&#xff0c;常见的方式有权限维持&#xff0c;代理上线等操作 远程bin文件加载 首先尝试远程加载bin文件 使用项目https://github.com/shanekha…

IO 多路转接之 epoll

文章目录 IO 多路转接之 epoll1、IO 多路转接之 poll1.1、poll 函数1.2、poll 函数返回值1.3、Socket 就绪条件1.3.1、读就绪1.3.2、写就绪1.3.3、异常就绪 1.4、poll 的优点1.5、poll 的缺点1.6、poll 改写 select 2、IO 多路转接之 epoll2.1、epoll 函数2.2、epoll_create2.3…

视频字幕生成:分享6款专业易操作的工具,让创作更简单!

​视频字幕如何添加&#xff1f;日常剪辑Vlog视频时&#xff0c;就需要给视频添加上字幕了。字幕是一个比较重要的元素&#xff0c;它不仅可以帮助听力受损或语言障碍的人士理解内容&#xff0c;还可以让你的视频更加易于理解和吸引观众。 那么如何实现视频字幕生成&#xff0c…

Linux 进程与进程状态

目录 1.进程。 1.进程的概念 2.并行和并发 3.并行和并发的区别&#xff1a; 4.PCB&#xff08;程序控制块&#xff09; 5.进程组与会话。 6.进程状态。 1.进程。 1.进程的概念 进程是操作系统进行资源分配和调度的一个独立单位。每个进程都运行在操作系统的控制之下&…

8.进销存系统(基于springboot的进销存系统)

目录 1.系统的受众说明 2.开发技术与环境配置 2.1 SpringBoot框架 2.2 Java语言简介 2.3 MySQL环境配置 2.4 idea介绍 2.5 mysql数据库介绍 2.6 B/S架构 3.系统分析与设计 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3经济可行性 3.4.1 数据库…

一些做题中总结的零散的python函数的简单运用

输出保留两位数的小数 将16进制&#xff08;可修改&#xff09;的数进制转换成十进制并输出 大小写转化&#xff0c;第一个是搞成全部大写的&#xff0c;第二个高成全部小写的&#xff0c;最后一个是搞成第一个是大写的其他全部是小写的 将这个n的两边空格去掉 使用print(n,end…

叶国富学得会胖东来吗?

“大家都看不懂就对了&#xff0c;如果都看得懂我就没有机会了。”昨晚&#xff0c;实体零售迎来一则重磅消息&#xff0c;名创优品获得了全国第二大连锁超市永辉超市的大股东身份。在资本市场负反馈的压力下&#xff0c;名创优品创始人叶国富有了上述回应。 消息公布后&#x…

2.以太网

局域网 局域网: Local Area Networks (LAN) 网络大小分类 局域网园区网(可以理解为企业网)城域网 广域网是一个网络连接的技术&#xff0c;并非多大范围的网络 网关 为局域网内的用户提供了一扇门&#xff0c;通过网关可以访问到别的网络。这个门&#xff0c;就叫网关 以…

解决你的IDE在使用的时候测试单元@Test在创建Scanner对象是键盘键入不了的问题;

插播一条快讯&#xff0c;我在我的ide中新创建 了project后发现我的测试单元不好使了&#xff0c;即 import org.junit.Test; 这个包在创建Scanner对象接受键盘时&#xff0c;控制台输入时没有任何反应&#xff0c;键入不了了&#xff0c;我的问题出现原因可能是我导入了JDBC…

BitSet-解决数据压缩问题

一、问题引入 假设QQ音乐服务器上有9000万首音乐&#xff0c;用户按照歌名来搜索歌曲&#xff0c;如何使得满足这一需求所需的数据占用的内存空间最小以及用户搜索歌曲速度更快 二、分析问题 1、为了满足使得数据占用的内存更小&#xff0c;可以采用映射的思路&#xff0c;按…

【2024W35】肖恩技术周刊(第 13 期):肉,好次!

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

【C++算法】链表

知识总结 常用技术&#xff1a; 1.画图&#xff01;&#xff01;——>直观形象便于理解 2.引入虚拟”头结点“ 便于处理边界情况方便对链表操作 3.不要吝啬空间&#xff0c;大胆定义变量 4.快慢双指针——判环、找链表中环的入口、找链表中倒数第n个节点 链表中的常用…

移动数组中数字的方法(c语言)

1.移动一维数组中的内容;若数组中有n个整数&#xff0c;要求把下标从0到p(含p&#xff0c;p小于等于n-1&#xff09;的数组元素平移到数组的最后。 例如&#xff0c;一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。 移动后&#xff0c;一维数组中的内容应为:5,6,7,8…

融会贯通记单词,绝对丝滑,一天轻松记几百

如果我将flower(花&#xff09;、flat(公寓)、floor(地板)、plane(飞机)几个单词放在一起&#xff0c;你会怎么来记忆这样的一些单词呢&#xff1f; 我们会发现&#xff0c;我们首先可以将plane去掉&#xff0c;因为它看上去几乎就是一个异类。这样&#xff0c;我们首先就可以将…

力扣958:判断二叉树是否为完全二叉树

给你一棵二叉树的根节点 root &#xff0c;请你判断这棵树是否是一棵 完全二叉树 。 在一棵 完全二叉树 中&#xff0c;除了最后一层外&#xff0c;所有层都被完全填满&#xff0c;并且最后一层中的所有节点都尽可能靠左。最后一层&#xff08;第 h 层&#xff09;中可以包含 …