unixODBC编程(二)连接数据库

ODBC函数是一些定义好的接口,有唯一的名称,所以能够在不同的数据库直接移植。ODBC应用程序通过数据源名称来找到数据源的配置信息,包括连接数据库的必要信息和数据库访问的驱动程序,不同的数据库驱动程序实现了ODBC的接口函数,因此我们能通过ODBC函数访问数据库。

访问数据库的第一步就是连接到数据库,ODBC连接到数据库有几个步骤如下。

1. 创建环境句柄,在3.0版本后所以句柄的分配都用SQLAllocHandle()函数,句柄类型为SQL_HANDLE_ENV。

2. 在环境句柄中设置使用的ODBC版本,使用SQLSetEnvAttr()函数。

3. 分配连接句柄,使用SQLAllocHandle()函数,句柄类型为SQL_HANDLE_DBC。

4. 设置连接数据库的超时时间,使用SQLSetConnectAttr()函数。

5. 连接数据库,使用SQLConnect()函数。

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

分配句柄函数。

SQLRETURN SQLAllocHandle(
      SQLSMALLINT   HandleType,
      SQLHANDLE     InputHandle,
      SQLHANDLE *   OutputHandlePtr); 

先看返回值,是一个SQLRETURN类型的值,这是一个short类型的整数,所有ODBC的函数返回值都是这个类型。返回值有下面这些SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_INVALID_HANDLE或SQL_ERROR。

再看一下参数。

HandleType是一个输入参数,分配的句柄的类型。 必须是以下值之一:
SQL_HANDLE_DBC
SQL_HANDLE_DBC_INFO_TOKEN
SQL_HANDLE_DESC
SQL_HANDLE_ENV
SQL_HANDLE_STMT
InputHandle是一个输入参数,是为其上下文分配新句柄的输入句柄。 如果 handleType 为 SQL_HANDLE_ENV,则SQL_NULL_HANDLE。如果 HandleType 为 SQL_HANDLE_DBC,则必须是环境句柄,如果它是SQL_HANDLE_STMT或SQL_HANDLE_DESC,则必须是连接句柄。

OutputHandlePtr是一个输出参数,是一个指向缓冲区的指针,该缓冲区将句柄返回到新分配的数据结构。

设置环境句柄的ODBC版本函数。

SQLRETURN SQLSetEnvAttr(  
     SQLHENV         EnvironmentHandle,  
     SQLINTEGER   Attribute,  
     SQLPOINTER   ValuePtr,  
     SQLINTEGER   StringLength);

EnvironmentHandle是一个输入参数,环境句柄。

Attribute是一个输入参数,要设置的属性,在这里是SQL_ATTR_ODBC_VERSION。

ValuePtr是一个输入参数,指向要与 Attribute 关联的值的指针。这里是一个32位整数值。

StringLength是一个输入参数,如果 ValuePtr 指向字符串,则此参数应为 *ValuePtr 的长度。不是字符串则忽略。

设置连接超时函数。

SQLRETURN SQLSetConnectAttr(  
     SQLHDBC         ConnectionHandle,  
     SQLINTEGER    Attribute,  
     SQLPOINTER    ValuePtr,  
     SQLINTEGER    StringLength);

与设置环境句柄的属性函数差不多,只不过换成了连接句柄。

ConnectionHandle是一个输入参数,连接句柄。

Attribute是一个输入参数,要设置的属性,这里是SQL_ATTR_LOGIN_TIMEOUT。

ValuePtr是一个输入参数,指向要与 Attribute 关联的值的指针。这里是一个无符号整数值,表示超时时间,以秒为单位。

StringLength是一个输入参数,如果 Attribute 定义的属性是一个字符串,表示字符串长度,否则忽略。

连接数据库函数。

SQLRETURN SQLConnect(
     SQLHDBC           ConnectionHandle,
     SQLCHAR *         ServerName,
     SQLSMALLINT    NameLength1,
     SQLCHAR *         UserName,
     SQLSMALLINT    NameLength2,
     SQLCHAR *         Authentication,
     SQLSMALLINT    NameLength3);

ConnectionHandle是一个输入参数,连接句柄。

ServerName是一个输入参数,数据源名称,在odbc.ini中配置的数据源。

NameLength1是一个输入参数,ServerName 的长度(以字符为单位)。

UserName是一个输入参数,用户标识符,连接数据库的用户名称。

NameLength2是一个输入参数,UserName 的长度(以字符为单位)。

Authentication是一个输入参数,身份验证字符串,通常是连接数据库用户的密码。

NameLength3是一个输入参数,身份验证Authentication的长度(以字符为单位)。

看一段连接数据库的实际例子代码。

#include "stdio.h"
#include "stdlib.h"
#include "sql.h"                /* 必须包含下面的三个头文件 */
#include "sqlext.h"
#include "sqltypes.h"SQLHANDLE       envh;           /* environment handle */
SQLHANDLE       dbch;           /* connect handle */int connect_database(char *dsn_str, char *username, char *passwd)
{SQLRETURN   rc;/* 分配环境句柄 */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_handle_exit;}/* 分配连接句柄 */rc = SQLAllocHandle(SQL_HANDLE_DBC, envh, &dbch);if (rc != SQL_SUCCESS) {fprintf(stderr, "Allocate DB connection handle error.\n");goto free_handle_exit;}/* 设置连接数据库的超时时间为10秒 */rc = SQLSetConnectAttr(dbch, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);if (rc != SQL_SUCCESS) {fprintf(stderr, "Set connection timeout value error.\n");goto free_handle_exit;}/* 连接到数据库,dsn_str是数据源名称,username是连接用户,passwd是验证密码* SQL_NTS表示NULL结尾的字符串,自动计算长度*/rc = SQLConnect(dbch, dsn_str, SQL_NTS, username, SQL_NTS, passwd, SQL_NTS);if (rc != SQL_SUCCESS) {fprintf(stderr, "Connect to DB error.\n");goto free_handle_exit;}fprintf(stdout, "Database connection established ......\n");return (0);free_handle_exit:if (dbch != NULL) {/* 释放连接句柄 */SQLFreeHandle(SQL_HANDLE_DBC, dbch);}if (envh != NULL) {/* 释放环境句柄 */SQLFreeHandle(SQL_HANDLE_ENV, envh);}return (-1);
}

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

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

相关文章

C++(学习)2024.9.23

目录 运算符重载 1.概念 2.友元函数运算符重载 3.成员函数运算符重载 4.特殊运算符重载 1.赋值运算符重载 2.类型转换运算符重载 5.注意事项 std::string字符串类: 模板与容器 模板 1.函数模板 2.类模板 类内实现 类内声明类外实现 容器 1.标准模板库…

uniapp框架下scroll-view使用注意事项

在开发蓝牙调试app的过程,需要显示接收到的蓝牙硬件信息,主要需求是要求新收到的信息能够显示到显示区域。 如上图所示,第一个框为接受信息显示框,显示框在每次接收到信息化后自动向上滚动,以便显示最近收到的信息。 …

python爬虫案例——腾讯网新闻标题(异步加载网站数据抓取,post请求)(6)

文章目录 前言1、任务目标2、抓取流程2.1 分析网页2.2 编写代码2.3 思路分析前言 本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。 1、任务目标 目标网…

总结拓展十一:S4 HANA和ECC区别

第一节 S/4 HANA系统简介 SAP系统的产品线 R/1版本——主要财务模块R/3版本——基本实现全模块ECC6.0——2005年推出(ECC是2004年推出)HANA——数据库产品——属于内存数据库BW on HANA——HANA与数据分析相结合 拓展: 数据库类型&#x…

EEPROM手册阅读笔记

目录 一、特征描述二、功能描述三、总线特性四、设备寻址五、写入操作1.字节写入2.页写入 六、读取操作1.当前地址读取2.随机读取3.顺序读取 一、特征描述 1.Microchip Technology Inc. 24AA04/24LC04B (24XX04*) 是一款 4 Kbit 电气可擦除 PROM。该器件…

初学者怎么入门大语言模型(LLM)?看完这篇你就懂了!

当前2024年,LLM领域发展日新月异,很多新的实用技术层出不穷,个人认为要跟上LLM的发展,需要掌握以下内容,并需要不断地跟踪学习。 入门LLM前置基础 深度学习基础知识:推荐李宏毅的深度学习课程Python和num…

STM32(三)GPIO输出、LED及蜂鸣器操作

一、GPIO 1.GPIO介绍 2.GPIO结构 stm32寄存器有32位,GPIO是16位,是stm32的低16位。 3.GPIO模式 4.GPIO应用电路 二、LED操作 1.操作GPIO的三个步骤 (1)使用RCC开启GPIO时钟 (2)使用GPIO初始函数初始化…

动态规划算法:10.路径问题_地下城游戏_C++

目录 题目链接:174. 地下城游戏 - 力扣(LeetCode) 一、题目解析 题目:​编辑 解析: 二、算法原理 1、状态表示 2、状态转移方程 状态转移方程推理: 3、初始化 dp表初始化: 特殊位置初始化&#…

【AcWing】基础算法

目录 1、快速排序 1.1 快速排序 1.2 第k个数 2、归并排序 2.1 归并排序 2.2 逆序对的数量 3、二分 3.1 数的范围 3.2 数的三次方根 4、高精度 4.1 高精度加法 4.2 高精度减法 4.3 高精度乘法 4.4 高精度除法 5、前缀和与差分 5.1 前缀和 5.2 子矩阵的和 5.3 …

基于jsp的图书馆管理系统的设计与实现 (含源码+sql+视频导入教程+文档)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于jsp的图书馆管理系统8拥有两种角色,分别为管理员和学生,具体功能如下: 管理员:图书管理、用户管理、违规处理、权限管理、个人信息修改…

某恩加密数据爬虫逆向分析

目标网站 aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9pbmRleC5odG1s 一、抓包分析 响应数据加密 二、逆向分析 下断点,刷新页面 一直往下跟栈,发现是在这进行的加密 内部实现逻辑 本地数据获取 本文章仅提供技术分享交流学习,不可对目标服务器造…

OpenAI最新GPT-o1-preview测评

OpenAI最新GPT-o1-preview测评 测试之后感觉这个相对GPT4o,能力上升了一个大的台阶,思考能力极强的最强GPT模型 之前用GPT4o测试过类似的题目,做的效果极差,答案直接就是错,这次GPT-o1-preview居然做对了,逻…

Ethernet 系列(3)-- 物理层测试::IOP Test::Cable diagnostics

车载以太网物理层IOP测试,即互操作性测试(Interop- erability Tests),用于验证车载以太网PHY(通常也称为收发器)的可靠性和检查PHY能否在给定的有限时间内建立稳定的链路;还用于车载以太网PHY的诊断&#x…

窗口函数性能提升50倍,PawSQL索引推荐实战案例

🌟引言 在数据驱动的现代世界,SQL查询的速度是应用程序快速响应的关键。尤其是那些涉及窗口函数的复杂查询,若缺乏恰当的索引支持,性能瓶颈可能会成为阻碍。本文将带您看看PawSQL是如何通过智能索引推荐,帮助一个包含…

《深度学习》—— 神经网络中常用的激活函数

文章目录 1. Sigmoid 激活函数2. Softmax 激活函数3. ReLU 激活函数4. Leaky ReLU 激活函数5. ELU 激活函数6. Tanh 激活函数 激活函数(Activation Function)是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。它在神经…

CVE-2024-4956实战

一、访问网页 二、公司信息域名收集 三、抓包读取敏感文件 Burpsuite抓包,修改GET请求即可(GET /%2F%2F%2F%2F%2F%2F%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd HTTP/1.1 )

网工想提升,不止华为HCIE这一个证书

作为网络工程师,拥有一张HCIE(华为认证互联网专家)无疑是职业生涯中的一项重要成就,但网络技术的世界远比一张证书要复杂得多。提升自己的技术水平,不仅要依赖HCIE这一张证书,更可以通过学习其他认证&#…

现在的大模型榜单,真就没一个可信的,真的都是水分

现在的大模型榜单上,真的都是水分。 全是作弊的考生,真的。 上周,AI圈有个很炸裂的大模型发布,在全网引起了山呼海啸,一众从业者和媒体尊称它为开源新王。 就是Reflection 70B。 在每项基准测试上都超过了 GPT-4o&a…

printf 命令:格式化输出

一、命令简介 ​printf​ 命令在 Linux 系统中用于格式化并打印字符串到标准输出。它是 C 语言中 printf ​函数的命令行版本,因此其格式化选项与 C 语言中的非常相似。 相关命令: echo:通常使用 echo,它比较简单。printf&…

FastAPI开发环境搭建——开发第一个web程序

FastAPI开发环境搭建——开发第一个web程序 搭建开发环境 FastAPI官方文档学习 - FastAPI (tiangolo.com) 安装fastapi框架 pip install fastapi[all] pip install uvicorn使用对应IDE创建fastapi项目,例如pycharm,vscode和创建普通的python项目无差别 创建一个…