ODBC错误处理

ODBC 中的错误处理

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

每个 ODBC 函数都返回一个 SQLRETURN,它是以下状态代码之一:

状态代码 说明
SQL_SUCCESS 无错误。
SQL_SUCCESS_WITH_INFO
该函数完成,但是对 SQLError 的调用将显示警告。

这种状态最常见的情况是:返回的值太长,应用程序提供的缓冲区不够用。

SQL_ERROR 函数未完成,因为出现了错误。调用 SQLError 可获取有关此问题的详细信息。
SQL_INVALID_HANDLE
作为参数传递的环境、连接或语句句柄无效。

如果在释放句柄后再使用该句柄,或者句柄为空值指针,则通常会发生这种情况。

SQL_NO_DATA_FOUND
没有可用信息。

使用这种状态的最常见情况是在从游标进行读取时,这种状态表示游标中没有更多行。

SQL_NEED_DATA
参数需要数据。

这是一项高级特性,SQLParamData 和 SQLPutData 下面的 ODBC SDK 文档对其作了说明。

每个环境、连接和语句句柄都可能有与之相关联的一个或多个错误或警告。每个对 SQLError 或 SQLGetDiagRec 的调用都会返回有关一个错误的信息,然后删除有关该错误的信息。如果您不调用 SQLError 或 SQLGetDiagRec 来删除所有错误,则会在执行下一个将同一句柄作为参数来传递的函数调用时,删除这些错误。

每个对 SQLError 的调用都会传递三个句柄,这些句柄分别用于环境、连接和语句。第一个调用使用 SQL_NULL_HSTMT 获取与连接相关联的错误。同样,使用 SQL_NULL_DBC 和 SQL_NULL_HSTMT 的调用将获取任何与环境句柄相关联的错误。

每个对 SQLGetDiagRec 的调用将传递环境、连接或语句句柄。第一个调用传递句柄类型 SQL_HANDLE_DBC 以获取与连接关联的错误。第二个调用传递句柄类型 SQL_HANDLE_STMT,以获取与刚执行的语句相关联的错误。

如果有要报告的错误(不是 SQL_ERROR),SQLError 和 SQLGetDiagRec 将返回 SQL_SUCCESS;如果没有其它要报告的错误,则将返回 SQL_NO_DATA_FOUND。

 示例 1

以下代码段使用了 SQLError,并返回代码:

/* Declare required variables */
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN retcode;
UCHAR errmsg[100];
/* Code omitted here */
retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt );
if( retcode == SQL_ERROR ){
   SQLError( env, dbc, SQL_NULL_HSTMT, NULL, NULL,
         errmsg, sizeof(errmsg), NULL );
   /* Assume that print_error is defined */
   print_error( "Allocation failed", errmsg );
   return;
}

/* Delete items for order 2015 */
retcode = SQLExecDirect( stmt,
       "DELETE FROM SalesOrderItems WHERE ID=2015",
       SQL_NTS );
if( retcode == SQL_ERROR ) {
   SQLError( env, dbc, stmt, NULL, NULL,
            errmsg, sizeof(errmsg), NULL );
   /* Assume that print_error is defined */
   print_error( "Failed to delete items", errmsg );
   return;
}
 示例 2

以下代码段使用了 SQLGetDiagRec,并返回代码:

/* Declare required variables */
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN retcode;
SQLSMALLINT errmsglen;
SQLINTEGER errnative;
UCHAR errmsg[255];
UCHAR errstate[5];
/* Code omitted here */
retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt );
if( retcode == SQL_ERROR ){
   SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, errstate,
       &errnative, errmsg, sizeof(errmsg), &errmsglen);
    /* Assume that print_error is defined */
   print_error( "Allocation failed",
errstate, errnative, errmsg );
   return;

}
/* Delete items for order 2015 */
retcode = SQLExecDirect( stmt,
       "DELETE FROM SalesOrderItems WHERE ID=2015",
       SQL_NTS );
if( retcode == SQL_ERROR ) {
   SQLGetDiagRec(SQL_HANDLE_STMT, stmt,
       recnum, errstate,
       &errnative, errmsg, sizeof(errmsg), &errmsglen);
   /* Assume that print_error is defined */
   print_error("Failed to delete items",
       errstate, errnative, errmsg );
   return;
}


ODBC错误处理

时间: 2024-08-24 23:02:22

ODBC错误处理的相关文章

SSAS:OLE DB 错误: OLE DB 或 ODBC 错误 : Login failed for user 'NT Service\MSSQLServerOLAPService'

问题描述 按照微软官方教程尝试使用SSAS做OLAP时,出现如下错误信息: Severity Code Description Project File Line Suppression State Error OLE DB 错误: OLE DB 或 ODBC 错误 : Login failed for user 'NT Service\MSSQLServerOLAPService'.; 28000. 0 问题原因 该问题是由于连接SQL Server数据源的时候,产生了授权认证错误. 解决方案

win 7 下配置SQl server 2008 ODBC 错误的解决办法(端口1433 不通)

win 7安装SQl server 2008 下配置ODBC总是提示类似错误: 上图提示说明可能端口有问题,网上解决办法很多,经过自己的测试筛选解决办法如下: 1. 我们知道sqlserver2008通过端口 1433 连接到主机 localhost 的所以要保证端口1433开放 2.要保证防火墙通过1433端口或者关闭防火墙 3.在运行里 telnet 127.0.0.1 1433  测试提示如下错误    说明要到控制面板\程序\打开或关闭windows功能里勾选 Telnet服务器和客户端

Web系统常见安全漏洞及解决方案-SQL盲注

关于web安全测试,目前主要有以下几种攻击方法: 1.XSS 2.SQL注入 3.跨目录访问 4.缓冲区溢出 5.cookies修改 6.Htth方法篡改(包括隐藏字段修改和参数修改) 7.CSRF 8.CRLF 9.命令行注入 今天主要讲下SQL盲注. 一.SQL 盲注.发现数据库错误模式.跨站点脚本编制 严重性: 高 类型: 应用程序级别测试 WASC威胁分类: 命令执行类型:SQL 注入 CVE 引用: 不适用 安全风险: 1.      可能会查看.修改或删除数据库条目和表   ---S

SQLSERVER调用OPENROWSET的方法

前言:正好这两天在同步生产环境的某张表数据到测试环境,之前用过一些同步数据软件,感觉不太可靠,有时候稍有操作不当,就会出现生产环境数据被清空等情况,还要去恢复数据.如果能恢复还好,不能恢复那么......想想就觉得阔怕,后来想起 SQLSERVER 有 OPENROWSET 函数可以通过 T-SQL 访问远程数据库,正好可以使用,看得见的SQL 比 同步数据软件看起来安心多了,哈哈.... 不讲废话了 一.OPENROWSET 简介:包含访问 OLE DB 数据源中的远程数据所需的所有连接信息.

MySQL安装ODBC驱动出现126错误

需求:MySQL导入ODBC文件,需要安装ODBC驱动. 问题:本机的MySQL是5.0版本,刚开始下载的是5.3ODBC,然后出现以下错误: 解决方法:ODBC版本应该与MySQL版本一致,重新安装5.0版本的ODBC即可. 心得:百度上很多解决方法,但是不同的机子即使出现相同的问题,解决方法也是不同的.要多尝试.

连接SQLServer2005失败--[Microsoft][ODBC SQL Server Driver][DBNETLIB]一般性网络错误。请检查网络文档

连接SQLServer2005失败,错误信息: 错误类型:Microsoft OLE DB Provider for ODBC Drivers (0x80004005)[Microsoft][ODBC SQL Server Driver][DBNETLIB]一般性网络错误.请检查网络文档. 我的连接字符串是:driver={SQL Server};Server=192.168.10.139;database=TestFax;Uid=sa;pwd=xxxx; 奇怪的是,我将Server处写(loc

ODBC连接发生错误:未发现数据源名称并且未指定默认驱动程序

程序在使用ODBC方式连接数据库时发生错误: ERROR [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序. 什么原因造成的呢? 本人使用<Delphi+SQL Server数据库应用实例完全解析> 附带例程测试,发现不能连接数据库.提示通信模块驱动问题.环境:win7_x86 + SQL Server2000 + Delphi 7.解决方法: SQL Server 2000 1. 通过数据库->所有任务->还原数据库.2.

Win7x64中使用PowerDesigner连接Oralce数据库报“[Oracle][ODBC][Ora]ORA-12154:TNS:无法解析指定的连接标识符”错误解决方法

错误描述 操作系统是Win7 x64,Oracle服务端是Oracle11g x64,客户端是Oracle10gR2 x86. 使用PL-SQL Developer连接正常 使用系统ODBC连接正常.这里要注意的是,64位系统默认启动的是64位ODBC数据源管理器,默认指向的是服务端连接,所以需要为Oracle服务端也配置TNS Service Name,否则同样会连接报错.PowerDesigner默认启动的是32位的ODBC数据源管理器,程序路径为“%SystemRoot%\SysWOW64

错误1919,配置ODBC数据源MS Access Database时发生错误ODEC错误

WIN7 64位旗舰版安装OFFICE2003 提示:“错误1919,配置ODBC数据源MS Access Database时发生错误ODEC错误” 在64位系统上,32位软件的注册表的信息不是直接在在Software下,而是在Software\Wow6432Node下才是32位软件的注册信息. 只有64位软件才是直接在Software下的. 找一台win7 32位操作系统的机器导出注册表,位置如下: HKEY_CURRENT_USER\Software\ODBC HKEY_LOCAL_MACH