unixODBC编程(七)数组查询

数组查询与单条查询编程的步骤差不多,只是在执行语句前要设置4个语句句柄属性,在绑定输出变量时使用变量数组,先看一看需要哪四个句柄属性。

第一个属性告诉语句使用列数组绑定,属性名称为SQL_ATTR_ROW_BIND_TYPE,属性值为SQL_BIND_BY_COLUMN,例如:

SQLSetStmtAttr(stmth, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);

第二个属性告诉语句绑定的数组大小,就是绑定的行数,属性名称为SQL_ATTR_ROW_ARRAY_SIZE,属性值为10,例如:

SQLSetStmtAttr(stmth, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)10, 0);

第三个属性告诉语句返回每一行的状态,属性名称为SQL_ATTR_ROW_STATUS_PTR,属性值为一个SQLUSMALLINT类型的数组,比如叫status[10],例如:

SQLSetStmtAttr(stmth, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER)status, 0);

第四个属性告诉语句返回每次从结果集中取回的数据条数,属性名称为SQL_ATTR_ROWS_FETCHED_PTR,属性值为一个SQLULEN类型的整数,不是数组,比如叫做num_fetched,例如:

SQLSetStmtAttr(stmth, SQL_ATTR_ROWS_FETCHED_PTR, (SQLPOINTER)&num_fetched, 0);

在使用SQLBindCol()函数绑定输出变量时,TargetValuePtr参数使用数组绑定,StrLen_or_IndPtr参数也使用数组绑定,例如绑定一个整数数组id[10],返回长度和指示变量数组len_id1[10],调用函数如下:

SQLBindCol(stmth, 1, SQL_C_ULONG, (SQLPOINTER)id, 0, len_ind1);

下面看一个完整的例子,还是从前面创建的表test_tab1中查询数据,使用数组操作。

#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                 i;int                 conn = 0;SQLRETURN           rc;SQLULEN             num_fetched;SQLUSMALLINT        status[10];SQLLEN              len_ind1[10];SQLLEN              len_ind2[10];SQLLEN              len_ind3[10];SQLLEN              len_ind4[10];SQLLEN              len_ind5[10];SQLINTEGER          id[10];char                dsn_str[32];char                usrname[32];char                passwd[32];char                sqltxt[128];char                f1[10][32];char                f2[10][32];char                f3[10][32];char                f4[10][32];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);}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;}sprintf(sqltxt, "select id, f1, f2, f3, f4 from test_tab1");rc = SQLPrepare(stmth, (SQLCHAR *)sqltxt, SQL_NTS);if (rc != SQL_SUCCESS) {fprintf(stderr, "Prepare statment error.\n");goto free_exit;}/* 使用列数组绑定 */rc = SQLSetStmtAttr(stmth, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);if (rc != SQL_SUCCESS) {fprintf(stderr, "Set statment attribute error.\n");goto free_exit;}/* 设置数组大小为10,每次取回10条数据 */rc = SQLSetStmtAttr(stmth, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)10, 0);if (rc != SQL_SUCCESS) {fprintf(stderr, "Set statement attribute error.\n");goto free_exit;}/* 设置返回每条数据的状态数组 */rc = SQLSetStmtAttr(stmth, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER)status, 0);if (rc != SQL_SUCCESS) {fprintf(stderr, "Set statement attribute error.\n");goto free_exit;}/* 设置返回每次取回数据的条数 */rc = SQLSetStmtAttr(stmth, SQL_ATTR_ROWS_FETCHED_PTR, (SQLPOINTER)&num_fetched, 0);if (rc != SQL_SUCCESS) {fprintf(stderr, "Set statement attribute error.\n");goto free_exit;}/* 执行语句 */rc = SQLExecute(stmth);if (rc != SQL_SUCCESS) {fprintf(stderr, "Execute statment error.\n");goto free_exit;}/* 绑定第一列,id使用数组,len_ind1也使用数组 */rc = SQLBindCol(stmth, 1, SQL_C_ULONG, (SQLPOINTER)id, 0, len_ind1);if (rc != SQL_SUCCESS) {fprintf(stderr, "Bind column 1 error.\n");goto free_exit;}rc = SQLBindCol(stmth, 2, SQL_C_CHAR, (SQLPOINTER)f1, 32, len_ind2);if (rc != SQL_SUCCESS) {fprintf(stderr, "Bind column 2 error.\n");goto free_exit;}rc = SQLBindCol(stmth, 3, SQL_C_CHAR, (SQLPOINTER)f2, 32, len_ind3);if (rc != SQL_SUCCESS) {fprintf(stderr, "Bind column 3 error.\n");goto free_exit;}rc = SQLBindCol(stmth, 4, SQL_C_CHAR, (SQLPOINTER)f3, 32, len_ind4);if (rc != SQL_SUCCESS) {fprintf(stderr, "Bind column 4 error.\n");goto free_exit;}rc = SQLBindCol(stmth, 5, SQL_C_CHAR, (SQLPOINTER)f4, 32, len_ind5);if (rc != SQL_SUCCESS) {fprintf(stderr, "Bind column 5 error.\n");goto free_exit;}while (1) {rc = SQLFetch(stmth);if (rc == SQL_NO_DATA) {fprintf(stderr, "No data in result set, break.\n");break;} else if (rc == SQL_ERROR) {fprintf(stderr, "Fetch data error.\n");goto free_exit;}fprintf(stdout, "%lu rows fetched.\n", num_fetched);for (i=0; i<num_fetched; i++) {fprintf(stdout, "id=%d, f1=%s, f2=%s, f3=%s, f4=%s\n",id[i], f1[i], f2[i], f3[i], f4[i]);}}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);
}

访问www.tomcoding.com网站,可以下载Oracle内部数据结构的文档,还有DUL,exp/imp,logminer及ASM工具的源代码。

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

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

相关文章

OpenCV-图像拼接

文章目录 一、基本原理二、步骤三、代码实现1.定义函数2.读取图像3.图像配准&#xff08;1&#xff09;.特征点检测&#xff08;2&#xff09;.特征匹配 4.透视变换5.图像拼接 四、图像拼接的注意事项 图像拼接是一种将多张有重叠部分的图像合并成一张无缝的全景图或高分辨率图…

【Python】Beaker:轻量级缓存与会话管理的解决方案

Beaker 是一个简单、灵活的 Python 库&#xff0c;主要用于缓存管理和会话管理。作为一个开源项目&#xff0c;Beaker 提供了多种缓存存储后端&#xff0c;帮助开发者在应用中高效管理缓存数据&#xff0c;同时支持会话存储&#xff0c;适合 Web 应用中的用户状态管理。其轻量级…

AIGC: 从两个维度快速选择大模型开发技术路线

在当今人工智能飞速发展的时代&#xff0c;大模型开发技术路线的选择至关重要。本文将从两个维度出发&#xff0c;为大家快速介绍不同的大模型开发技术路线&#xff0c;帮助你在开发过程中做出明智的决策。 一、两个维度解析 传入大模型的信息 低要求&#xff1a;传入的信息相…

RabbitMQ 高级特性——TTL

文章目录 前言TTL设置消息的 TTL设置队列的 TTL 前言 对于前面讲到的重试机制中&#xff0c;当确认策略为 MANUAL 手动确认的时候&#xff0c;如果消费者出现了程序逻辑错误&#xff0c;那么消息就无法被争取处理&#xff0c;那么就会执行 basicNack 方法&#xff0c;如果我们…

Java 网络编程和多线程

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Java 目录 &#x1f449;&#x1f3fb;实现客户端和服务端交互1. 基本概念2. 常用类3. 简单示例客户端代码服务器代码 4. 注意事项 &#x1f449;&#x1f3…

文献阅读——电力系统安全域边界通用搜索模型与近似方法

文章标题 DOI&#xff1a;10.13334/j.0258-8013.pcsee.190884 ©2020 Chin.Soc.for Elec.Eng. 4411 文章编号&#xff1a;0258-8013 (2020) 14-4411-19 中图分类号&#xff1a;TM 74 电力系统安全域边界通用搜索模型与近似方法 姜涛&#xff0c;李晓辉&#xff0c;李雪*&a…

一站式大语言模型API调用:快速上手教程

智匠MindCraft是一个强大的AI工具及开发平台&#xff0c;支持多种大语言模型和多模态AI模型。本文将详细介绍如何通过API调用智匠MindCraft中的大语言模型&#xff0c;帮助开发者快速上手。 注册与登录 访问智匠MindCraft官网&#xff0c;注册并登录账号。 进入开发者平台&…

常见字符函数和字符串函数(下)

1. strncpy 函数的使用 将源的前 number 个字符复制到目标。如果在复制 num 个字符之前找到源 C 字符串的末尾&#xff08;由 null 字符表示&#xff09;&#xff0c;则目标将填充零&#xff0c;直到写入总数 num 个字符为止。如果 source 长于 num&#xff0c;则不会在 destin…

《向量数据库指南》——非结构化数据迁徙战:向量数据库的挑战与突破

在深入探讨非结构化数据在向量数据库间迁移所面临的挑战时,我们不得不正视这一领域所独有的复杂性与特殊性。随着人工智能、大数据技术的迅猛发展,向量数据库作为处理高维、非结构化数据的核心工具,其重要性日益凸显。然而,与成熟的关系型数据库迁移相比,向量数据库之间的…

扫盲接口测试,有些知识是需要了解和掌握的(建议收藏)

扫盲内容&#xff1a; 1.什么是接口&#xff1f; 2.接口都有哪些类型&#xff1f; 3.接口的本质是什么&#xff1f; 4.什么是接口测试&#xff1f; 5.问什么要做接口测试&#xff1f; 6.怎样做接口测试&#xff1f; 7.接口测测试点是什么&#xff1f; 8.接口测试都要掌…

02-指针代码示例

视频地址&#xff1a; 数组作为函数参数_哔哩哔哩_bilibili 指针是一个变量,用来存放其他变量的地址. 一、语法角度说: 需要用整形变量的指针,去存储一个整形变量的地址. 二、代码部分: (一) 1.指针赋值 int main(int argc, const char* argv[]) {int a;int* p;//这里要…

王道-操作系统

3 下列说法正确的是_____ 答案:A 解析: A 正确。如链接文件可以顺序存取,但不能随机存取。连续文件可随机存取,也可顺序存取。 B 错误。一个 FCB 就是一个文件目录项。在引入索引节点后,每个文件的目录项只保留文件名和指向该文件对应的索引节点指针,而索引节点的有关信息…

AD导出gerber文件(光绘文件)

第一步&#xff1a; 英寸 2:5 勾选你想显示的层 默认默认 第二步&#xff1a; 第三步&#xff1a; 默认

每日OJ_牛客_NC95数组中的最长连续子序列_排序+模拟_C++_Java

目录 牛客_NC95数组中的最长连续子序列_排序和模拟 题目解析 C代码 Java代码 牛客_NC95数组中的最长连续子序列_排序模拟 数组中的最长连续子序列_牛客题霸_牛客网 题目解析 排序 模拟。但是要注意处理数字相同的情况&#xff0c;还要注意去重。 排序后使用一个变量cou…

【预备理论知识——1】深度学习:概率论概述

简单地说&#xff0c;机器学习就是做出预测。 概率论 掷骰子 假设我们掷骰子&#xff0c;想知道看到1的几率有多大&#xff0c;而不是看到另一个数字。 如果骰子是公平的&#xff0c;那么所有六个结果{1,…, 6}都有相同的可能发生&#xff0c; 因此我们可以说 1 发生的概率为1…

软件设计(实验三):经典软件体系结构风格(二)

实验目的&#xff1a; 本实验旨在帮助学生理解和实现两种常见的软件体系结构风格&#xff1a;事件的隐式调用软件体系结构、层次软件体系结构。通过编写具体的代码&#xff0c;学生将能够掌握这两种风格的基本原理&#xff0c;并能够评估它们在不同场景下的适用性和优劣。 基…

string类的使用(上)

目录 1.string类的概念 2.string的构造函数&#xff08;实现初始化&#xff09; 3.对string类容量获取和操作 4.string类对象的访问和遍历 4.1operator[] 4.2begin和end 4.3 rbegin 和 rend 4.4迭代器分类 4.5范围for&#xff08;自动实现遍历&#xff09; 5.string类…

http请求过程 part-2

http请求过程 http应用层 实体 实体分为实体首部和实体主体&#xff0c;实体首部是用来描述主体的 实体部分是可选的&#xff0c;它被用来运送请求或者响应的数据 传输层-TCP HTTP连接是建立在TCP连接的基础上 以流形式通过一条已经打开的TCP连接&#xff0c;按顺序进行…

next 从入门到精通

next 从入门到精通 相关链接 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 hello 大家好&#xff0c;我是 数擎科技&#xff0c;今天来跟大家聊聊 Next.js 如果你遇到任何问题&#xff0c;欢迎联系我 m-xiaozhicloud 什么是 Next.js Next.js 是一个基于 Reac…

27 C 语言标准库 <stdio.h> 中的两个字符串函数:sprintf、sscanf,不同编码方式的中文字符长度

目录 1 sprintf 1.1 函数原型 1.2 功能说明 1.3 案例演示 1.4 注意事项 2 sscanf 2.1 函数原型 2.2 功能说明 2.3 案例演示 2.4 使用 %s 解析字符串的易错点 2.4.1 空白符问题 2.4.2 顺序问题 2.4.3 中文字符长度问题 2.5 注意事项 1 sprintf 1.1 函数原型 spri…