unxiODBC编程(五)错误处理

ODBC学习笔记—SQLSetStmtAttr SQLGetConnectAttr 函数定义: SQLRETURN SQLGetConnectAttr(      SQLHDBC     ConnectionHandle,      SQLINTEGER     Attribute,      SQLPOINTER     ValuePtr,      SQLINTEGER     BufferLength,      SQLIN 阅读详情

访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。

ODBC的每个函数调用完毕都会返回一个SQLRETURN类型的返回码,这个类型其实是短整数(short int)类型,是一个16位的整数。返回值一共有下面几个值。

1. SQL_SUCCESS,表示函数执行成功。

2. SQL_SUCCESS_WITH_INFO,表示函数执行成功,但是返回了警告信息。比如连接数据库时返回密码即将过期信息。

3. SQL_STILL_EXECUTING,表示调用函数时,前一个SQL语句还在执行。

4. SQL_NEED_DATA,表示调用函数后,有动态数据需要提供。

5. SQL_NO_DATA,表示调用函数后,没有数据返回。最典型的就是从结果集中Fetch数据时,取走最后一条数据后没有其他数据了,返回SQL_NO_DATA。

6. SQL_ERROR,表示调用函数后,出现了错误。需要调用诊断函数获取错误信息。

7. SQL_INVALID_HANDLE,表示调用函数时,传入了无效的句柄。

当调用的函数返回SQL_SUCCESS_WITH_INFO或SQL_ERROR时,可以调用SQLGetDiagRec()函数来返回错误信息,下面看看函数的原型和参数。

SQLRETURN SQLGetDiagRec(
     SQLSMALLINT     HandleType,
     SQLHANDLE        Handle,
     SQLSMALLINT     RecNumber,
     SQLCHAR *          SQLState,
     SQLINTEGER *    NativeErrorPtr,
     SQLCHAR *          MessageText,
     SQLSMALLINT     BufferLength,
     SQLSMALLINT *   TextLengthPtr);

HandleType是一个输入参数,是出错函数传入的句柄的类型。

Handle是一个输入参数,是出错函数传入的句柄。

RecNumber是一个输入参数,指示诊断记录的编号。记录从 1 开始编号。

SQLState是一个输出参数,返回状态码,该缓冲区将返回一个五个字符的 SQLSTATE 代码。

NativeErrorPtr是一个输出参数,返回错误码,该缓冲区将返回特定于数据源的本机错误代码。比如数据源是一个使用Oracle驱动程序的配置项,那么返回的就是Oracle的出错码。

MessageText是一个输出参数,指向返回诊断消息文本字符串的缓冲区的指针。用于存放出错信息。

BufferLength是一个输入参数,MessageText 缓冲区的长度(以字符为单位)。如果过小诊断函数会返回错误。

TextLengthPtr是一个输出参数,返回信息文本的总字符数。

看一个例子,连接数据库出错时,怎样处理错误。

SQLSMALLINT         i;
SQLRETURN           rc;
SQLINTEGER          ecode;
SQLSMALLINT         alen;
WCHAR                    msgtxt[8192];
WCHAR                    state[SQL_SQLSTATE_SIZE+1];

rc = SQLConnect(dbch, (SQLCHAR *)ds_name, SQL_NTS, (SQLCHAR *)usrname, SQL_NTS,    (SQLCHAR *)passwd, SQL_NTS);
if ((rc == SQL_ERROR) || (rc == SQL_SUCCESS_WITH_INFO)) {
    for (i=1; ; i++) {
        rc = SQLGetDiagRec(SQL_HANDLE_DBC, dbch, i, (SQLCHAR *)state, &ecode,

                (SQLCHAR *)msgtxt, (SQLSMALLINT)(sizeof(msgtxt) / sizeof(WCHAR)),

                (SQLSMALLINT *)&alen);

        if (rc == SQL_SUCCESS) {
            fprintf(stderr, "ERROR: [%s] [%d] - %s\n", (char *)state, ecode, (char *)msgtxt);
        } else if (rc == SQL_NO_DATA)
            break;
        else {
            fprintf(stderr, "get diagnostic record error.\n");
            break;
        }
    }
}

我们可以写一个函数来处理调用函数返回的结果。代码如下。

/*
 * hndl  - 出错函数输入的句柄
 * htype - 出错函数输入的句柄类型
 * rc    - 出错函数的返回码
 */
SQLRETURN check_odbc_error(SQLHANDLE hndl, SQLSMALLINT htype, SQLRETURN rc)
{   
    SQLRETURN           ret;
    SQLSMALLINT         irec;
    SQLSMALLINT         alen; 
    SQLINTEGER          ecode; 
    WCHAR               msgtxt[8192]; 
    WCHAR               state[SQL_SQLSTATE_SIZE+1];


    switch (rc) {
        /* 函数返回成功,需要动态数据,没有数据了,直接返回原始码,不用处理错误 */
        case SQL_SUCCESS:
        case SQL_NEED_DATA:
        case SQL_NO_DATA:
            return (rc);

        /* 无效句柄 */
        case SQL_INVALID_HANDLE:
            fprintf(stderr, "Invalid handle!\n"):
            return (rc);

        /* 返回成功但有警告信息或者出错,处理错误记录 */
        case SQL_SUCCESS_WITH_INFO:
        case SQL_ERROR: 
            /* 从1开始取回每一条出错记录信息 */
            for (irec=1; ; irec++) {
                ret = SQLGetDiagRec(htype, hndl, irec, (SQLCHAR *)state, &ecode,
                    (SQLCHAR *)msgtxt, (SQLSMALLINT)(sizeof(msgtxt) / sizeof(WCHAR)),
                    (SQLSMALLINT *)&alen);

                if (ret == SQL_NO_DATA)
                    break;

                if (ret == SQL_SUCCESS) {
                    fprintf(stderr,"[%s] %d - %s\n",
                        (char *)state, ecode, (char *)msgtxt);
                } else {
                    fprintf(stderr, "Get diagnostic message error!\n");
                    break;
                }
            }

            return (rc);
    }

    return (0);
}

后面可以使用上面的函数来处理调用函数的返回码,简单实用,比如调用执行语句函数。

rc = SQLExecute(stmth);

check_odbc_error(stmth, SQL_HANDLE_STMT, rc);

如果你想看一些有关数据库的高技术含量的源代码和文档,请访问www.tomcoding.com网站。

Visual C++环境中MySQL ODBC驱动程序数据库连接实操 本文还有配套的精品资源,点击获取 简介:本主题旨在介绍如何在Visual C++(VC)开发环境下,通过MySQL ODBC驱动程序mysec odbc driver 3.51建立数据库连接。详细解释了ODBC的基本概念、特定驱动程序的安装与配置,以及在VC中使用ODBC API执行数据库操作。此外,涵盖了OLE DB和ADO连接方式、安全性与兼容性考虑、错误处理技巧和性能... 阅读详情

相关推荐

cordic算法的FPGA实现

cordic 算法的MATLAB仿真及verilog实现

qq_38360574的博客 1674

VC++实现批量大容量快速插入SqlServer数据库

1. 概述 使用c++访问数据库的方法很多,由于我访问的是sqlserver数据库,于是上MSDN查了一下有哪些访问技术,主要有以下几种: ODBC  OLEDBADO ADO是OLEDB的封装,使用起来比OLEDB方便。由于ADO比OLEDB多了一层,其速度可能不及OLEDB,所以就不考虑ADO了。 数据库获取方法参考MSDN:https://msdn.microso

Leckun的专栏 5369

用STM32的SPI模式2搞定SSI绝对值编码器通信(附完整代码与避坑点)

本文详细解析了如何使用STM32的SPI模式2实现SSI绝对值编码器通信,包括硬件设计、SPI配置、数据处理算法及稳定性优化技巧。通过完整的代码示例和避坑指南,帮助工程师解决时序匹配、数据解析等常见问题,提升工业自动化系统中的编码器通信可靠性。

weixin_27252001的博客 264

openGauss应用开发指南(34)

函数,并将HandleType和Handle参数分别设置为SQL_HANDLE_STMT和StatementHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。如果调用ODBC函数返回SQL_ERROR或SQL_SUCCESS_WITH_INFO,可调用SQLGetDiagRec返回诊断信息值SQLSTATE,SQLSTATE值的如下表。当SQLPrepare返回的值为SQL_ERROR或SQL_SUCCESS_WITH_INFO时,通过调用。

weixin_53596073的博客 1012

Keil5 安装与卸载全攻略:从零开始到完美避坑

本文提供了Keil5集成开发环境的完整安装与卸载指南。针对嵌入式开发新手,详细解析了安装前的关键准备、MDK核心与C51双环境的安装激活步骤、常见问题排查,并重点介绍了如何彻底卸载软件以避免残留问题,帮助用户从零开始搭建稳定高效的开发环境。

weixin_29172963的博客 636

ARM与PC共享文件方式【samba】移植与配置

方式推荐指数适用平台优点缺点⭐⭐⭐⭐⭐全平台 (Win/Mac/Linux)兼容性最强,操作像本地文件配置稍繁琐,协议开销略大NFS⭐⭐⭐⭐Linux/Mac (Win支持一般)速度极快,CPU占用低Windows配置复杂,权限管理较难SFTP (SSH)⭐⭐⭐⭐全平台 (需客户端)安全加密,无需额外配置服务需使用FileZilla/Xftp等专用软件物理U盘⭐⭐⭐全平台无需网络,速度取决于接口需要人工插拔,不适合自动化Syncthing⭐⭐⭐⭐全平台自动同步,支持远程。

浩瀚之水的专栏 263

ODBC接口规范

第1章 ODBC API基础 1.1 ODBC API句柄 ODBC API 实现数据库操作的手段是句柄。在ODBC中,使用不同的句柄(HANDLE)来标志环境(environment)、连接(Connection)、语句(statement)、描述符(description)等。句柄是一个应用程序变量,系统用它来存储关于应用程序的上下文信息和应用程序所用到的一些对象。...

weixin_30587927的博客 945

思维链:让AI更接近人类思维的技术

本文将探讨一种名为“思维链”的技术,它旨在让AI更接近人类思维。文章首先介绍了问题背景与核心概念,接着讲解了算法原理和数学模型,随后阐述了系统分析与架构设计,最后通过项目实战展示了思维链的实际应用,并提供了最佳实践和小结。思维链是一种旨在模拟人类思维过程的技术,它通过构建一系列相互关联的思维方式,实现对复杂问题的分析和解决。思维链算法是一种基于人类思维过程的人工智能算法,它通过构建一系列思维链,实现对问题的分析和解决。智能问答系统是一种常见的人工智能应用,它能够回答用户提出的各种问题。

AI天才研究院 942

C语言ODBC连接DM数据库之达梦集群切换自动重连

初始化配置参考这个 C语言ODBC方式连接DM数据库 因为ODBC是官方开源的方式不具备自动重连的功能,所以采用代码判断连接的方式,采用SQLGetDiagRec方法接收SQL的状态返回值,可以参考DM8程序员手册.pdf #include <stdio.h> #include <stdlib.h> #include <sql.h> #include <sqltypes.h> #include <sqlext.h> #include <un

飞奔的屎壳郎 1475

用 SAP Fiori Launchpad Content Manager 做目录传输:把 Catalog 变更稳稳送到目标系统

摘要:SAP Fiori项目中,目录传输是确保应用一致交付的关键环节。开发团队常遇到目录在不同系统/客户端间不一致的问题,核心在于理解Launchpad内容管理的两种作用域:系统级(/UI2/FLPCM_CONF)使用workbench请求跨系统传输,客户端级(/UI2/FLPCM_CUST)通过customizing请求按SCC4设置传输。混淆作用域会导致目录分叉,如系统级目录被客户端本地修改后形成独立副本。官方推荐使用Content Manager而非过时的Launchpad Designer,并强调手

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 102

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2197

ODBC错误处理

ODBC 中的错误处理 ODBC 中的错误是使用来自每个 ODBC 函数调用的返回值和 SQLError 函数或 SQLGetDiagRec 函数的返回值进行报告的。SQLError 函数用于 ODBC 版本 3 之前的版本(但不包括版本 3)。自版本 3 起,已不建议使用 SQLError 函数,此函数已被 SQLGetDiagRec 函数取代。 每个 ODB...

weixin_34001430的博客 1181

基于方差分解分析气象/水文干旱驱动因素(含MATLAB全代码)

简介基于方差分解方法分析气象/水文干旱驱动因素

WW、forever的博客 801

ODBC::SQLExecDirect返回-1 错误信息ORA-00604 ORA-01000

  在通过使用微软提供的ODBC SDK读取数据库(SELECT)时,发现Oracle读着读着就读不到数据了(MySQL和SQL Server是正常的),经调试发现SQLExecDirect返回值为-1,在网上查找相关问题时看到一篇文章(ODBC中执行SQLExecDirect报错信息获取),于是就在程序出错的地方加了获取错误信息语句,代码 及 strErrorMsg错误信息分别如下: //.h #pragma once #include <sql.h> #include <string&

十雨五风的博客 2578

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

用Visual C++开发数据库应用程序

用Visual C++开发数据库应用程序EMAIL:zzh1415@21cn.com1、 概述1、1 Visual C++开发数据库技术的特点Visual C++提供了多种多样的数据库访问技术——ODBC API、MFC ODBC、DAO、OLE DB、ADO等。这些技术各有自己的特点,它们提供了简单、灵活、访问速度快、可扩展性好的开发技术。简单性Visual C++中提供了MFC类库、ATL模板

zzh的专栏 1893

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ODBC错误信息

ODBC 错误信息根据 X/Open 和 SQL Access Group SQL CAE 规范 (1992) 所进行的定义,SQLERROR 返回 SQLSTATE 值。SQLSTATE 值是包含五个字符的字符串。下表列出了驱动程序可以为 SQLError 返回的 SQLSTATE 值。为 SQLSTATE 返回的字符串值由两个字符的类值后接三个字符的子类值组成。类值 01 表明是一种警告,后跟

Corey的专栏 2万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C通过unixODBC连接数据库

首先进程数据库的相关配置,主要是修改/etc/odbcinst.ini和/etc/odbc.ini两个文件。(这是它们的默认位置,有时也可能在/usr/local/etc/或者/usr/local/unixODBC/etc/,这个和你安装的unixODBC位置有关) odbcinst.ini(配置驱动) 点击(此处)折叠或打开 [mysql] Dri...

weixin_30387423的博客 366

ODBC的三种链接方式

连接数据源 (ODBC) SQL Server 2014 其他版本 此主题尚未评级 - 评价此主题   在分配环境和连接句柄并设置连接属性后,应用程序将连接到数据源或驱动程序。有三种可用于连接的函数: SQLConnect SQLDriverConnect SQLBrowseConnect 有关建立与数据源的连接的

hanghangde的博客 9464

ODBC学习笔记—SQLSetEnvAttr

SQLSetEnvAttr 函数定义: SQLRETURN SQLSetEnvAttr(      SQLHENV     EnvironmentHandle,      SQLINTEGER     Attribute,      SQLPOINTER     ValuePtr,      SQLINTEGER     StringLength); 参数详解: Environm

不上进的程序员 2836

DB2 ODBC 编程概述

闫庆宏, 软件工程师, IBM 简介:ODBC 作为一种简单易用的数据库连接方式,其完备的功能,良好的移植性使得其在数据库编程领域受到广泛的推崇。IBM 公司根据国际 ODBC 标准推出的 DB2 ODBC 驱...

651

ODBC学习笔记—SQLConnect

SQLConnect 函数定义: 这个函数就是与数据库建立连接 SQLRETURN SQLConnect(      SQLHDBC     ConnectionHandle,      SQLCHAR *     ServerName,      SQLSMALLINT     NameLength1,      SQLCHAR *     UserName,      SQLS

不上进的程序员 9223

ELasticsearch控制台中文乱码和jvm大小调节

问题一:elasticsearch控制台中文乱码和jvm内存大小调整。 解决办法: 修改conf下面的jvm.options如下 -Xms256m -Xmx256m # ensure UTF-8 encoding by default (e.g. filenames) #-Dfile.encoding=UTF-8 -Dfile.encoding=GBK...

Diligent_ten的博客 3205
上一篇: unixODBC编程(四)插入数据
下一篇: unxODBC编程(六)数组插入
tomcoding
博客等级 码龄9年 410粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值