ODBC接口

1.系统概述

开放式数据库连接(ODBC)是一种广泛接受的应用程序编程接口(API),适用于数据库访问。它基于数据库API Call-Level接口(CLI)和ISO/IEC中的规范,并使用结构化查询语言(SQL)作为数据库访问语言。

ODBC旨在实现最大的互操作性,即单个应用程序能够访问不同数据库管理系统(DBMSs)使用相同的源代码。数据库应用程序调用ODBC接口中的函数,这些函数在名为drivers的数据库特定模块中实现。驱动程序的使用将应用程序与特定于数据库的调用隔离开,其方式与打印机驱动程序将字处理程序与特定于打印机的命令隔离的方式相同。由于驱动程序是运行时加载的,因此用户只需添加新的驱动程序才能访问新的DBMS;不需要重新编译或重新链接应用程序。

2.创建数据源

2.1.Linux平台创建ODBC数据源

UXDB数据库ODBC驱动程序在Linux操作系统上的使用依赖于UnixODBC库,如果UnixODBC未安装在系统目录下,则为了能使uxdb odbc驱动程序找到需要的库文件,用户需要设置系统环境变量 LD_LIBRARY_PATH指向动态库。另外,如果安装的UnixODBC生成的动态库名称不是libodbcinst.so(如 libodbcinst.so.1.0.0 或者 libodbcinst.so.2.0.0 等),则需要对实际库文件建立符号链接。

2.1.1.安装UnixODBC

安装UnixODBC驱动程序管理器有如下几种方法。

  • 二进制安装

    yum install unixODBC
    yum install unixODBC-devel
    
  • rpm包安装

    官网下载对应linux版本的odbc驱动包,并安装。

    如:下载linux7下的ODBC驱动包unixODBC-2.3.1-11.el7.x86_64.rpm,以root用户安装。

    rpm -ivh unixODBC-2.3.1-11.el7.x86_64.rpm
    
  • 源码编译安装

    获取unixODBC-2.3.1.tar.gz,将其放到/usr/local目录下,执行如下命令。

    tar zxvf unixODBC-2.3.1.tar.gz
    cd unixODBC-2.3.1 
    ./configure --prefix=/usr/local/unixODBC-2.3.1 --includedir=/usr/include 
    --libdir=/usr/lib -bindir=/usr/bin --sysconfdir=/etc
    make
    make install
    

安装成功后,unixODBC所需的头文件都被安装到/usr/inlucde下,编译好的库文件安装到/usr/lib下,与unixODBC相关的可执行文件安装到/usr/bin下,配置文件安装到/etc下。

安装之后可运行如下命令查看是否安装成功。

[uxdb@local101:~]$ isql --v
unixODBC 2.3.1

2.1.2.安装uxdb数据库

下载需要的UXDB数据库软件包进行安装,安装成功之后,初始化并启动数据库实例。

2.1.3.安装uxdb odbc驱动程序

下载与数据库版本对应的uxdb数据库odbc驱动程序包(uxdb-odbc_linux_X86.tar.gz),进行解压,将解压之后的文件夹移动到数据库安装路径下,uxdb数据库安装路径为/home/uxdb/uxdbinstall。

2.1.4.连接测试

查看odbc配置文件,执行如下命令。

[uxdb@local101:~]$ odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/uxdb/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
[uxdb@local101:~]$ 
  1. 根据实际情况修改配置文件。

    修改odbcinst.ini(配置驱动),如下所示。

    #uxdb odbc驱动库的位置
    
    [UXSQL]
    Driver=/home/uxdb/uxdbinstall/odbc/lib/uxsqlodbcw.so
    Setup=/home/uxdb/uxdbinstall/odbc/lib/uxsqlodbcw.so
    

    odbc.ini用于配置ODBC的数据源(DSN),在UXDB数据源配置项中可配置的连接参数如下表所示。

    数据源配置项中可配置的连接参数

    参数名称 说明
    DRIVER UXDB ODBC驱动名称:UXSQL
    SERVERNAME 目标服务器:ip 地址
    PORT 端口号
    DATABASE 数据库名
    USERNAME 用户名
    PASSWORD 密码

    配置odbc.ini文件,如下所示。

    sudo vim /etc/odbc.ini
    
    [uxdb]
    driver = UXSQL
    Servername = 192.72.1.54
    port = 5432
    database = uxdb
    username = uxdb
    password = 123456
    
  2. 测试是否可以连接。

    isql –v uxdb(数据源名称)
    
    [uxdb@uxpool01 bin]$ ./isql -v uxdb
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    

2.2.Windows平台创建ODBC数据源

  1. 选择“开始”=>“设置”=>“控制面板”菜单,在弹出窗口中双击【管理工具】(win11版本下,双击控制面板中的【Windows 工具】)图标进入管理工具界面,双击【数据源(ODBC)】图标,打开ODBC数据源管理器。

  2. 选择【系统DSN】选项卡,单击【添加(D)…】按钮,系统弹出【创建新数据源】对话框。

  3. 在ODBC驱动器程序列表中,选择【UXsinoDB ANSI】或【UXsinoDB Unicode】,单击【完成】按钮,系统弹出【UXsinoDB ANSI/Unicode Driver (uxsqlODBC) Setup】对话框。

    ANSI配置对话框:

    Unicode配置对话框:

  4. 配置示例。

    Database:要连接的数据库名,如 uxdb。

    Server:要连接服务端IP地址,如 192.168.1.82,连接本机安装的数据库可填回环地址 127.0.0.1。

    Port:要连接的集群port,数据库默认端口号为 52025。

    User Name:要连接的数据库用户,如 uxdb。

    Password:要连接的数据库的密码,如 123456。

    其他使用默认值。

  5. 单击【Test】按钮可验证数据库连接状态,成功如下所示,确定后单击【Save】保存。

3.接口说明

本章节主要提供了ODBC接口,并详细描述接口参数信息等。

3.1.SQLAllocHandle

3.1.1.功能描述

SQLAllocHandle分配环境、连接、语句或描述符句柄。

3.1.2.语法

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

3.1.3.参数

  • HandleType

    [输入]SQLAllocHandle要分配的句柄类型。必须是以下值之一。

    • SQL_HANDLE_DBC

    • SQL_HANDLE_DESC

    • SQL_HANDLE_ENV

    • SQL_HANDLE_STMT

  • InputHandle

    [输入]要在这里分配新句柄,如果HandleType为SQL_HANDLE_ENV,则这个值是SQL_NULL_HANDLE,如果HandleType为SQL_HANDLE_DBC,则这一定是一个环境句柄,如果HandleType为SQL_HANDLE_STMT或者SQL_HANDLE_DESC,则是一个连接句柄。

  • OutputHandlePtr

    [输出]指向缓冲区的指针,该缓冲区将句柄返回到新分配的数据结构。

3.1.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_INVALID_HANDLE或SQL_ERROR。

分配环境句柄外的其他句柄时,如果SQLAllocHandle返回SQL_ERROR,它会将OutputHandlePtr设置为SQL_NULL_HDBC、SQL_NULL_HSTMT或SQL_NULL_HDESC,具体取决于HandleType的值,除非输出参数为null指针。然后,应用程序可以从与InputHandle参数中的句柄关联的诊断数据结构获取其他信息。

3.1.5.环境处理分配错误

环境分配在驱动程序管理器内和每个驱动程序中发生。SQLAllocHandle返回的错误的HandleType为SQL_HANDLE_ENV取决于发生错误的级别。

如果在调用HandleType为SQL_HANDLE_ENV的SQLAllocHandle时驱动程序管理器无法为*OutputHandlePtr分配内存,或者应用程序为OutputHandlePtr提供null指针,则SQLAllocHandle将返回SQL_ERROR。驱动程序管理器将OutputHandlePtr SQL_NULL_HENV(除非应用程序提供了null指针,该指针返回SQL_ERROR)。没有用于关联其他诊断信息的句柄。

在应用程序调用SQLConnect、SQLBrowseConnect或SQLDriverConnect之前,驱动程序管理器不会调用驱动程序级环境句柄分配函数。如果驱动程序级SQLAllocHandle函数中发生错误,驱动程序管理器级SQLConnect、SQLBrowseConnect或SQLDriverConnect函数将返回SQL_ERROR。诊断数据结构包含SQLSTATE IM004(驱动程序的SQLAllocHandle失败)。错误在连接句柄上返回。

3.1.6.诊断

当SQLAllocHandle返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过调用SQLGetDiagRec,将相应的HandleType和Handle设置为InputHandle的值来获取关联的SQLSTATE值。SQL_SUCCESS_WITH_INFO(OutputHandle SQL_ERROR)返回非参数。下表列出了SQLAllocHandle通常返回的SQLSTATE值,并说明了此函数上下文中的每个值;标注为"(DM)"位于驱动程序管理器返回的SQLSTATEs说明之前。除非另有说明,否则将与每个SQLSTATE值关联的返回代码是SQL_ERROR。

SQLAllocHandle 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回SQL_SUCCESS_WITH_INFO.)
08003 连接未打开 (DM)HandleType参数SQL_HANDLE_STMT或SQL_HANDLE_DESC,但InputHandle参数指定的连接未打开。连接过程必须成功完成(并且必须打开连接)驱动程序分配语句或描述符句柄。
HY000 常规错误 出现错误,其中没有特定的SQLSTATE,并且未定义特定于实现的SQLSTATE。MessageText缓冲区中SQLGetDiagRec返回的错误消息描述了错误及其原因。
HY001 内存分配错误 (DM)驱动程序管理器无法为指定的句柄分配内存。驱动程序无法为指定的句柄分配内存。
HY009 null指针的使用无效 (DM)OutputHandlePtr参数为空指针。
HY010 函数序列错误 (DM)HandleType SQL_HANDLE_DBC,并且尚未调用SQLSetEnvAttr来设置SQL_ODBC_VERSION属性。(DM)为InputHandle调用了一个异步执行函数,并且当调用SQLAllocHandle函数时,当HandleType设置为SQL_HANDLE_STMT或SQL_HANDLE_DESC时,该函数仍在执行。
HY013 内存管理错误 HandleType参数SQL_HANDLE_DBC SQL_HANDLE_STMT或SQL_HANDLE_DESC;由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY014 超出句柄数的限制 已达到为HandleType参数指示的句柄类型分配的句柄数的驱动程序定义限制。
HY092 属性/选项标识符无效 (DM)HandleType参数不是如下参数:
  • SQL_HANDLE_ENV

  • SQL_HANDLE_DBC

  • SQL_HANDLE_STMT

  • SQL_HANDLE_DESC

HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM)有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能 已创建HandleType SQL_HANDLE_DESC驱动程序。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM)HandleType参数SQL_HANDLE_STMT,并且驱动程序不是有效的ODBC驱动程序。(DM)HandleType参数SQL_HANDLE_DESC,并且驱动程序不支持分配描述符句柄。

3.2.SQLBindCol

3.2.1.功能描述

SQLBindCol将应用程序数据缓冲区绑定到结果集的列中。

3.2.2.语法

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

3.2.3.参数

  • StatementHandle

    [输入]语句句柄。

  • ColumnNumber

    [输入]要绑定结果集的列号。起始列号为0,以递增的顺序计算列号,第0列是书签列。若未设置书签页,则起始列号为1。

  • TargetType

    [输出]缓冲区中C数据类型的标识符。

  • TargetValuePtr

    [延迟输入/输出]指向要绑定到列的数据缓冲区的指针。SQLFetch和SQLFetchScroll返回此缓冲区的数据。当SQL_FETCH_BY_BOOKMARK操作时,SQLBulkOperations将返回此缓冲区中的数据;当操作SQL_ADD或SQL_UPDATE_BY_BOOKMARK时,它将从此缓冲区检索数据。当SQL_REFRESH操作时,SQLSetPos将返回此缓冲区中的数据;当SQL_UPDATE操作时,它将从该缓冲区检索数据。

    如果TargetValuePtr为空指针,驱动程序将取消列的数据缓冲区绑定。应用程序可以通过使用SQL_UNBIND选项调用SQLFreeStmt来取消所有列的绑定。如果调用SQLBindCol中的TargetValuePtr参数为null指针,但StrLen_or_IndPtr参数是有效的值,则应用程序可以取消列的数据缓冲区绑定,但仍为列绑定长度/指示器缓冲区。

  • BufferLength

    [输入]*TargetValuePtr缓冲区的长度。

    驱动程序在返回可变长度的数据(如字符或二进制数据)时,使用BufferLength避免写入 *TargetValuePtr缓冲区的末尾。请注意,驱动程序在将字符数据返回到 *TargetValuePtr时对null终止字符进字段数。因此,TargetValuePtr必须包含null终止字符的空间,否则驱动程序将截断数据。

    当驱动程序返回固定长度的数据(如整数或日期结构)时,驱动程序将忽略BufferLength,并假定缓冲区足够大以容纳数据。因此,应用程序必须分配一个足够大的缓冲区用于固定长度的数据,否则驱动程序将写入缓冲区的末尾。

    当BufferLength小于0但当BufferLength为0时,SQLBindCol将返回SQLSTATE HY090(字符串或缓冲区长度无效)。但是,如果TargetType指定了字符类型,则应用程序不应将BufferLength设置为0,因为在这种情况下符合ISO CLI 的驱动程序将返回SQLSTATE HY090(无效的字符串或缓冲区长度)。

  • StrLen_or_IndPtr

    [延迟输入/输出]指向要绑定到列的长度/指示器缓冲区的指针。SQLFetch和SQLFetchScroll返回此缓冲区中的值。当操作SQL_ADD、SQL_UPDATE_BY_BOOKMARK或SQL_DELETE_BY_BOOKMARK时,SQLBulkOperations从该缓冲区检索值。当SQL_FETCH_BY_BOOKMARK操作时,SQLBulkOperations将在此缓冲区中返回一个值。当SQL_REFRESH操作时,SQLSetPos将在此缓冲区中返回值;当SQL_UPDATE操作时,它将从此缓冲区检索值。

    SQLFetch、SQLFetchScroll、SQLBulkOperations和SQLSetPos可以在长度/指示器缓冲区中返回以下值:

    • 可返回的数据的长度

    • SQL_NO_TOTAL

    • SQL_NULL_DATA

    应用程序可以将以下值放在长度/指示器缓冲区中,以用于SQLBulkOperations或SQLSetPos:

    • SQL_NTS

    • SQL_NULL_DATA

    • SQL_DATA_AT_EXEC

    • SQL_LEN_DATA_AT_EXEC宏的结果

    • SQL_COLUMN_IGNORE

    如果指示器缓冲区和长度缓冲区是单独的缓冲区,则指示器缓冲区只能返回SQL_NULL_DATA,而长度缓冲区可以返回所有其他值。

    如果StrLen_or_IndPtr为空指针,则不使用长度或指示器值。提取数据且数据为NULL时,这是一个错误。

3.2.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR或SQL_INVALID_HANDLE。

3.2.5.诊断

当SQLBindCol返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过调用具有SQL_HANDLE_STMT的HandleType和StatementHandle句柄的SQLGetDiagRec来获取关联的SQLSTATE值。下表列出了SQLBindCol通常返回的SQLSTATE值,并说明了此函数上下文中的每个值;标注为"(DM)"位于驱动程序管理器返回的SQLSTATEs说明之前。除非另有说明,否则将与每个SQLSTATE值关联的返回代码是SQL_ERROR。

SQLBindCol 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回SQL_SUCCESS_WITH_INFO。)
07006 受限数据类型属性冲突 (DM)ColumnNumber参数为0,并且TargetType参数未SQL_C_BOOKMARK或SQL_C_VARBOOKMARK。
07009 描述符索引无效 为参数ColumnNumber指定的值超出了结果集的最大列数。
HY000 常规错误 出现错误,其中没有特定的SQLSTATE,并且未定义特定于实现的SQLSTATE。*MessageText缓冲区中SQLGetDiagRec返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY003 应用程序缓冲区类型无效 参数TargetType既不是有效的数据类型,也不是SQL_C_DEFAULT。
HY010 函数序列错误

(DM)为与StatementHandle关联的连接句柄调用了异步执行函数。调用SQLBindCol时,此异步函数仍在执行。

(调用)SqlExecute、SQLExecDirect或SQLMoreResults的DM,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM)调用了StatementHandle的异步执行函数,在调用此函数时仍在执行。

(调用了SQLExecute)SQLExecute、SQLExecDirect、 SQLBulkOperations或SQLSetPos的DM代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效

(DM)BufferLength参数指定的值小于0。

(DM)ColumnNumber参数设置为0,为参数BufferLength指定的值不等于4。

HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM)有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能

驱动程序或数据源不支持由TargetType参数和特定于驱动程序的数据类型的组合指定的转换SQL列的数据类型。

参数ColumnNumber为0,驱动程序不支持书签。

参数TargetType为下列值之一:

  • SQL_C_NUMERIC

  • SQL_C_SBIGINT

  • SQL_C_UBIGINT

HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM)与StatementHandle关联的驱动程序不支持函数。

3.3.SQLBindParameter

3.3.1.功能描述

SQLBindParameter将缓冲区绑定到SQL语句中的参数标记。SQLBindParameter支持绑定到unicode C数据类型,即使基础驱动程序不支持unicode数据。

3.3.2.语法

SQLRETURN SQLBindParameter(  
    SQLHSTMT        StatementHandle,  
    SQLUSMALLINT    ParameterNumber,  
    SQLSMALLINT     InputOutputType,  
    SQLSMALLINT     ValueType,  
    SQLSMALLINT     ParameterType,  
    SQLULEN         ColumnSize,  
    SQLSMALLINT     DecimalDigits,  
    SQLPOINTER      ParameterValuePtr,  
    SQLLEN          BufferLength,  
    SQLLEN *        StrLen_or_IndPtr);  

3.3.3.参数

  • StatementHandle

    [输入]语句句柄。

  • ParameterNumber

    [输入]参数编号,按递增参数顺序排序,从1开始。

  • InputOutputType

    [输入]参数的类型。

  • ValueType

    [输入]参数的C数据类型。

  • ParameterType

    [输入]参数的SQL数据类型。

  • ColumnSize

    [输入]列的大小或相应参数标记的表达式。

  • DecimalDigits

    [输入]列的十进制数字或相应参数标记的表达式。

  • ParameterValuePtr

    [延迟输入]指向参数数据缓冲区的指针。

  • BufferLength

    [输入/输出]ParameterValuePtr缓冲区的长度。

  • StrLen_or_IndPtr

    [输入]缓冲区的长度或指示器指针。若为空值,则未使用任何长度或指示器值。

3.3.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR或SQL_INVALID_HANDLE。

3.3.5.诊断

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

SQLBindParameter 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回SQL_SUCCESS_WITH_INFO。)
07006 受限制的数据类型属性冲突 ValueType参数标识的数据类型无法转换为ParameterType参数标识的数据类型。请注意,此错误可能由SQLExecDirect、SQLExecute或SQLPutData在执行时返回,而不是由SQLBindParameter返回。
07009 描述符索引无效 (DM)为参数ParameterNumber指定的值小于1。
HY000 常规错误 发生了一个错误,该错误没有特定的SQLSTATE,没有为其定义实现特定的SQLSTATE。*MessageText缓冲区中的SQLGetDiagRec返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY003 应用程序缓冲区类型无效 参数ValueType指定的值不是有效的C数据类型或SQL_C_DEFAULT。
HY004 SQL数据类型无效 为参数ParameterType指定的值既不是有效的ODBC SQL数据类型标识符,也不是驱动程序支持的特定于驱动程序的SQL数据类型标识符。
HY009 参数值无效

(DM)参数ParameterValuePtr为null指针,则参数StrLen_or_IndPtr为null指针,并且未SQL_PARAM_OUTPUT参数InputOutputType。

(DM)SQL_PARAM_OUTPUT,其中参数ParameterValuePtr为null指针,C类型为char或Binary,BufferLength(cbValueMax)大于0。

HY010 函数序列错误

(DM)为与StatementHandle关联的连接句柄调用了异步执行函数。调用SQLBindParameter时仍在执行此异步函数。

(DM)为StatementHandle调用SQLExecute、SQLExecDirect或SQLMoreResults,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM)为StatementHandle调用了异步执行函数,并且在调用此函数时仍在执行。

(DM)为StatementHandle调用SQLExecute、SQLExecDirect、SQLBulkOperations或SQLSetPos,并返回SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY021 描述符信息不一致

在一致性检查过程中检查的描述符信息不一致。

为参数DecimalDigits指定的值超出了ParameterType参数指定的SQL数据类型的列的数据源所支持的值的范围。

HY090 字符串或缓冲区长度无效 (DM)BufferLength中的值小于0。
HY104 精度或小数位值无效 为参数ColumnSize或DecimalDigits指定的值超出ParameterType参数指定的SQL数据类型的数据源支持的值范围。
HY105 参数类型无效 (DM)为参数InputOutputType指定的值无效。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM)有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能

驱动程序或数据源不支持由为参数ValueType指定的值与为参数ParameterType指定的驱动程序特定值的组合指定的转换。

为参数ParameterType指定的值是一个有效的ODBC SQL驱动程序支持的ODBC版本的数据类型标识符,但驱动程序或数据源不支持它。

参数ValueType为下列值之一:

  • SQL_C_NUMERIC

  • SQL_C_SBIGINT

  • SQL_C_UBIGINT

HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM)与StatementHandle关联的驱动程序不支持函数。

3.4.SQLBrowseConnect

3.4.1.功能描述

SQLBrowseConnect支持一种迭代方法,该方法发现和枚举连接到数据源所需的属性和属性值。对SQLBrowseConnect的每次调用都将返回属性和属性值的连续级别。枚举所有级别后,将完成到数据源的连接,并由SQLBrowseConnect返回完整的连接字符串。SQL_SUCCESS或SQL_SUCCESS_WITH_INFO的返回代码指示已指定所有连接信息,并且应用程序现在已连接到数据源。

3.4.2.语法

SQLRETURN SQLBrowseConnect(  
    SQLHDBC         ConnectionHandle,  
    SQLCHAR *       InConnectionString,  
    SQLSMALLINT     StringLength1,  
    SQLCHAR *       OutConnectionString,  
    SQLSMALLINT     BufferLength,  
    SQLSMALLINT *   StringLength2Ptr); 

3.4.3.参数

  • ConnectionHandle

    [输入]连接句柄。

  • InConnectionString

    [输入]浏览请求连接字符串。

  • StringLength1

    [输出]*InConnectionString的长度。

  • OutConnectionString

    [输出]一个缓冲区的指针,此缓冲区用于存放浏览结果连接字符串。

  • BufferLength

    [输出]*InConnectionString的长度。

  • StringLength2Ptr

    [输出]*OutConnectionString中返回的字节总数(不包括空值终止字节)。如果要返回的字节数大于等于BufferLength,那么 *OutConnectionString 中的连接字符串会被截断为BufferLength减去空值终止字符的长度。

3.4.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_ERROR、SQL_INVALID_HANDLE或SQL_STILL_EXECUTING。

3.4.5.诊断

当SQLBrowseConnect返回SQL_ERROR、SQL_SUCCESS_WITH_INFO或SQL_NEED_DATA时,可以通过使用HandleType的SQL_HANDLE_STMT和句柄ConnectionHandle调用SQLGetDiagRec来获取关联的SQLSTATE值。下面的表格列出了由SQLBrowseConnect返回的SQLSTATE值,并对该函数的上下文中的每个值进行了说明;标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs的说明之前。除非另有说明,否则与每个SQLSTATE值相关联的返回代码将SQL_ERROR。

SQLBrowseConnect 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区*OutConnectionString不够大,无法返回整个浏览结果连接字符串,因此字符串被截断。Buffer *StringLength2Ptr包含未截断浏览结果连接字符串的长度。(函数返回SQL_NEED_DATA。)
01S00 连接字符串属性无效

在浏览请求连接字符串(InConnectionString)中指定了无效的attribute关键字。(函数返回SQL_NEED_DATA。)

在浏览请求连接字符串中指定了attribute关键字(InConnectionString),不适用于当前连接级别。(函数返回SQL_NEED_DATA。)

01S02 改变值 驱动程序不支持SQLSetConnectAttr中的将valueptr参数的指定值,并将其替换为类似值。(函数返回SQL_SUCCESS_WITH_INFO。)
08001 客户端无法建立连接 驱动程序无法与数据源建立连接。
08002 连接名称正在使用中 (DM)指定的连接已用于与数据源建立连接,并且该连接已打开。
08004 服务器拒绝了连接 由于实现定义的原因,数据源已拒绝建立连接。
08S01 通信链接失败 在函数完成处理之前,驱动程序与该驱动程序尝试连接到的数据源之间的通信链接失败。
28000 授权规范无效 无论是(InConnectionString)的浏览请求连接字符串中指定的用户标识符或授权字符串,都是由数据源定义的限制。
HY000 常规错误 发生了一个错误,该错误没有特定的SQLSTATE,没有为其定义实现特定的SQLSTATE。*MessageText缓冲区中的SQLGetDiagRec返回的错误消息描述了错误及其原因。
HY001 内存分配错误

(DM)驱动程序管理器无法分配支持执行或完成该函数所需的内存。

驱动程序无法分配支持执行或完成此函数所需的内存。

HY008 操作已取消

通过调用SQLCancelHandle函数取消了异步操作。然后,在ConnectionHandle上再次调用原始函数。

已通过在多线程应用程序中的其他线程上调用ConnectionHandle上的SQLCancelHandle取消了操作。

HY010 函数序列错误 (DM)异步执行的函数(不是为ConnectionHandle调用了这一),并且在调用此函数时仍在执行。
HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM)为参数StringLength1指定的值小于0且与SQL_NTS不相等。

(DM)为参数BufferLength指定的值小于0。

HY114 驱动程序不支持连接级别的异步函数执行 (DM)应用程序在建立连接之前已对连接句柄启用了异步操作。但是,驱动程序不支持对连接句柄进行异步操作。
HYT00 超时时间已到 完成到数据源的连接之前,登录超时期限已过期。超时期限通过SQLSetConnectAttr设置,SQL_ATTR_LOGIN_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过SQLSetConnectAttr设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM)对应于指定数据源名称的驱动程序不支持该函数。
IM002 找不到数据源,未指定默认驱动程序

(DM)在系统信息中找不到在浏览请求连接字符串(InConnectionString)中指定的数据源名称,也没有默认的驱动程序规范。

在系统信息中找不到(DM)ODBC数据源和默认驱动程序信息。

IM003 无法加载指定的驱动程序 (DM)系统信息中的数据源规范中列出的驱动程序,或者找不到或无法加载driver关键字指定的驱动程序。
IM004 驱动程序在SQL_HANDLE_ENV上的SQLAllocHandle失败 (DM)在SQLBrowseConnect期间,驱动程序管理器调用了驱动程序的SQLAllocHandle函数,HandleType为SQL_HANDLE_ENV,驱动程序返回了一个错误。
IM005 SQL_HANDLE_DBC上驱动程序的SQLAllocHandle失败 (DM)在SQLBrowseConnect期间,驱动程序管理器调用了驱动程序的SQLAllocHandle函数,HandleType为SQL_HANDLE_DBC,驱动程序返回了一个错误。
IM006 驱动程序的SQLSetConnectAttr失败 (DM)在SQLBrowseConnect期间,驱动程序管理器调用了驱动程序的SQLSetConnectAttr函数,驱动程序返回了一个错误。
IM009 无法加载转换DLL 驱动程序无法加载为数据源或连接指定的转换DLL。
IM010 数据源名称太长 (DM)DSN关键字的属性值的长度超过SQL_MAX_DSN_LENGTH个字符。
IM011 驱动程序名称太长 (DM)DRIVER关键字的属性值的长度超过255个字符。
IM012 DRIVER关键字语法错误 (DM)DRIVER关键字的关键字值对包含语法错误。
IM014 指定的DSN包含驱动程序和应用程序之间的体系结构不匹配 (DM)32位应用程序使用连接到64位驱动程序的DSN;反之亦然。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用SQLCompleteAsync来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回SQL_STILL_EXECUTING并且启用了通知模式,则必须在句柄上调用SQLCompleteAsync,以执行后处理并完成操作。
S1118 驱动程序不支持异步通知 当驱动程序不支持异步通知时,不能设置SQL_ATTR_ASYNC_DBC_EVENT或SQL_ATTR_ASYNC_DBC_RETCODE_PTR。

3.5.SQLBulkOperations

3.5.1.功能描述

SQLBulkOperations执行批量插入和批量书签操作,包括按书签更新、删除和提取。

3.5.2.语法

SQLRETURN SQLBulkOperations(  
    SQLHSTMT       StatementHandle,  
    SQLUSMALLINT   Operation); 

3.5.3.参数

  • StatementHandle

    [输入]语句句柄。

  • Operation

    [输入]要执行的操作:SQL_ADD、SQL_UPDATE_BY_BOOKMARK、SQL_DELETE_BY_BOOKMARK、​SQL_FETCH_BY_BOOKMARK。

3.5.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_STILL_EXECUTING、​SQL_ERROR或SQL_INVALID_HANDLE。

3.5.5.诊断

当SQLBulkOperations返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过调用具有SQL_HANDLE_STMT的HandleType和StatementHandle句柄的SQLGetDiagRec来获取关联的SQLSTATE值。下面的表格列出了由SQLBulkOperations返回的SQLSTATE值,并解释了与这个函数相关的每个信息;标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs说明之前。除非另有说明,否则将指定与每个SQLSTATE值SQL_ERROR返回代码。

对于所有那些可返回SQL_SUCCESS_WITH_INFO或SQL_ERROR(除了01xxx SQLSTATEs)的所有SQLSTATES,如果多行运算的一行或多行(但不是全部)发生错误,则返回SQL_SUCCESS_WITH_INFO;如果单行操作出错,则返回SQL_ERROR。

SQLBulkOperations 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回SQL_SUCCESS_WITH_INFO。)
01004 字符串数据右截断 Operation参数SQL_FETCH_BY_BOOKMARK,并且为数据类型为SQL_C_CHAR或SQL_C_BINARY的列返回的字符串或二进制数据导致截断非空字符或非NULL二进制数据。
01S01 行中错误 Operation 参数SQL_ADD,并且在执行该操作时,一行或多行出错,但至少成功添加了一行。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S07 小部分的截断

Operation 参数SQL_FETCH_BY_BOOKMARK,应用程序缓冲区的数据类型不是 SQL_C_CHAR 或 SQL_C_BINARY,并且返回给一列或多列的应用程序缓冲区的数据被截断。(对于数值 C 数据类型,数字的小数部分被截断。对于包含时间部分的timetimestamp 和 interval C 数据类型,该时间的小数部分被截断。)

函数返回 SQL_SUCCESS_WITH_INFO。

07006 违反数据类型属性规定

Operation 参数SQL_FETCH_BY_BOOKMARK,并且结果集内列的数据值无法转换为调用 SQLBindCol 时 TargetType 参数指定的数据类型。

Operation 参数SQL_UPDATE_BY_BOOKMARK或SQL_ADD,并且应用程序缓冲区中的数据值无法转换为结果集内列的数据类型。

07009 描述符索引无效 参数 Operation SQL_ADD,并且列绑定的列号大于结果集的列数。
21S02 取得表格的程度与列的列表不匹配 参数 Operation 已SQL_UPDATE_BY_BOOKMARK;并且没有列可更新,因为所有列都是未绑定的或只读的,或者绑定长度/指示器缓冲区中的值SQL_COLUMN_IGNORE。
22001 字符串数据右截断 将字符或二进制值赋值给结果集的列会导致字符) 的非空 截断 (表示二进制) 字符或字节。
22003 数值范围外

Operation 参数为 SQL_ADD 或SQL_UPDATE_BY_BOOKMARK ,对结果组中一列的数字值的指定,引起了整个(与部分相反)数字被截断。

Operation 参数为SQL_FETCH_BY_BOOKMARK,对于一个或多个绑定列,返回的数字值会引起有意义数字的丢失。

22007 日期/时间格式无效

Operation 参数SQL_ADD或SQL_UPDATE_BY_BOOKMARK,将日期或时间戳值赋值给结果集的列会导致年、月或日字段超过范围。

参数 Operation SQL_FETCH_BY_BOOKMARK,返回一个或多个绑定列的日期或时间戳值将导致年、月或日字段超过范围。

22008 日期/时间字段溢出

Operation 参数为 SQL_ADD 或 SQL_UPDATE_BY_BOOKMARK,对发送到结果集内列的数据执行日期时间算术会导致日期/时间字段 (年、月、日、小时、分钟或第二个字段) 超出字段允许的值范围,或者根据公历的 datetime 自然规则无效。

Operation 参数为 SQL_FETCH_BY_BOOKMARK,对从结果集检索的数据执行日期/时间算术会导致日期/时间字段 (年、月、日、小时、分钟或第二个字段) 的结果超出字段允许的值范围,或者根据公历的 datetime 自然规则无效。

22015 间隔字段溢出

Operation 参数SQL_ADD或SQL_UPDATE_BY_BOOKMARK,将确切的数值或间隔 C 类型赋值给间隔 SQL 数据类型导致有效数字丢失。

Operation 参数SQL_ADD或SQL_UPDATE_BY_BOOKMARK;当分配给间隔 SQL 类型时,在间隔 SQL 类型中不存在 C 类型的值的表示形式。

Operation 参数SQL_FETCH_BY_BOOKMARK,从确切的数值或间隔 SQL 类型分配给间隔 C 类型导致前导字段中的有效数字丢失。

Operation 参数已SQL_FETCH_BY_BOOKMARK;当分配给间隔 C 类型时,在间隔 C 类型中不存在 SQL 类型的值的表示形式。

22018 强制转换规范的字符值无效

Operation 参数已SQL_FETCH_BY_BOOKMARK;C 类型是精确或近似数值、日期/时间或间隔数据类型;列的 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。

参数 Operation 已 SQL_ADD或SQL_UPDATE_BY_BOOKMARK;SQL 类型是精确或近似数值、日期/时间或间隔数据类型;C 类型为 SQL_C_CHAR;列中的值不是绑定 SQL 类型的有效文本。

23000 完整性约束冲突

Operation 参数SQL_ADD、SQL_DELETE_BY_BOOKMARK或SQL_UPDATE_BY_BOOKMARK,并且违反了完整性约束。

Operation 参数SQL_ADD,未绑定的列定义为 NOT NULL 且没有默认值。

Operation 参数SQL_ADD,绑定缓冲区中 指定的 StrLen_or_IndPtr长度SQL_COLUMN_IGNORE,并且列没有默认值。

24000 游标状态无效 StatementHandle 已执行,但没有结果集与 StatementHandle 相关联。
40001 序列化失败 由于资源与另一个事务发生死锁,事务已回滚。
40003 语句完成未知 在执行此函数期间,关联的连接失败,无法确定事务的状态。
42000 语法错误或访问冲突 驱动程序无法根据需要锁定行以执行 Operation 参数中 请求的操作。
44000 WITH CHECK OPTION 冲突 Operation 参数是 SQL_ADD 或 SQL_UPDATE_BY_BOOKMARK,并且插入或更新是在查看的(或派生自通过指定 WITH CHECK OPTION 创建的已查看表) 的表上执行的,这样一来,受插入或更新影响的一行或多行将不再存在于所查看的表中。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

为 StatementHandle 启用了异步处理。调用了 函数,在函数完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用函数。

调用了 函数,在函数完成执行之前,从多线程应用程序中的不同线程对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLBulkOperations 函数时,此异步函数仍在执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM 代码,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM) 指定的 StatementHandle 未执行状态。调用函数时未先调用 SQLExecDirect 、SQLExecute 或目录函数。

(DM) 异步执行的函数 (不是此函数) StatementHandle 调用,并且仍在调用此函数时执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

(StatementHandle) SQLExtendedFetch 之后调用了 SQLBulkOperations 的 DM 代码。

HY011 现在无法设置属性 SQL_ATTR_ROW_STATUS_PTR SQLFetch 或 SQLFetchScroll 和 SQLBulkOperations 的调用之间设置了 SQL_ATTR_ROW_STATUS_PTR 语句属性。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效

Operation 参数SQL_ADD或SQL_UPDATE_BY_BOOKMARK;数据值不是空指针;C 数据类型为 SQL_C_BINARY 或 SQL_C_CHAR;列长度值小于 0,但不等于 SQL_DATA_AT_EXEC、SQL_COLUMN_IGNORE、 SQL_NTS 或 SQL_NULL_DATA,或者小于或等于 SQL_LEN_DATA_AT_EXEC_OFFSET。

长度/指示器缓冲区中的值已SQL_DATA_AT_EXEC;SQL 类型是SQL_LONGVARCHAR、SQL_LONGVARBINARY或特定于数据源的长数据类型; SQLGetInfo SQL_NEED_LONG_DATA_LEN信息类型为"Y"。

Operation参数SQL_ADD,SQL_ATTR_USE_BOOKMARK 语句属性设置为 SQL_UB_VARIABLE,列 0 绑定到长度不等于此结果集书签的最大长度的缓冲区。(此长度在 IRD 的 SQL_DESC_OCTET_LENGTH 字段中可用,并且可以通过调用 SQLDescribeCol、SQLColAttribute或 SQLGetDescField。)

HY092 属性标识符无效

(DM) Operation 参数指定的值无效。

Operation 参数SQL_ADD SQL_UPDATE_BY_BOOKMARK或SQL_DELETE_BY_BOOKMARK, SQL_ATTR_CONCURRENCY语句属性设置为SQL_CONCUR_READ_ONLY。

Operation 参数SQL_DELETE_BY_BOOKMARK SQL_FETCH_BY_BOOKMARK或SQL_UPDATE_BY_BOOKMARK,未绑定书签列,或者 SQL_ATTR_USE_BOOKMARKS 语句属性设置为 SQL_UB_OFF。

HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能 驱动程序或数据源不支持 Operation 参数中请求的操作。
HYT00 超时时间已到 查询超时期限在数据源返回结果集之前过期。超时期限通过 SQLSetStmtAttr 设置,其 `Attribute` 参数为 SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。

3.6.SQLCancel

3.6.1.功能描述

SQLCancel取消对语句的处理。

3.6.2.语法

SQLRETURN SQLCancel(  
    SQLHSTMT     StatementHandle); 

3.6.3.参数

  • StatementHandle

    [输入]语句句柄。

3.6.4.返回值

SQL_SUCCESS SQL_SUCCESS_WITH_INFO、SQL_ERROR或SQL_INVALID_HANDLE。

3.6.5.诊断

当 SQLCancel 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,通过调用SQLGetDiagRec 函数,且其 HandleType 和 Handle 参数分别设置为 SQL_HANDLE_STMT 和StatementHandle,可得到一个相关的SQLSTATE 值 。下面的表格列出了由 SQLCancel 返回的 SQLSTATE 值,并解释了与这个函数相关的每个信息;标注为“ (DM) ”的是对由 DriverM anager 返回的 SQLSTATE的描述。如果没有其他注释,那么与每个SQLSTATE 值相关的返回代码是 SQL_ERROR。

SQLCancel 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。参数 * MessageText buffer 中 SQLGetDiagRec返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLCancel 函数时,此异步函数仍在执行。

(DM) 取消操作失败,因为与 StatementHandle 关联的连接句柄上正在进行异步操作。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY018 服务器已拒绝取消请求 服务器拒绝了取消请求。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。

3.7.SQLCancelHandle

3.7.1.功能描述

SQLCancelHandle取消对连接或语句的处理。当 HandleType 为 SQL_HANDLE_STMT时,驱动程序管理器会将对 SQLCancelHandle 的调用映射到对 SQLCancel的调用。

3.7.2.语法

SQLRETURN SQLCancelHandle(  
    SQLSMALLINT  HandleType,  
    SQLHANDLE    Handle); 

3.7.3.参数

  • HandleType

    [输入]要对其取消处理。有效值为 SQL_HANDLE_DBC 或SQL_HANDLE_STMT。

  • Handle

    [输入]要取消处理的句柄。

    如果句柄不是 HandleType 指定的类型的有效句柄,则 SQLCancelHandle 将返回SQL_INVALID_HANDLE。

3.7.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.7.5.诊断

当 SQLCancelHandle 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO时,通过调用SQLGetDiagRec 函数,且其 HandleType 和 Handle 参数分别设置为 SQL_HANDLE_STMT和SQL_HANDLE_DBC,可得到一个相关的SQLSTATE 值。

下表列出了通常由 SQLCancelHandle 返回的 SQLSTATE 值,并对该函数的上下文中的每个值进行了说明:标注为 “(DM)”位于驱动程序管理器返回的 SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是SQL_ERROR。

SQLCancelHandle 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。参数 * MessageText 缓冲区中的 SQLGetDiagRec返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY010 函数序列错误

为与句柄关联的其中一个语句句柄调用了异步执行的与语句相关的函数,并且 HandleType 设置为 SQL_HANDLE_DBC。调用 SQLCancelHandle 时,仍在执行异步函数。

(DM)已SQL_HANDLE_STMT HandleType 参数;在关联的连接句柄上调用了异步执行的函数;调用此函数时,该函数仍在执行。

(DM)为与句柄关联的某个语句句柄调用了 SQLExecute、 SQLExecDirect 或 SQLMoreResults,并将 HandleType 设置为 SQL_HANDLE_DBC,并 SQL_PARAM_DATA_AVAILABLE 返回。在检索所有流式处理参数的数据之前调用此函数。

已为 ConnectionHandle 调用 SQLBrowseConnect,并返回 SQL_NEED_DATA。此函数是在浏览进程完成之前调用的。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY092 无效的属性/选项标识符 HandleType 设置为 SQL_HANDLE_ENV 或 SQL_HANDLE_DESC。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与该句柄关联的驱动程序不支持该函数。

如果在将 HandleType 设置为 SQL_HANDLE_STMT 的情况下调用 SQLCancelHandle,则它可以返回函数SQLCancel 返回的任何 SQLSTATE。

3.8.SQLCloseCursor

3.8.1.功能描述

SQLCloseCursor关闭已在语句上打开的游标,并丢弃挂起的结果。

3.8.2.语法

SQLRETURN SQLCloseCursor(  
    SQLHSTMT     StatementHandle);  

3.8.3.参数

  • StatementHandle

    [输入]语句句柄。

3.8.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR或SQL_INVALID_HANDLE。

3.8.5.诊断

当 SQLCloseCursor 返回 SQL_ERROR 或SQL_SUCCESS_WITH_INFO时,通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec,可以获得关联的 SQLSTATE 值。下表列出了 SQLCloseCursor 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;表示法“(DM) ”位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将指定与每个 SQLSTATE 值SQL_ERROR返回代码。

SQLCloseCursor 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
24000 游标状态无效 StatementHandle 上未打开游标。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了一个异步执行函数,在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用了一个异步执行函数,在调用此函数时仍在执行。

调用了 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。

3.9.SQLColAttribute

3.9.1.功能描述

SQLColAttribute返回结果集中列的描述符信息。说明描述符信息,以字符串、描述符相关值或整数值的形式返回。

3.9.2.语法

SQLRETURN SQLColAttribute (  
		  SQLHSTMT        StatementHandle,  
		  SQLUSMALLINT    ColumnNumber,  
		  SQLUSMALLINT    FieldIdentifier,  
		  SQLPOINTER      CharacterAttributePtr,  
		  SQLSMALLINT     BufferLength,  
		  SQLSMALLINT *   StringLengthPtr,  
		  SQLLEN *        NumericAttributePtr); 

3.9.3.参数

  • StatementHandle

    [输入]语句句柄。

  • ColumnNumber

    [输入]要检索字段的列号,起始为1,依次递增。

  • FieldIdentifier

    [输入]IRD中ColumnNumber行的字段。

  • CharacterAttributePtr

    [输出]一个缓冲区指针,返回FieldIdentifier字段值。

  • BufferLength

    [输入]如果FieldIdentifier是一个ODBC定义的字段,而且CharacterAttributePtr指向一个字符串或二进制缓冲区,则此参数为该缓冲区的长度。如果FieldIdentifier是一个ODBC定义的字段,而且CharacterAttributePtr指向一个整数,则会忽略该字段。

  • StringLengthPtr

    [输出]缓冲区指针,存放*CharacterAttributePtr中字符类型数据的字节总数,对于非字符类型,忽略BufferLength的值。

  • NumericAttributePtr

    [输出]指向一个整型缓冲区的指针,返回IRD中ColumnNumber行FieldIdentifier字段的值。

3.9.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.9.5.诊断

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

SQLColAttribute 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区 * CharacterAttributePtr 不够大,无法返回整个字符串值,因此字符串值已截断。在 *StringLengthPtr 中返回未截断字符串值的长度。(函数返回 SQL_SUCCESS_WITH_INFO。)
07005 预定义语句不是游标规范 与 StatementHandle 关联的语句未返回结果集,FieldIdentifier 未 SQL_DESC_COUNT。没有要描述的列。
07009 描述符索引无效

(DM) 为 ColumnNumber 指定的值等于0,SQL_ATTR_USE_BOOKMARKS 语句属性已 SQL_UB_OFF。

为参数 ColumnNumber 指定的值大于结果集中的列数。

HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。SQLGetDiagField 从诊断数据结构返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLColAttribute 时,仍在执行此 aynchronous 函数。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 在调用 SQLPrepare、SQLExecDirect 或 StatementHandle 的目录函数之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效 (DM) * CharacterAttributePtr 是一个字符串,而 BufferLength 小于0但不等于 SQL_NTS。
HY091 描述符字段标识符无效 为参数 FieldIdentifier 指定的值不是定义的值之一,并且该值不是实现定义的值。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 驱动程序不支持 驱动程序不支持为参数 FieldIdentifier 指定的值。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

当在 SQLPrepare 之后和 SQLExecute 之前调用时,SQLColAttribute 可以返回可由 SQLPrepare 或SQLExecute 返回的任何 SQLSTATE,具体取决于数据源评估与 StatementHandle 关联的 SQL 语句的时间。

出于性能方面的考虑,应用程序在执行语句之前不应调用 SQLColAttribute 。

3.10.SQLColumnPrivileges

3.10.1.功能描述

SQLColumnPrivileges返回指定表的列和相关权限的列表。驱动程序在指定的 StatementHandle上以结果集的形式返回该信息。

3.10.2.语法

SQLRETURN SQLColumnPrivileges(  
     SQLHSTMT      StatementHandle,  
     SQLCHAR *     CatalogName,  
     SQLSMALLINT   NameLength1,  
     SQLCHAR *     SchemaName,  
     SQLSMALLINT   NameLength2,  
     SQLCHAR *     TableName,  
     SQLSMALLINT   NameLength3,  
     SQLCHAR *     ColumnName,  
     SQLSMALLINT   NameLength4); 

3.10.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CatalogName

    [输入]目录名称。如果驱动程序支持某些目录的名称,但不支持其他目录的名称(例如,当驱动程序从不同DBMS检索数据时),则空字符串("")表示没有名称的目录。CatalogName不能包含字符串搜索模式。

    如果SQL_ATTR_METADATA_ID语句特性设置为SQL_TRUE,则CatalogName被视为标识符,并且其大小写无意义。如果SQL_FALSE,则CatalogName是普通参数;它按原义处理,其大小写有意义。

  • NameLength1

    [输入]*CatalogName中的字符的长度。

  • SchemaName

    [输入]模式名称。如果驱动程序支持某些表的模式,而不支持其他表的模式(例如,当驱动程序从不同 DBMS 检索数据时),则空字符串 ("" ) 表示不具有模式的那些表。SchemaName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 SchemaName 被视为标识符。如果SQL_FALSE,则 SchemaName 是普通参数;它按原义处理,其大小写有意义。

  • NameLength2

    [输入]*SchemaName中的字符的长度。

  • TableName

    [输入]表名称。此参数不能为 null 指针。TableName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 TableName将被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 TableName为普通参数;它按原义处理,其大小写有意义。

  • NameLength3

    [输入]*TableName的长度。

  • ColumnName

    [输入]列名称的字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 ColumnName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 ColumnName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength4

    [输入]*ColumnName的长度。

3.10.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.10.5.诊断

当SQLColumnPrivileges返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,通过调用SQLGetDiagRec函数,且其HandleType和Handle参数分别设置为SQL_HANDLE_STMT和ConnectionHandle,可得到一个相关的SQLSTATE值。下面的表格列出了由SQLColumnPrivileges返回的SQLSTATE值,并解释了与这个函数相关的每个信息;标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs说明之前。除非另有说明,否则将指定与每个SQLSTATE值SQL_ERROR返回代码。

SQLColumnPrivileges 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标 , 并且调用了 SQLFetch 或 SQLFetchScroll。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA,驱动程序管理器将返回此错误,如果 SQLFetch 或 SQLFetchScroll 已 SQL_NO_DATA 返回,则由驱动程序返回。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll 。

40001 序列化失败 由于另一个事务发生了资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY009 空值指针的使用无效

TableName 参数为 null 指针。

SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE, CatalogName 参数为 null 指针,SQL_CATALOG_NAME 的 InfoType 返回支持的目录名称。

(DM) SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,并且 SchemaName 或 ColumnName 参数为 null 指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。此异步函数在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect 或 SQLMoreResults,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 一个名称长度参数的值小于0但不等于 SQL_NTS。

名称长度参数之一的值超出了相应名称的最大长度值。

HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

指定了目录名称,并且驱动程序或数据源不支持目录。

指定了模式名称,并且驱动程序或数据源不支持模式。

为列名称指定了字符串搜索模式,并且数据源不支持该参数的搜索模式。

驱动程序或数据源不支持 SQL_CONCURRENCY 和 SQL_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.11.SQLColumns

3.11.1.功能描述

SQLColumns返回指定表中的列名列表。驱动程序将此信息作为指定 StatementHandle 上的结果集返回。

3.11.2.语法

SQLRETURN SQLColumns(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      CatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      SchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      TableName,  
     SQLSMALLINT    NameLength3,  
     SQLCHAR *      ColumnName,  
     SQLSMALLINT    NameLength4); 

3.11.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CatalogName

    [输入]目录名称。如果驱动程序支持某些表的目录,但不支持其他表的目录,例如,当驱动程序从不同的 DBMS 中检索数据时,空字符串("") 指示没有目录的表。CatalogName 不能包含字符串搜索模式。

    注意

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 CatalogName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 CatalogName是普通参数;它按原义处理,其大小写有意义。

  • NameLength1

    [输入]CatalogName中的字符的长度。

  • SchemaName

    [输入]模式名称的字符串搜索模式。如果驱动程序支持某些表的模式,而不支持其他表的模式(例如,当驱动程序从不同 DBMS检索数据时),则空字符串 ( "" ) 指示不具有模式的那些表。

    注意

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 SchemaName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 SchemaName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength2

    [输入]SchemaName中的字符的长度。

  • TableName

    [输入]表名的字符串搜索模式。

    注意

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 TableName将被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 TableName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength3

    [输入]TableName的长度。

  • ColumnName

    [输入]列名称的字符串搜索模式。

    注意

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 ColumnName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 ColumnName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength4

    [输入]ColumnName的长度。

3.11.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.11.5.诊断

当 SQLColumns 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO时,通过调用SQLGetDiagRec 函数,且其 HandleType 和 Handle 参数分别设置为 SQL_HANDLE_STMT 和ConnectionHandle ,可得到一个相关的 SQLSTATE 值。下面的表格列出了由 SQLColumns 返回的SQLSTATE值,并解释了与这个函数相关的每个信息;标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将指定与每个 SQLSTATE值SQL_ERROR返回代码。

SQLColumns 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标,并调用了 SQLFetch 或 SQLFetchScroll。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA,驱动程序将返回此错误;如果 SQLFetch 或 SQLFetchScroll 返回了 SQL_NO_DATA,驱动程序将返回此错误。

游标已在 StatementHandle 上打开,但 SQLFetch 或 SQLFetchScroll 尚未调用。

40001 序列化失败 由于另一个事务发生资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle。

HY009 null 指针的使用无效

SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE, CatalogName 参数为 null 指针,SQL_CATALOG_NAME 的 InfoType 返回支持的目录名称。

(DM) SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,并且 SchemaName、TableName 或 ColumnName 参数为 null 指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLColumns 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 一个名称长度参数的值小于0但不等于 SQL_NTS。

名称长度参数之一的值超出了相应目录或名称的最大长度值。可以通过使用 InfoType 值调用 SQLGetInfo 来获取每个目录或名称的最大长度。

HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

指定了目录名称,并且驱动程序或数据源不支持目录。

指定了模式名称,并且驱动程序或数据源不支持模式。

为模式名称、表名称或列名称指定了字符串搜索模式,并且数据源不支持其中一个或多个参数的搜索模式。

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.12.SQLConnect

3.12.1.功能描述

SQLConnect在驱动程序和数据源之间建立连接。连接上数据源之后,可以通过连接句柄访问到所有有关连接数据源的信息,包括程序运行状态、事务处理状态和错误信息。

3.12.2.语法

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

3.12.3.参数

  • ConnectionHandle

    [输入]连接句柄。

  • ServerName

    [输入]数据源名称。数据可以与程序位于同一台计算机上,也可以位于网络中某个位置的另一台计算机上。

  • NameLength1

    [输入]*ServerName的长度。

  • UserName

    [输入]用户标识符。

  • NameLength2

    [输入]UserName的长度。

  • Authentication

    [输入]数据源中数据库用户密码。

  • NameLength3

    [输入]Authentication的长度。

3.12.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_INVALID_HANDLE 或SQL_STILL_EXECUTING。

3.12.5.诊断

当调用SQLConnect函数返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,通过调用SQLGetDiagRec函数,并将HandleType和Handle参数设置为SQL_HANDLE_DBC和ConnectionHandle,可得到一个相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。

SQLConnect 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 驱动程序不支持 SQLSetConnectAttr 中的 将 valueptr 参数的指定值,并将其替换为类似值。(函数返回 SQL_SUCCESS_WITH_INFO。)
08001 客户端无法建立连接 驱动程序无法与数据源建立连接。
08002 连接名称正在使用中 (DM) 指定的 ConnectionHandle 已用于建立与数据源的连接,并且该连接仍处于打开状态,或者用户正在浏览连接。
08004 服务器拒绝了连接 由于实现定义的原因,数据源已拒绝建立连接。
08S01 通信链接失败 在函数完成处理之前,驱动程序与该驱动程序尝试连接到的数据源之间的通信链接失败。
28000 授权规范无效 为参数 UserName 指定的值或为参数 Authentication 指定的值违反了数据源定义的限制。
HY000 常规错误 发生了一个错误,该错误没有特定的SQLSTATE,没有为其定义实现特定的 SQLSTATE。*MessageText缓冲区中的SQLGetDiagRec返回的错误消息描述了错误及其原因。
HY001 内存分配错误 (DM) 驱动程序管理器无法分配支持执行或完成该函数所需的内存。
HY008 操作已取消

已为ConnectionHandle启用异步处理。调用SQLConnect函数,并在其完成执行之前,在ConnectionHandle上调用SQLCancelHandle函数,然后在ConnectionHandle上再次调用SQLConnect函数。

或者,调用SQLConnect函数,并在其完成执行之前,从多线程应用程序中的另一个线程调用ConnectionHandle上的SQLCancelHandle。

HY010 函数序列错误 (DM) 异步执行的函数(不是为 ConnectionHandle 调用了这一) ,并且在调用此函数时仍在执行。
HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 为 "参数 NameLength1"、" NameLength2" 或 " NameLength3 " 指定的值小于0但不等于 "SQL_NTS"。

(DM) 为参数 NameLength1 指定的值超出了数据源名称的最大长度。

HYT00 超时时间已到 在与数据源建立连接之前,查询超时期限已过。超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_LOGIN_TIMEOUT。
HY114 驱动程序不支持连接级别的异步函数执行 (DM) 应用程序在建立连接之前已对连接句柄启用了异步操作。但是,驱动程序不支持对连接句柄执行异步操作。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 数据源名称指定的驱动程序不支持该函数。
IM002 找不到数据源,未指定默认驱动程序 (DM) 在系统信息中找不到参数 ServerName 中指定的数据源名称,也没有默认的驱动程序规范。
IM003 指定的驱动程序无法连接到 (DM) 找不到系统信息的数据源规范中列出的驱动程序,或由于某些其他原因无法连接到。
IM004 SQL_HANDLE_ENV 上驱动程序的 SQLAllocHandle 失败 (DM) 在 SQLConnect 期间,驱动程序管理器调用了驱动程序的 SQLAllocHandle 函数, HandleType 为 SQL_HANDLE_ENV,驱动程序返回了一个错误。
IM005 SQL_HANDLE_DBC 上驱动程序的 SQLAllocHandle 失败 (DM) 在 SQLConnect 期间,驱动程序管理器调用了驱动程序的 SQLAllocHandle 函数, HandleType 为 SQL_HANDLE_DBC,驱动程序返回了一个错误。
IM006 驱动程序的 SQLSetConnectAttr 失败 在 SQLConnect 期间,驱动程序管理器调用了驱动程序的 SQLSetConnectAttr 函数,驱动程序返回了一个错误。(函数返回 SQL_SUCCESS_WITH_INFO。)
IM009 无法连接到翻译 DLL 驱动程序无法连接到为数据源指定的转换 DLL。
IM010 数据源名称太长 (DM) * ServerName 超过 SQL_MAX_DSN_LENGTH 个字符。
IM014 指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配 (DM) 32 位应用程序使用连接到64位驱动程序的 DSN;反之亦然。
IM015 SQL_HANDLE_DBC_INFO_HANDLE 上驱动程序的 SQLConnect 失败 如果驱动程序返回 SQL_ERROR,驱动程序管理器会将 SQL_ERROR 返回到应用程序,连接将失败。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。
S1118 驱动程序不支持异步通知 当驱动程序不支持异步通知时,不能设置 SQL_ATTR_ASYNC_DBC_EVENT 或 SQL_ATTR_ASYNC_DBC_RETCODE_PTR。

3.13.SQLCopyDesc

3.13.1.功能描述

SQLCopyDesc将描述符信息从一个描述符句柄复制到另一个描述符句柄。

3.13.2.语法

SQLRETURN SQLCopyDesc(  
     SQLHDESC     SourceDescHandle,  
     SQLHDESC     TargetDescHandle); 

3.13.3.参数

  • SourceDescHandle

    [输入]源描述符句柄。

  • TargetDescHandle

    [输入]目标描述符句柄。TargetDescHandle 参数可以是应用程序描述符或 IPD 的句柄。TargetDescHandle 不能设置为 IRD 的句柄,或者 SQLCopyDesc 将返回 SQLSTATE HY016(无法修改实现行描述符)。

3.13.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.13.5.诊断

当 SQLCopyDesc 函数返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO时,通过调用SQLGetDiagRec 函数,且其 HandleType 和 Handle 参数分别设置为 SQL_HANDLE_DESC 和TargetDescHandle,可得到一个相关的 SQLSTATE 值。如果一个无效的 SourceDescHandle 传到函数中,会返回SQL_INVALID_HANDLE,并不返回 SQLSTATE。下面的表格列出了由 SQLCopyDesc 返回的 SQLSTATE值,并解释了与这个函数相关的每个信息;标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将指定与每个 SQLSTATE 值SQL_ERROR返回代码。

当返回一个错误时,SQLCopyDesc 调用立即终止,且不定义TargetDescHandle 描述符字段的内容。

因为 SQLCopyDesc 可由 SQLGetDescField 和 SQLSetDescField 调用实现,所以 SQLCopy Desc可返回能由 SQLGetDescField 或 SQLSetDescField返回的所有 SQLSTATE 。

SQLCopyDesc 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY007 未准备关联的语句 SourceDescHandle 与 IRD 相关联,并且关联的语句句柄未在准备或执行状态。
HY010 函数序列错误

(DM) SourceDescHandle 或 TargetDescHandle 中的描述符句柄与 StatementHandle 相关联,异步执行函数 (而不是此) 的函数在调用此函数时仍在执行。

(DM) SourceDescHandle 或 TargetDescHandle 中的描述符句柄与调用并返回 SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 StatementHandle 相关联SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

(DM) 为与 SourceDescHandle 或 TargetDescHandle 关联的连接句柄调用了异步执行函数。调用 SQLCopyDesc 函数时,此异步函数仍在执行。

(与 SourceDescHandle 或 TargetDescHandle 关联的语句句柄之一调用 DM) SQLExecute、SQLExecDirect 或 SQLMoreResults,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY016 无法修改实现行描述符 TargetDescHandle 与 IRD 相关联。
HY021 描述符信息不一致 在一致性检查期间检查的描述符信息不一致。
HY092 属性/选项标识符无效 对 SQLCopyDesc 的调用提示调用 SQLSetDescField,但 *ValuePtr 对 TargetDescHandle 上的 FieldIdentifier 参数无效。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 SourceDescHandle 或 TargetDescHandle 关联的驱动程序不支持函数。

3.14.SQLDescribeCol

3.14.1.功能描述

SQLDescribeCol 将返回结果集中的一列的结果描述符-列名称、类型、列大小、十进制数字和是否为空。此信息还可用于 IRD 的字段。

3.14.2.语法

SQLRETURN SQLDescribeCol(  
      SQLHSTMT       StatementHandle,  
      SQLUSMALLINT   ColumnNumber,  
      SQLCHAR *      ColumnName,  
      SQLSMALLINT    BufferLength,  
      SQLSMALLINT *  NameLengthPtr,  
      SQLSMALLINT *  DataTypePtr,  
      SQLULEN *      ColumnSizePtr,  
      SQLSMALLINT *  DecimalDigitsPtr,  
      SQLSMALLINT *  NullablePtr); 

3.14.3.参数

  • StatementHandle

    [输入]语句句柄。

  • ColumnNumber

    [输入]结果数据的列序号,以递增的列顺序排列,起始值为 1 。也可将ColumnNumber 参数设置为 0,来描述书签列。

  • ColumnName

    [输出]一个缓冲区的指针,返回的列名存放到此缓冲区中。从 IRD 的SQL_DESC_NAME 字段中读取这个值。如果没有命名列, 或者不能确定列名,驱动程序会返回一个空字符串。

  • BufferLength

    [输入]ColumnName缓冲区的长度。

  • NameLengthPtr

    [输出]指向缓冲区的指针,将在此缓冲区中返回 (排除 null 终止)可在 ColumnName中返回的字符总数。如果可返回的字符数大于或等于BufferLength,则 ColumnName 中的列名称将截断为 * BufferLength 减去 null 终止字符的长度。

  • DataTypePtr

    [输出]指向要返回列的数据类型SQL的缓冲区的指针。这个值从 IRD的 SQL_DESC_CONCISE_TYPE字段读取。这将是"数据类型"SQL中的值之一,或特定于驱动程序SQL数据类型。如果无法确定数据类型,驱动程序将返回SQL_UNKNOWN_TYPE。

    当 ColumnNumber 等于0时(书签列),QL_BINARY 在 * DataTypePtr 中返回可变长度书签的值。

  • ColumnSizePtr

    [输出]指向缓冲区的指针,将在该缓冲区中返回数据源中列的大小 (以字符)。如果无法确定列的大小,则驱动程序将返回0。

  • DecimalDigitsPtr

    [输出]指向缓冲区的指针,该缓冲区用于返回数据源中列的小数位数。如果小数位数不能确定或不适用,则驱动程序将返回0。

  • NullablePtr

    [输出]指向缓冲区的指针,将在此缓冲区中返回一个值,该值指示列是否允许 NULL 值。此值从 IRD 的"SQL_DESC_NULLABLE" 字段读取。该值是下列值之一:

    • SQL_NO_NULLS:列不允许空值。

    • SQL_NULLABLE:列允许 NULL 值。

    • SQL_NULLABLE_UNKNOWN:驱动程序无法确定列是否允许 NULL 值。

3.14.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.14.5.诊断

当 SQLDescribeCol 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLDescribeCol 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则将指定与每个 SQLSTATE 值SQL_ERROR返回代码。

SQLDescribeCol 诊断代码

SQLSTATE 错误 说明
01000 常规警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区 * ColumnName 不够大,无法返回整个列名称,因此列名被截断。在 *NameLengthPtr 中返回未截断列名称的长度。(函数返回 SQL_SUCCESS_WITH_INFO。)
07005 预定义语句不是游标规范 与 StatementHandle 关联的语句未返回结果集。没有要描述的列。
07009 描述符索引无效

(DM) 为参数 ColumnNumber 指定的值等于0,并且SQL_ATTR_USE_BOOKMARKS语句选项

为参数 ColumnNumber 指定的值大于结果集中的列数。

08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配失败 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLDescribeCol 时仍在执行此异步函数。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect 或 SQLMoreResults,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用),并且在调用此函数时仍在执行。

(DM) 在对语句句柄调用 SQLPrepare、 SQLExecute 或 Catalog 函数之前调用此函数。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效 (DM) 为参数 BufferLength 指定的值小于0。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

SQLDescribeCol 可以返回 SQLPrepare 或 SQLExecute 在 SQLPrepare 之后调用时可以返回的任何SQLSTATE,具体取决于数据源计算与语句句柄关联的 SQL 语句的时间。

出于性能方面的考虑,应用程序在执行语句之前不应调用 SQLDescribeCol 。

3.15.SQLDescribeParam

3.15.1.功能描述

SQLDescribeParam返回一个参数标记的描述,此描述与一条准备好的SQL 语句相关。也可从 IPD 的字段中获得这个信息。

3.15.2.语法

SQLRETURN SQLDescribeParam(  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ParameterNumber,  
      SQLSMALLINT *   DataTypePtr,  
      SQLULEN *       ParameterSizePtr,  
      SQLSMALLINT *   DecimalDigitsPtr,  
      SQLSMALLINT *   NullablePtr); 

3.15.3.参数

  • StatementHandle

    [输入]语句句柄。

  • ParameterNumber

    [输入]参数标记编号按递增参数顺序排序,从1开始。

  • DataTypePtr

    [输出]一个指针,指向要在其中返回参数 SQL 数据类型的缓冲区。此值从 IPD 的SQL_DESC_CONCISE_TYPE 记录字段中读取。

    如果 ColumnNumber 等于书签列的0,则将在* DataTypePtr 中为可变长度书签返回 SQL_BINARY。

  • ParameterSizePtr

    [输出]指向缓冲区的指针,该缓冲区用于返回数据源定义的相应参数标记的列或表达式的大小。

  • DecimalDigitsPtr

    [输出]指向缓冲区的指针,该缓冲区用于返回数据源定义的相应参数的列或表达式的小数位数。

  • NullablePtr

    [输出]指向缓冲区的指针,将在此缓冲区中返回一个值,该值指示参数是否允许 NULL 值。此值从 IPD 的SQL_DESC_NULLABLE 字段中读取。下列类型作之一:

    • SQL_NO_NULLS:该参数不允许 NULL 值 (这是) 的默认值。

    • SQL_NULLABLE:参数允许空值。

    • SQL_NULLABLE_UNKNOWN:驱动程序无法确定参数是否允许空值。

3.15.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.15.5.诊断

当 SQLDescribeParam 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO时,通过调用SQLGetDiagRec 函数,且其 HandleType 和 Handle 参数分别设置为 SQL_HANDLE_STMT 和StatementHandle ,可得到一个相关的SQLSTATE 值。下面的表格列出了由 SQLDescribeParam返回的SQLSTATE 值,并解释了与这个函数相关的每个信息 ;标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs的说明之前。如果没有其他注释,那么与每个 SQLSTATE 值相关的返回代码是 SQL_ERROR。

SQLDescribeParam 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
07009 描述符索引无效

(DM) 为参数 ParameterNumber 指定的值小于1。

为参数 ParameterNumber 指定的值大于关联的 SQL 语句中的参数个数。

参数标记是非 DML 语句的一部分。

参数标记是选择列表的一部分。

08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
21S01 插入值列表与列列表不匹配 INSERT语句中的参数数目与语句中指定的表中的列数不匹配。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 调用 StatementHandle 的 SQLPrepare 或 SQLExecDirect 之前调用了函数。

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLDescribeParam 函数时,此异步函数仍在执行。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。

3.16.SQLDisconnect

3.16.1.功能描述

SQLDisconnect关闭与特定连接句柄关联的连接。

3.16.2.语法

SQLRETURN SQLDisconnect(  
    SQLHDBC     ConnectionHandle); 

3.16.3.参数

  • ConnectionHandle

    [输入]连接句柄。

3.16.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_INVALID_HANDLE 或SQL_STILL_EXECUTING。

3.16.5.诊断

当 SQLDisconnect 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,通过调用SQLGetDiagRec 函数,且其 HandleType 和 Handle 参数分别设置 为 SQL_HANDLE_DBC 和ConnectionHandle ,可得到一个相关的 SQLSTATE 值。下面的表格列出了由 SQLDisconnect 返回的SQLSTATE 值,并解释了与这个函数相关的每个信息;标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs的说明之前。如果没有其他注释,那么与每个 SQLSTATE 值相关的返回代码是SQL_ERROR。

SQLDisconnect 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01002 断开连接错误 断开连接时出错。但断开连接成功。(函数返回 SQL_SUCCESS_WITH_INFO。)
08003 连接未打开 (DM) 参数 ConnectionHandle 中指定的连接未打开。
25000 事务状态无效 自变量 ConnectionHandle 指定的连接上存在事务。事务仍处于活动状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 ConnectionHandle 启用异步处理。在 ConnectionHandle 上调用 SQLCancelHandle 函数之前,调用了函数并在该函数之前调用了已完成。然后,在 ConnectionHandle 上再次调用该函数。

调用了函数,并且在完成执行 SQLCancelHandle 之前,从多线程应用程序中的另一个线程调用了ConnectionHandle。

HY010 函数序列错误

(DM) 为与 ConnectionHandle 关联的 StatementHandle 调用了异步执行的函数,并且在调用 SQLDisconnect 时仍在执行。

(DM) 异步执行的函数 (不是为 ConnectionHandle 调用了这一) ,并且在调用此函数时仍在执行。

为与 StatementHandle 关联的 ConnectionHandle 调用了 (DM) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前已过期,连接仍处于活动状态。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 ConnectionHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.17.SQLDriverConnect

3.17.1.功能描述

SQLDriverConnect是 SQLConnect的替代方法。它支持需要比 SQLConnect中的三个参数更多的连接信息的数据源、提示用户输入所有连接信息的对话框,以及系统信息中未定义的数据源。。

3.17.2.语法

SQLRETURN SQLDriverConnect(  
     SQLHDBC         ConnectionHandle,  
     SQLHWND         WindowHandle,  
     SQLCHAR *       InConnectionString,  
     SQLSMALLINT     StringLength1,  
     SQLCHAR *       OutConnectionString,  
     SQLSMALLINT     BufferLength,  
     SQLSMALLINT *   StringLength2Ptr,  
     SQLUSMALLINT    DriverCompletion); 

3.17.3.参数

  • ConnectionHandle

    [输入]连接句柄。

  • WindowHandle

    [输入]窗口句柄。如果可用,应用程序可以传送父窗口的句柄。如果窗口句柄不可用,或者 SQLDriverConnect函数不出现任何对话框,应用程序传送一个空指针。

  • InConnectionString

    [输入]完整的连接字符串 ("Comments") 部分连接字符串或空字符串中的语法。

  • StringLength1

    [输入]InConnectionString 的长度(如果字符串为 Unicode,则以字符为单位;如果字符串为 ANSI 或DBCS,则以字节为单位)。

  • OutConnectionString

    [输出]指向已完成连接字符串的缓冲区的指针。成功连接到目标数据源后,此缓冲区包含已完成的连接字符串。应用程序应为此缓冲区至少分配1,024 个字符。

    如果 OutConnectionString 为 NULL,则 StringLength2Ptr 仍将返回字符总数 (不包括字符数据null 终止字符) 可在 OutConnectionString 指向的缓冲区中返回。

  • BufferLength

    [输入]OutConnectionString 缓冲区的长度。

  • StringLength2Ptr

    [输出]一个缓冲区的指针,此缓冲区存放返回给 OutConnectionString的可用字节总数(不包括空值终止字节)。如果返回的可用字节数大于等于BufferLength ,那么 *OutConnectionString 中已完成的连接字符串将截断为 BufferLength减去 null 终止字符的长度。

  • DriverCompletion

    [输入]一个标志,它显示出驱动管理器或驱动程序是否必须提示更多的连接信息:SQL_DRIVER_PROMPT、SQL_DRIVER_COMPLETE、SQL_DRIVER_COMPLETE_REQUIRED 或SQL_DRIVER_NOPROMPT。

3.17.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_ERROR、SQL_INVALID_HANDLE或 SQL_STILL_EXECUTING。

3.17.5.诊断

当 SQLDriverConnect 返回 SQL_ERROR 或SQL_SUCCESS_WITH_INFO 时,通过调 用SQLGetDiagRec 函数,且其 fHandleType 和 hHandle 参数分别设置为 SQL_HANDLE_DBC和ConnectionHandle ,可得到一个相关的 SQLSTATE 值。下面的表格列出了由 SQLDriverConnect 返回的SQLSTATE 值,并解释了与这个函数相关的每个信息;标注为 “(DM)”位于驱动程序管理器返回的 SQLSTATEs说明之前。如果没有其他注释,那么与每个 SQLSTATE值相关的返回代码是 SQL_ERROR。

SQLDriverConnect 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区 * OutConnectionString 不够大,无法返回整个连接字符串,因此连接字符串被截断。未连接的连接字符串的长度在 StringLength2Ptr 中返回。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S00 连接字符串属性无效 InConnectionString (连接字符串中指定了无效) ,但驱动程序还是能够连接到数据源。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 驱动程序不支持 SQLSetConnectAttr 中的 ValuePtr 参数指向的指定值,并替换了类似的值。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S08 保存文件 DSN 时出错 * InConnectionString 中的 字符串包含一个 FILEDSN 关键字,但.dsn 文件未保存。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S09 关键字无效 (DM) * InConnectionString 中的字符串包含 SAVEFILE 关键字,但不包括 DRIVER 或 FILEDSN 关键字。(函数返回 SQL_SUCCESS_WITH_INFO。)
08001 客户端无法建立连接 驱动程序无法与数据源建立连接。
08002 使用的连接名称 (DM) 指定的 ConnectionHandle 已用于与数据源建立连接,并且连接仍处于打开状态。
08004 服务器拒绝了连接 数据源出于实现定义的原因拒绝了建立连接。
08S01 通信链接失败 在 SQLDriverConnect 函数完成处理之前,驱动程序与驱动程序尝试连接到的数据源之间的通信链接失败。
28000 授权规范无效 连接字符串 InConnectionString (中指定的用户标识符或授权字符串) 违反数据源定义的限制
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* szMessageText 缓冲区 中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY000 常规错误:文件 dsn 无效 (DM) InConnectionString 中的字符串包含一个 FILEDSN 关键字,但未找到 .dsn 文件的名称。
HY000 常规错误:无法创建文件缓冲区 (DM) InConnectionString 中的字符串包含一个 FILEDSN 关键字,但 .dsn 文件不可读。
HY001 内存分配错误

驱动程序管理器无法分配支持执行或完成 SQLDriverConnect 函数所需的内存。

驱动程序无法分配支持执行或完成函数所需的内存。

HY008 操作已取消

为 ConnectionHandle 启用了异步处理。调用了函数,在执行完毕之前,在 ConnectionHandle 上调用 了 SQLCancelHandle函数,然后在 ConnectionHandle 上再次调用 SQLDriverConnect 函数。

或者,调用了 SQLDriverConnect 函数,在它完成执行之前,从多线程应用程序中的不同线程对 ConnectionHandle 调用 SQLCancelHandle。

HY010 函数序列错误 (DM) 为 ConnectionHandle 调用了另一个异步执行函数 (而不是 SQLDriverConnect) ,并且仍在调用 SQLDriverConnect 函数时执行。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理 SQLDriverConnect 函数调用。
HY090 字符串或缓冲区长度无效

(DM) 为参数 StringLength1 指定的值小于 0 并且不等于 SQL_NTS。

(DM) BufferLength 参数指定的值小于 0。

HY092 属性/选项标识符无效 (DM) DriverCompletion 参数为 SQL_DRIVER_PROMPT,WindowHandle 参数为 null 指针。
HY110 驱动程序完成无效

(DM) 为参数 DriverCompletion 指定的值不等于 SQL_DRIVER_PROMPT、SQL_DRIVER_COMPLETE、 SQL_DRIVER_COMPLETE_REQUIRED 或 SQL_DRIVER_NOPROMPT。

(启用了 DM) 连接池,并且为参数 DriverCompletion 指定的值不等于 SQL_DRIVER_NOPROMPT。

HYC00 未实现可选功能 驱动程序不支持应用程序请求的 ODBC 行为版本。
HYT00 超时时间已到 登录超时期限在连接到数据源之前已过期。超时期限通过 SQLSetConnectAttr、SQL_ATTR_LOGIN_TIMEOUT。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 对应于指定数据源名称的驱动程序不支持函数。
IM002 找不到数据源,并且未指定默认驱动程序

(DM) 在连接字符串 (InConnectionString) 中指定的数据源名称在系统信息中找不到,并且没有默认的驱动程序规范。

(DM) ODBC 数据源和默认驱动程序信息在系统信息中找不到。

IM003 无法加载指定的驱动程序 (DM) 找不到系统信息中数据源规范中列出的驱动程序或 DRIVER 关键字指定的驱动程序,或者由于其他某种原因无法加载该驱动程序。
IM004 驱动程序的 SQLAllocHandle SQL_HANDLE_ENV失败 (DM) 在 SQLDriverConnect 期间,驱动程序管理器调用驱动程序的 SQLAllocHandle 函数 ,fHandleType 为 SQL_HANDLE_ENV,驱动程序返回了错误。
IM005 驱动程序上的 SQLAllocHandle SQL_HANDLE_DBC失败。 (DM) 在 SQLDriverConnect 期间,驱动程序管理器调用驱动程序的 SQLAllocHandle 函数 ,HandleType 为 SQL_HANDLE_DBC,驱动程序返回错误;
IM006 驱动程序的 SQLSetConnectAttr 失败 (DM) SQLDriverConnect 期间,驱动程序管理器调用了驱动程序的 SQLSetConnectAttr 函数,驱动程序返回了错误。
IM007 未指定数据源或驱动程序,禁止对话 在连接字符串中未指定数据源名称或驱动程序,并且未指定 DriverCompletion SQL_DRIVER_NOPROMPT。
IM008 对话框失败

驱动程序尝试显示其登录对话框,但失败。

WindowHandle 为空指针,且 DriverCompletion 不是SQL_DRIVER_NO_PROMPT。

IM009 无法加载转换 DLL 驱动程序无法加载为数据源或连接指定的转换 DLL。
IM010 数据源名称太长 (DM) DSN 关键字的属性值长于 SQL_MAX_DSN_LENGTH 个字符。
IM011 驱动程序名称太长 (DM) DRIVER 关键字的属性值超过 255 个字符。
IM012 DRIVER 关键字语法错误

(DM) DRIVER 关键字的关键字值对包含语法错误。

(DM) * InConnectionString 中的字符串包含一个 FILEDSN 关键字,但 .dsn 文件不包含 DRIVER 关键字或 DSN 关键字。

IM014 指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配 (DM) 32 位应用程序使用连接到 64 位驱动程序的 DSN;反之亦然。
IM015 驱动程序的 SQLDriverConnect SQL_HANDLE_DBC_INFO_HANDLE失败 如果驱动程序返回SQL_ERROR,驱动程序管理器SQL_ERROR应用程序,并且连接将失败。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。
S1118 驱动程序不支持异步通知 如果驱动程序不支持异步通知,则不能设置SQL_ATTR_ASYNC_DBC_EVENT或SQL_ATTR_ASYNC_DBC_RETCODE_PTR。

3.18.SQLEndTran

3.18.1.功能描述

SQLEndTran针对与连接关联的所有语句的所有活动操作进行提交或回滚操作。SQLEndTran还可以请求对与环境关联的所有连接执行提交或回滚操作。

3.18.2.语法

SQLRETURN SQLEndTran(  
     SQLSMALLINT   HandleType,  
     SQLHANDLE     Handle,  
     SQLSMALLINT   CompletionType); 

3.18.3.参数

  • HandleType

    [输入]句柄类型标识符。如果 Handle(句柄)是一个环境句柄,那么包含SQL_HANDLE_ENV,如果Handle(句柄)是一个连接句柄,那么包含 SQL_HANDLE_DBC。

  • Handle

    [输入]HandleType 显示类型的句柄,指示事务的范围。

  • CompletionType

    [输入]两个值之一:SQL_COMMIT、SQL_ROLLBACK。

3.18.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_INVALID_HANDLE 或SQL_STILL_EXECUTING。

3.18.5.诊断

当 SQLEndtran 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可能通过使用相应的HandleType 和 Handle 调用 SQLGetDiagRec 来获取关联的 SQLSTATE 值。下面的表格列出了由SQLEndtran 返回的 SQLSTATE 值,并解释了与这个函数相关的每个信息;标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs 说明之前。如果没有其他注释,那么与每个 SQLSTATE 值相关的返回代码是SQL_ERROR。

SQLEndTran 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08003 连接未打开 (DM) HandleType SQL_HANDLE_DBC,并且 Handle 未在连接状态。
08007 事务期间连接失败 HandleType SQL_HANDLE_DBC,与 Handle 关联的连接在执行函数期间失败,并且无法确定请求的COMMIT或 ROLLBACK 是在失败之前发生的。
25S01 事务状态未知 Handle 中的一个或多个连接未能 完成指定结果的事务,并且结果未知。
25S02 事务仍处于活动状态 驱动程序无法保证全局事务中的所有工作都可以通过原子方式完成,并且该事务仍处于活动状态。
25S03 事务回滚 驱动程序无法保证全局事务中的所有工作都可以通过原子方式完成,并且 Handle 中处于活动状态的事务中的所有工作已回滚。
40001 序列化失败 由于资源与另一个事务发生死锁,事务已回滚。
40002 完整性约束冲突 CompletionType SQL_COMMIT,并且更改承诺导致完整性约束冲突。因此,事务已回滚。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* szMessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

为 ConnectionHandle 启用了异步处理。调用了函数,在执行完 SQLCancelHandle 函数之前,在 ConnectionHandle 上调用了该函数。然后,在 ConnectionHandle 上再次调用函数。

调用了函数,完成执行 SQLCancelHandle 之前,从多线程应用程序中的不同线程对 ConnectionHandle 调用了 SQLCancelHandle。

HY010 函数序列错误

(DM)调用了与 ConnectionHandle 关联的语句句柄的异步执行函数,在调用 SQLEndTran 时仍在执行。

(DM) 异步执行的函数(不是此函数)为 ConnectionHandle 调用,并且仍在调用此函数时执行。

SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 调用了与 ConnectionHandle 关联的语句句柄,并返回了 SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

(DM) 异步执行函数 (而不是此函数) 已调用 HandleType 设置为 SQL_HANDLE_DBC 的 Handle, 并且仍在调用此函数时执行

SQLExecute、SQLExecute、SQLExecDirect 或 SQLMoreResults 调用了与 Handle 关联的语句句柄之一,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

HY012 无效的事务操作代码 (DM) 为参数 CompletionType 指定的值既不是 SQL_COMMIT,也不是SQL_ROLLBACK,
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY092 属性/选项标识符无效 (DM) 为参数 HandleType 指定的值既不是SQL_HANDLE_ENV,也不是SQL_HANDLE_DBC。
HY115 对于包含启用了异步函数执行的连接的环境,不允许 SQLEndTran (DM) 连接启用异步执行连接函数,则不能将 HandleType 设置为 SQL_HANDLE_ENV。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能 驱动程序或数据源不支持 ROLLBACK 操作。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 ConnectionHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.19.SQLExecDirect

3.19.1.功能描述

如果语句中有参数的话,SQLExecDirect 函数使用参数标记参数的当前值,执行一条准备好的语句。SQLExecDirect是提交用于一次性执行的 SQL 语句的最快方法。

3.19.2.语法

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

3.19.3.参数

  • StatementHandle

    [输入]语句句柄。

  • StatementText

    [输入]要执行SQL语句,不支持一次执行多条语句。

  • TextLength

    [输入]*StatementText的长度。

3.19.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_STILL_EXECUTING、SQL_ERROR、SQL_NO_DATA、SQL_INVALID_HANDLE 或 SQL_PARAM_DATA_AVAILABLE。

3.19.5.诊断

当 SQLExecDirect 函数返回 SQL_ERROR 或SQL_SUCCESS_WITH_INFO 时,通过调用SQLGetDiagRec 函数,且其HandleType 和 Handle 参数分别设置为 SQL_HANDLE_STMT 和StatementHandle,可得到一个相关的 SQLSTATE 值。下面的表格列出了由 SQLExecDirect 返回的 SQLSTATE值 ,并解释了与这个函数相关的每个信息;标注为 “(DM)” 位于驱动程序管理器返回的 SQLSTATEs 的说明之前。如果没有其他注释,那么与每个 SQLSTATE 值相关的返回代码是 SQL_ERROR 。

SQLExecDirect 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01001 游标操作冲突 *StatementText 包含定位的更新或删除语句,并且未更新或删除任何行或多行。(函数返回 SQL_SUCCESS_WITH_INFO。)
01003 set 函数中消除的 NULL 值 Argument StatementText 包含 set 函数 (如 AVG、MAX、MIN 等) ,但不包括 COUNT set 函数,并且 NULL 参数值在应用函数之前已消除。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 为输入/输出或输出参数返回的字符串或二进制数据导致截断非空字符或非 NULL 二进制数据。如果它是字符串值,则被右截断。(函数返回 SQL_SUCCESS_WITH_INFO。)
01006 未撤销特权 *StatementText 包含 REVOKE 语句,并且用户没有指定的特权。(函数返回 SQL_SUCCESS_WITH_INFO。)
01007 未授予特权 * StatementText 是一个 GRANT 语句,无法向用户授予指定的特权。
01S02 选项值已更改 由于实现工作环境,指定的语句属性无效,因此暂时替换了类似的值。(SQLGetStmtAttr 以确定暂时替换的值是什么。) 替换值对 StatementHandle 有效,直到游标关闭,此时语句属性恢复为以前的值。可更改的语句属性包括:SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、SQL_ATTR_KEYSET_SIZE、SQL_ATTR_MAX_LENGTH、SQL_ATTR_MAX_ROWS、SQL_ATTR_QUERY_TIMEOUT、 SQL_ATTR_SIMULATE_CURSOR。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S07 小数截断 为输入/输出或输出参数返回的数据被截断,因此数值数据类型的小数部分被截断,或者时间、时间戳或间隔数据类型的时间部分的小数部分被截断。(函数返回 SQL_SUCCESS_WITH_INFO。)
07002 COUNT 字段不正确

SQLBindParameter 中指定的参数数小于 StatementText 中包含的 SQL * 语句中的参数。

调用 SQLBindParameter 时,ParameterValuePtr 设置为 null 指针,StrLen_or_IndPtr 未设置为 SQL_NULL_DATA 或 SQL_DATA_AT_EXEC,InputOutputType未设置为 SQL_PARAM_OUTPUT,因此 SQLBindParameter 中指定的参数数大于 *StatementText 中包含的 SQL 语句中的参数。

07006 受限数据类型属性冲突

绑定参数的 SQLBindParameter 中的 ValueType 参数标识的数据值无法转换为 SQLBindParameter 中 ParameterType 参数标识的数据类型。

为绑定为 SQL_PARAM_INPUT_OUTPUT 或 SQL_PARAM_OUTPUT的参数返回的数据值无法转换为 SQLBindParameter 中的 ValueType 参数标识的数据类型。

如果无法转换一个或多个行的数据值,但已成功返回一个或多个行,则此函数返回 SQL_SUCCESS_WITH_INFO。

07007 受限参数值冲突

参数类型 SQL_PARAM_INPUT_OUTPUT_STREAM仅用于以部件方式发送和接收数据的参数。此参数类型不允许输入绑定缓冲区。

如果参数类型为 SQL_PARAM_INPUT_OUTPUT,并且 * SQLBindParameter 中指定的 StrLen_or_IndPtr 不等于 SQL_NULL_DATA、SQL_DEFAULT_PARAM、 SQL_LEN_DATA_AT_EXEC (len) 或 SQL_DATA_AT_EXEC,则会发生此错误。

07S01 默认参数的使用无效 使用 SQLBindParameter 设置的参数值SQL_DEFAULT_PARAM,并且相应的参数没有默认值。
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
21S01 插入值列表与列列表不匹配 *StatementText 包含INSERT语句,要插入的值数与派生表的程度不匹配。
21S02 派生表的程度与列表不匹配 *StatementText 包含CREATE VIEW语句,非限定列列(SQL 语句) 的列标识符参数中为视图指定的列数包含的名称多于由 SQL 语句的 query-specification 参数定义的派生表中的列数。
22001 字符串数据,右截断 将字符或二进制值赋值给列会导致截断非空字符数据或非 null 二进制数据。
22002 需要但未提供指示器变量 NULL 数据绑定到一个输出参数,StrLen_or_IndPtr SQLBindParameter 设置的输出参数为空指针。
22003 数值范围外

*StatementText 包含一个包含绑定数值参数或文本的 SQL 语句,该值导致整个 (而不是小数) 在分配给关联的表列时截断数字的一部分。

返回(输入/输出或输出参数的数值) 字符串)导致整个 (而不是数字的小数部分) 被截断。

22007 日期/时间格式无效

*StatementText 包含一SQL语句,该语句包含日期、时间或时间戳结构作为绑定参数,参数分别为无效的日期、时间或时间戳。

输入/输出或输出参数绑定到日期、时间或时间戳 C 结构,返回的参数中的值分别为无效的日期、时间或时间戳。(函数返回 SQL_SUCCESS_WITH_INFO。)

22008 日期/时间字段溢出

*StatementText 包含一SQL语句,该语句包含一个日期/时间表达式,该表达式在计算后导致日期、时间或时间戳结构无效。

为输入/输出或输出参数计算的 datetime 表达式导致日期、时间或时间戳 C 结构无效。

22012 被零除

*StatementText 包含一SQL语句,该语句包含导致被零除的算术表达式。

为输入/输出或输出参数计算的算术表达式导致被零除。

22015 间隔字段溢出

* StatementText 包含一个确切的数值或间隔参数,在转换为数据类型SQL间隔时,该参数导致有效数字丢失。

* StatementText 包含具有多个字段的 interval 参数,在转换为列中的数值数据类型时,该字段在数值数据类型中没有表示形式。

* StatementText 包含分配给类型SQL的参数数据,并且该类型在间隔类型中没有 C 类型的SQL表示形式。

将输入/输出或输出参数(与类型SQL精确数字或间隔)分配给间隔 C 类型导致有效数字丢失。

将输入/输出或输出参数分配给间隔 C 结构时,间隔数据结构中不存在数据表示形式。

22018 强制转换规范的字符值无效

* StatementText 包含一个 C 类型,该类型是精确或近似数值、日期时间或间隔数据类型;列的 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。

返回输入/输出或输出参数时,SQL类型为精确或近似数值、日期/时间或间隔数据类型;C 类型为 SQL_C_CHAR;并且列中的值不是绑定类型SQL文本。

22019 转义字符无效 *StatementText 包含一SQL 语句,该语句包含WHERE子句中具有 ESCAPE 的LIKE谓词,并且 ESCAPE 后转义字符的长度不等于 1。
22025 转义序列无效 *StatementText 包含一SQL 语句,该语句在WHERE子句中包含“LIKE模式值 ESCAPE 字符”,模式值中的转义字符后的字符不是“%”或&“&”之一。
23000 完整性约束冲突 *StatementText 包含SQL或文本的语句。对于在关联表列中定义为 NOT NULL 的列,参数值为 NULL,为约束为仅包含唯一值的列提供了重复值,或者违反了某些其他完整性约束。
24000 游标状态无效

游标被 SQLFetch 或 SQLFetchScroll 定位在 StatementHandle 上。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA,驱动程序管理器将返回此错误;如果 SQLFetch 或 SQLFetchScroll 返回了 SQL_NO_DATA,驱动程序将返回此错误。

游标已打开,但没有定位在 StatementHandle 上。

*StatementText 包含定位的更新或删除语句,光标位于结果集的开始位置或结果集的末尾之后。

34000 游标名称无效 *StatementText 包含定位的更新或删除语句,并且正在执行的语句引用的游标未打开。
3D000 目录名称无效 StatementText 中指定的目录名称无效。
3F000 模式名称无效 StatementText 中指定的模式名称无效。
40001 序列化失败 由于资源与另一个事务发生死锁,事务已回滚。
40003 语句完成未知 在执行此函数期间,关联的连接失败,无法确定事务的状态。
42000 语法错误或访问冲突

*StatementText 包含SQL语句,该语句不可准备或包含语法错误。

用户无权执行 *StatementText SQL语句。

42S01 基表或视图已存在 *StatementText包含CREATE TABLECREATE VIEW语句,并且指定的表名或视图名称已存在。
42S02 找不到基表或视图

*StatementText 包含DROP TABLEDROP VIEW语句,并且指定的表名或视图名称不存在。

*StatementText 包含ALTER TABLE语句,并且指定的表名不存在。

*StatementText 包含CREATE VIEW语句,并且查询规范定义的表名或视图名称不存在。

*StatementText 包含CREATE INDEX语句,并且指定的表名不存在。

*StatementText 包含GRANTREVOKE语句,并且指定的表名或视图名称不存在。

*StatementText 包含SELECT语句,并且指定的表名或视图名称不存在。

*StatementText 包含DELETEINSERTUPDATE语句,并且指定的表名称不存在。

*StatementText 包含CREATE TABLE语句,以及一个在约束 (指定的表,该表引用的表) 不存在。

*StatementText 包含CREATE SCHEMA语句,并且指定的表名或视图名称不存在。

42S11 索引已存在

*StatementText 包含CREATE INDEX语句,并且指定的索引名称已存在。

*StatementText 包含CREATE SCHEMA语句,并且指定的索引名称已存在。

42S12 找不到索引 *StatementText 包含DROP INDEX, 并且指定的索引名称不存在。
42S21 列已存在 *StatementText 包含ALTER TABLE 语句,并且ADD子句中指定的列不唯一或标识基表中的现有列。
42S22 找不到列

*StatementText 包含CREATE INDEX语句,并且列列表中指定的一个或多个列名不存在。

*StatementText 包含GRANTREVOKE语句,并且指定的列名不存在。

*StatementText 包含SELECTDELETEINSERTUPDATE语句,并且指定的列名不存在。

*StatementText 包含CREATE TABLE语句,并且约束中指定的列 (引用所创建的表) 不存在的表。

*StatementText 包含CREATE SCHEMA语句,并且指定的列名不存在。

44000 WITH CHECK OPTION 冲突

Argument StatementText 包含对已查看表执行的INSERT语句或派生自通过指定 WITH CHECK OPTION 创建的已查看表的表,以便受INSERT语句影响的一行或多行将不再存在于所查看的表中。

Argument StatementText 包含对已查看表执行的UPDATE语句或派生自通过指定 WITH CHECK OPTION 创建的已查看表的表,以便受UPDATE语句影响的一行或多行将不再存在于所查看的表中。

HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle。

HY009 空值指针的使用无效 (DM) *StatementText 为 null 指针。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLExecDirect 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 参数 TextLength 小于或等于0但不等于 SQL_NTS。

使用 SQLBindParameter 设置的参数值为 null 指针,并且参数的长度值不是0、SQL_NULL_DATA、SQL_DATA_AT_EXEC、 SQL_DEFAULT_PARAM 或小于或等于 SQL_LEN_DATA_AT_EXEC_OFFSET。

使用 SQLBindParameter 设置的参数值不是 null 指针;C 数据类型为 SQL_C_BINARY 或 SQL_C_CHAR;参数长度值小于0,但不是SQL_NTS、SQL_NULL_DATA、SQL_DATA_AT_EXEC、 SQL_DEFAULT_PARAM 或小于或等于 SQL_LEN_DATA_AT_EXEC_OFFSET。

SQLBindParameter 绑定的参数长度值设置为 SQL_DATA_AT_EXEC;SQL 类型是 SQL_LONGVARCHAR、SQL_LONGVARBINARY 或 long 特定于数据源的数据类型;SQLGetInfo 中的 SQL_NEED_LONG_DATA_LEN 信息类型为 "Y"。

HY105 无效的参数类型 为 SQLBindParameter 中的参数 InputOutputType 指定的值 SQL_PARAM_OUTPUT,并且该参数是一个输入参数。
HY109 游标位置无效 *StatementText 包含定位的updatedelete语句,并且游标被定位在已被删除或无法提取的行上,由 SQLSetPos 或 SQLFetchScroll。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作。 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.20.SQLExecute

3.20.1.功能描述

如果语句中存在参数标记的话,SQLExecute函数使用参数标记参数的当前值,执行一条准备好的SQL语句。

3.20.2.语法

SQLRETURN SQLExecute(  
     SQLHSTMT     StatementHandle); 

3.20.3.参数

  • StatementHandle

    [输入]语句句柄。

3.20.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_STILL_EXECUTING、SQL_ERROR、SQL_NO_DATA、SQL_INVALID_HANDLE 或SQL_PARAM_DATA_AVAILABLE。

3.20.5.诊断

当 SQLExecute 函数返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,通过调用SQLGetDiagRec 函数,且其 HandleType 和 Handle 参数分别设置为 SQL_HANDLE_STMT 和StatementHandle,可得到一个相关的SQLSTATE 值。下面的表格列出了由 SQLExecute 返回的 SQLSTATE值,并解释了与这个函数相关的每个信息;标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs说明之前。如果没有其他注释,那么与每个 SQLSTATE 值相关的返回代码是SQL_ERROR。

SQLExecute 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01001 游标操作冲突 与 StatementHandle 关联的预定义语句包含定位的updatedelete语句,并且未更新或删除任何行或多行。(函数返回 SQL_SUCCESS_WITH_INFO。)
01003 Set 函数中消除了 NULL 值 与 StatementHandle 关联的预定义语句包含set 函数 (例如AVGMAXMIN 等) ,但不包括 COUNT set 函数,并且在应用函数之前消除了 NULL 参数值。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 为 output 参数返回的字符串或二进制数据导致截断非空白字符或非空的二进制数据。如果它是一个字符串值,则它将被右截断。(函数返回 SQL_SUCCESS_WITH_INFO。)
01006 未撤销特权 与 StatementHandle 关联的预定义语句是REVOKE语句,而用户没有指定的权限。(函数返回 SQL_SUCCESS_WITH_INFO。)
01007 未授予特权 与 StatementHandle 关联的预定义语句是GRANT语句,并且用户无法被授予指定的权限。
01S02 选项值已更改 由于实现工作条件,指定的语句特性无效,因此临时替换相似的值。可以调用 (SQLGetStmtAttr 来确定暂时替换的值是什么。) 替换值对 StatementHandle 有效,直到游标关闭,此时语句特性会恢复为其以前的值。可以更改的语句属性有:
  • SQL_ATTR_CONCURRENCY

  • SQL_ATTR_CURSOR_TYPE

  • SQL_ATTR_KEYSET_SIZE

  • SQL_ATTR_MAX_LENGTH

  • SQL_ATTR_MAX_ROWS

  • SQL_ATTR_QUERY_TIMEOUT

  • SQL_ATTR_SIMULATE_CURSOR

(函数返回 SQL_SUCCESS_WITH_INFO。)
01S07 小数截断 为输入/输出参数或输出参数返回的数据被截断,以使数值数据类型的小数部分被截断,或时间、时间戳或间隔数据类型的时间部分的小数部分被截断。(函数返回 SQL_SUCCESS_WITH_INFO。)
07002 COUNT 字段不正确

SQLBindParameter 中指定的参数数目小于 StatementText 中包含的 SQL 语句中的参数数量。

调用 SQLBindParameter 时, ParameterValuePtr 设置为 null 指针,StrLen_or_IndPtr 未设置为 SQL_NULL_DATA 或 SQL_DATA_AT_EXEC,并且 InputOutputType 未设置为 SQL_PARAM_OUTPUT,因此 SQLBindParameter 中指定的参数数目大于 *StatementText 中包含的 SQL 语句中的参数数量。

07006 受限制的数据类型属性冲突

绑定参数的 SQLBindParameter 中的 ValueType 参数标识的数据值无法转换为 SQLBindParameter 中 ParameterType 参数所标识的数据类型。

为绑定为 SQL_PARAM_INPUT_OUTPUT 或 SQL_PARAM_OUTPUT 的参数返回的数据值无法转换为 SQLBindParameter 中 ValueType 参数标识的数据类型。

如果一个或多个行的数据值无法转换,但已成功返回一个或多个行,则此函数将返回 SQL_SUCCESS_WITH_INFO。

07007 受限制的参数值冲突

参数类型 SQL_PARAM_INPUT_OUTPUT_STREAM 仅用于在部分中发送和接收数据的参数。此参数类型不允许输入绑定缓冲区。

当参数类型 SQL_PARAM_INPUT_OUTPUT,且 * 在 SQLBindParameter 中指定的 StrLen_or_IndPtr 不等于 SQL_NULL_DATA、SQL_DEFAULT_PARAM、 SQL_LEN_DATA_AT_EXEC (LEN) 或 SQL_DATA_AT_EXEC 时,将发生此错误。

07S01 默认参数的使用无效 使用 SQLBindParameter 设置的参数值是 SQL_DEFAULT_PARAM 的,并且相应的参数不是 ODBC 规范过程调用的参数。
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
21S02 派生表的等级与列列表不匹配 与 StatementHandle 关联的预定义语句包含CREATE VIEW语句,而非限定列列(在 SQL 语句的列标识符参数中为视图指定的列数,) 包含的名称比 SQL 语句的查询规范参数定义的派生表中的列数多。
22001 字符串数据,右截断 将字符或二进制值分配给列会导致截断非空白 (字符) 或非 null (二进制) 字符或字节。
22002 需要指示器变量,但未提供 NULL 数据已绑定到一个输出参数,该参数的 StrLen_or_IndPtr 由 SQLBindParameter 设置为 null 指针。
22003 数值超出范围

与 StatementHandle 关联的预定义语句包含绑定的数值参数,而参数值导致整个 (而不是分配给关联表列时要截断的数字) 部分的小数部分。

对于一个或多个输入/输出参数 (返回数值或字符串) 的数值将导致整个 (而不是将被截断的数字) 部分的小数部分。

22007 Datetime 格式无效

与 StatementHandle 关联的预定义语句包含一个 SQL 语句,该语句包含一个作为绑定参数的日期、时间或时间戳结构,并且参数分别为无效的日期、时间或时间戳。

输入/输出或输出参数被绑定到日期、时间或时间戳 C 结构,返回的参数中的值分别为无效的日期、时间或时间戳。(函数返回 SQL_SUCCESS_WITH_INFO。)

22008 日期时间字段溢出

与 StatementHandle 关联的预定义语句包含一个包含日期时间表达式的 SQL 语句,该表达式在计算时导致日期、时间或时间戳结构无效。

为输入/输出或输出参数计算的日期时间表达式导致日期、时间或时间戳 C 结构无效。

22012 被零除

与 StatementHandle 关联的预定义语句包含导致被零除的算术表达式。

为输入/输出或输出参数计算的算术表达式导致被零除。

22015 间隔字段溢出

* StatementText 包含一个确切的数值或间隔参数,在转换为数据类型SQL间隔时,该参数导致有效数字丢失。

* StatementText 包含具有多个字段的 interval 参数,在转换为列中的数值数据类型时,该字段在数值数据类型中没有表示形式。

* StatementText 包含分配给类型SQL的参数数据,并且该类型在间隔类型中没有 C SQL表示形式。

将输入/输出或输出参数(精确数字或间隔SQL为间隔 C 类型)导致有效数字丢失。

将输入/输出或输出参数分配给间隔 C 结构时,间隔数据结构中不存在数据表示形式。

22018 强制转换规范的字符值无效

* StatementText 包含一个 C 类型,该类型是精确或近似数值、日期时间或间隔数据类型;列的 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。

返回输入/输出或输出参数时,SQL类型为精确或近似数值、日期/时间或间隔数据类型;C 类型为 SQL_C_CHAR;并且列中的值不是绑定类型SQL文本。

22019 转义字符无效 与 StatementHandle 关联的已准备语句包含WHERE子句中具有 ESCAPE 的LIKE谓词,并且 ESCAPE 后转义字符的长度不等于 1。
22025 转义序列无效 与 StatementHandle 关联的已准备语句在WHERE子句中包含“LIKE 模式值 ESCAPE 字符”,模式值中的转义字符后的字符不是“%”或“_”之一。
23000 完整性约束冲突 与 StatementHandle 关联的已准备语句包含参数。对于在关联表列中定义为 NOT NULL 的列,参数值为NULL,为约束为仅包含唯一值的列提供了重复值,或者违反了某些其他完整性约束。
24000 游标状态无效

游标被 SQLFetch 或 SQLFetchScroll 定位在 StatementHandle 上。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA,驱动程序将返回此错误;如果 SQLFetch 或 SQLFetchScroll 返回了 SQL_NO_DATA,驱动程序将返回此错误。

StatementHandle 上的游标已打开。

与 StatementHandle 关联的已准备语句包含定位的更新或删除状态说明 t,光标位于结果集的开始位置之前或结果集的末尾之后。

40001 序列化失败 由于资源与另一个事务发生死锁,事务已回滚。
40003 语句完成未知 在执行此函数期间,关联的连接失败,无法确定事务的状态。
42000 语法错误或访问冲突 用户无权执行与 StatementHandle 关联的已准备语句。
44000 WITH CHECK OPTION 冲突

与 StatementHandle 关联的已准备语句包含对已查看表执行的INSERT语句或派生自通过指定 WITH CHECK OPTION 创建的已查看表的表,以便受INSERT语句影响的一行或多行将不再存在于所查看的表中。

与 StatementHandle 关联的已准备语句包含对已查看表执行的UPDATE语句或派生自通过指定 WITH CHECK OPTION 创建的已查看表的表,以便受UPDATE语句影响的一行或多行将不再存在于所查看的表中。

HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

为 StatementHandle 启用了异步处理。调用了函数,在函数完成执行之前,在 StatementHandle 上调用 了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用函数。

调用了函数,在函数完成执行之前,从多线程应用程序中的不同线程对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLExecute 函数时,此异步函数仍在执行

(调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM 代码,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM) 异步执行的函数 (不是此函数) StatementHandle 调用,并且仍在调用此函数时执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

(未) StatementHandle 的 DM。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效

使用 SQLBindParameter 设置的参数值为空指针,参数长度值不为 0、SQL_NULL_DATA、SQL_DATA_AT_EXEC、 SQL_DEFAULT_PARAM 或小于或等于 SQL_LEN_DATA_AT_EXEC_OFFSET。

使用 SQLBindParameter 设置的参数值不是空指针;C 数据类型为 SQL_C_BINARY 或 SQL_C_CHAR;参数长度值小于 0,但不为 SQL_NTS、SQL_NULL_DATA、SQL_DEFAULT_PARAM 或 SQL_DATA_AT_EXEC,或者小于或等于 SQL_LEN_DATA_AT_EXEC_OFFSET。

SQLBindParameter 绑定的参数长度值已设置为SQL_DATA_AT_EXEC;SQL类型是SQL_LONGVARCHAR、SQL_LONGVARBINARY或特定于数据源的长数据类型;SQLGetInfo SQL_NEED_LONG_DATA_LEN信息类型为"Y"。

HY105 参数类型无效 为 SQLBindParameter 中的 参数 InputOutputType 指定的值SQL_PARAM_OUTPUT参数是输入参数。
HY109 光标位置无效 准备的语句是定位更新或删除语句,游标由 SQLSetPos 或 SQLFetchScroll定位在已删除或无法提取的行上。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能

驱动程序或数据源不支持SQL_ATTR_CONCURRENCY和SQL_ATTR_CURSOR_TYPE语句属性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS语句属性设置为 SQL_UB_VARIABLE,SQL_ATTR_CURSOR_TYPE 语句属性设置为驱动程序不支持书签的游标类型。

HYT00 超时时间已到 查询超时期限在数据源返回结果集之前过期。超时期限通过 SQLSetStmtAttr、SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。

3.21.SQLFetch

3.21.1.功能描述

SQLFetch从结果集中提取下一个数据行集,并返回所有绑定列的数据。

3.21.2.语法

SQLRETURN SQLFetch(  
     SQLHSTMT     StatementHandle); 

3.21.3.参数

  • StatementHandle

    [输入]语句句柄。

3.21.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。

3.21.5.诊断

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

SQLFetch 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 为列返回的字符串或二进制数据导致截断非空白字符或非空的二进制数据。如果它是一个字符串值,则它将被右截断。
01S01 行中的错误 提取一行或多行时出错。
01S07 小数截断 为列返回的数据被截断。对于数值数据类型,数值的小数部分被截断。对于包含时间部分的时间、时间戳和间隔数据类型,时间的小数部分将被截断。(函数返回 SQL_SUCCESS_WITH_INFO。)
07006 受限制的数据类型属性冲突

结果集中列的数据值无法转换为 SQLBindCol 中 TargetType 指定的数据类型。

列0与 SQL_C_BOOKMARK 的数据类型绑定,而 SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE。

列0与 SQL_C_VARBOOKMARK 的数据类型绑定,而 SQL_ATTR_USE_BOOKMARKS 语句特性未设置为 SQL_UB_VARIABLE。

07009 描述符索引无效 已绑定列0,并且 SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_OFF。
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
22001 字符串数据,右截断 为列返回的可变长度书签已截断。
22002 需要指示器变量,但未提供 将 NULL 数据提取到 StrLen_or_IndPtr 由 SQLBindCol 设置的列中,(SQL_DESC_INDICATOR_PTR 或由 SQLSetDescField 或 SQLSetDescRec) 设置为 null 指针。
22003 数值超出范围 对于一个或多个绑定列,将数值返回为数值或字符串将导致整个 (而不是将被截断的数字) 部分的小数部分。
22007 Datetime 格式无效 结果集中的字符列已绑定到日期、时间或时间戳 C 结构,列中的值分别为无效的日期、时间或时间戳。
22012 被零除 返回了算术表达式中的值,从而导致被零除。
22015 间隔字段溢出

从精确数值或间隔 SQL 类型分配到 interval C 类型会导致前导字段的有效位丢失。

将数据提取到 interval c 类型时,interval c 类型中没有 SQL 类型的值的表示形式。

22018 转换规范的字符值无效

结果集中的字符列已绑定到字符 C 缓冲区,列包含的字符在缓冲区的字符集中没有表示形式。

C 类型是精确或近似数字、日期时间或间隔数据类型;列 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。

24000 无效的游标状态 StatementHandle 处于已执行状态,但没有与 StatementHandle 关联的结果集。
40001 序列化失败 执行提取的事务已终止,以防止死锁。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。调用 SQLFetch 函数,并在其完成执行之前,对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle 。然后,在 StatementHandle 上再次调用 SQLFetch 函数。

或者,在执行完 SQLFetch 函数之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLFetch 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 指定的 StatementHandle 未处于执行状态。调用函数时,无需先调用 SQLExecDirect、SQLExecute 或 catalog 函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect、SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

调用 SQLExtendedFetch 后,调用了 ( DM) SQLFetch ,并调用了 SQL_CLOSE 选项 SQLFreeStmt 。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效 SQL_ATTR_USE_BOOKMARK 语句特性设置为 SQL_UB_VARIABLE,列0绑定到一个缓冲区,该缓冲区的长度不等于此结果集的书签的最大长度。(此长度在 IRD 的 SQL_DESC_OCTET_LENGTH 字段中提供,可以通过调用 SQLDescribeCol、SQLColAttribute 或 SQLGetDescField 来获取。)
HY107 行值超出范围 用 SQL_ATTR_CURSOR_TYPE 语句特性指定的值已 SQL_CURSOR_KEYSET_DRIVEN,但用 SQL_ATTR_KEYSET_SIZE 语句特性指定的值大于0且小于用 SQL_ATTR_ROW_ARRAY_SIZE 语句特性指定的值。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能 驱动程序或数据源不支持 SQLBindCol 中 TargetType 的组合指定的转换和相应列的 SQL 数据类型。
HYT00 超时时间已到 在数据源返回请求的结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync,以执行后处理并完成操作。

3.22.SQLFetchScroll

3.22.1.功能描述

SQLFetchScroll从结果集提取指定的数据行集,并返回所有绑定列的数据。可在绝对或相对位置或按书签指定行集。

3.22.2.语法

SQLRETURN SQLFetchScroll( 
SQLHSTMT		StatementHandle, 
SQLSMALLINT 	FetchOrientation, 
SQLINTERGER 	FetchOffset); 

3.22.3.参数

  • StatementHandle

    [输入]语句句柄。

  • FetchOrientation

    [输入]提取类型,提取类型如下所示。

    • SQL_FETCH_NEXT

    • SQL_FETCH_PRIOR

    • SQL_FETCH_FIRST

    • SQL_FETCH_LAST

    • SQL_FETCH_ABSOLUTE

    • SQL_FETCH_RELATIVE

    • SQL_FETCH_BOOKMARK

  • FetchOffset

    [输入]要提取的行数。此参数的解释取决于 FetchOrientation参数的值。

3.22.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR或 SQL_INVALID_HANDLE。

3.22.5.诊断

当 SQLFetchScroll 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLFetchScroll 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为"(DM)"位于驱动程序管理器返回的 SQLSTATEs 说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。如果单个列上发生错误,可以使用的DiagIdentifier 调用 SQLGetDiagField SQL_DIAG_COLUMN_NUMBER以确定发生错误的列;和SQLGetDiagField 可以使用 SQL_DIAG_ROW_NUMBER 的 DiagIdentifier进行调用,以确定包含该列的行。

对于可以返回 SQL_SUCCESS_WITH_INFO 或 SQL_ERROR(除了 01xxx SQLSTATEs)的所有SQLSTATEs,如果多行运算的一个或多个(但不是全部)行发生错误,则返回SQL_SUCCESS_WITH_INFO;如果单行操作出错,则返回 SQL_ERROR。

SQLFetchScroll 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 为列返回的字符串或二进制数据导致截断非空字符或非 NULL 二进制数据。如果它是字符串值,则被右截断。
01S01 行中错误 提取一个或多个行时出错。
01S06 在结果集返回第一个行集之前尝试提取

请求的行集在 FetchOrientation 为 SQL_FETCH_PRIOR 时重叠了结果集的开始位置,当前位置超出了第一行,并且当前行数小于或等于行集大小。

请求的行集在 FetchOrientation 为 SQL_FETCH_PRIOR 时重叠了结果集的开始位置,当前位置超出了结果集的末尾,并且行集大小大于结果集大小。

当 FetchOrientation 为 SQL_FETCH_RELATIVE,FetchOffset 为负,并且 FetchOffset 的绝对值小于或等于行集大小时,请求的行集与结果集的开始重叠。

当 FetchOrientation 为 SQL_FETCH_ABSOLUTE,FetchOffset 为负且 FetchOffset 的绝对值大于结果集大小但小于或等于行集大小时,请求的行集与结果集的开始重叠。

函数返回 SQL_SUCCESS_WITH_INFO。

01S07 小数截断 为列返回的数据已被截断。对于数值数据类型,数字的小数部分被截断。对于包含时间部分的timetimestamp和 interval 数据类型,该时间的小数部分将被截断。函数返回 SQL_SUCCESS_WITH_INFO。
07006 受限数据类型属性冲突

结果集内列的数据值无法转换为 SQLBindCol 中 TargetType 指定的数据类型。

列 0 与列的数据类型SQL_C_BOOKMARK,SQL_ATTR_USE_BOOKMARKS语句属性设置为SQL_UB_VARIABLE。

列 0 与列的数据类型SQL_C_VARBOOKMARK,SQL_ATTR_USE_BOOKMARKS语句属性未设置为 SQL_UB_VARIABLE。

07009 描述符索引无效 绑定了列 0,SQL_ATTR_USE_BOOKMARKS语句属性设置为SQL_UB_OFF。
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
22001 字符串数据,右截断 为列返回的可变长度书签已被截断。
22002 需要但未提供指示器变量 NULL 数据被提取到一个列中,该列的 StrLen_or_IndPtr 由 SQLBindCol (设置,或者由 SQLSetDescField 或 SQLSetDescRec) 设置的 SQL_DESC_INDICATOR_PTR 为空指针。
22003 数值超出范围 如果为一个或多个绑定列 (数值或字符串) 返回数值,则导致整个 数字(而不是小数部分) 被截断。
22007 日期/时间格式无效 结果集内的字符列绑定到日期、时间或时间戳 C 结构,该列中的值分别是无效的日期、时间或时间戳。
22012 被零除 返回了算术表达式中的值,导致被零除。
22015 间隔字段溢出

从精确数字或间隔SQL类型分配给间隔 C 类型导致前导字段中的有效数字丢失。

将数据提取到间隔 C 类型时,在间隔 C 类型SQL类型的值没有表示形式。

22018 强制转换规范的字符值无效

结果集中的字符列已绑定到字符 C 缓冲区,列包含的字符在缓冲区的字符集中没有表示形式。

C 类型是精确或近似数字、日期时间或间隔数据类型;列 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。

24000 无效的游标状态 StatementHandle 已执行,但没有结果集与 StatementHandle 关联。
40001 序列化失败 执行提取的事务已终止,以防止死锁。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLFetchScroll 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 指定的 StatementHandle 未处于执行状态。调用函数时,无需先调用 SQLExecDirect、 SQLExecute 或 catalog 函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect、SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

调用 SQLExtendedFetch 后,调用了(DM) SQLFetch ,并调用了 SQL_CLOSE 选项 SQLFreeStmt 。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效 SQL_ATTR_USE_BOOKMARK 语句特性设置为 SQL_UB_VARIABLE,列0绑定到一个缓冲区,该缓冲区的长度不等于此结果集的书签的最大长度。(此长度在 IRD 的 SQL_DESC_OCTET_LENGTH 字段中提供,可以通过调用 SQLDescribeCol、 SQLColAttribute 或 SQLGetDescField 来获取。)
HY106 提取类型超出范围

DM) 为参数 FetchOrientation 指定的值无效。

(DM) 参数 FetchOrientation 已 SQL_FETCH_BOOKMARK,并且 SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_OFF。

SQL_ATTR_CURSOR_TYPE 语句特性的值 SQL_CURSOR_FORWARD_ONLY,而参数 FetchOrientation 的值不是 SQL_FETCH_NEXT 的。

SQL_ATTR_CURSOR_SCROLLABLE 语句特性的值 SQL_NONSCROLLABLE,而参数 FetchOrientation 的值不是 SQL_FETCH_NEXT 的。

HY107 行值超出范围 用 SQL_ATTR_CURSOR_TYPE 语句特性指定的值已 SQL_CURSOR_KEYSET_DRIVEN,但用 SQL_ATTR_KEYSET_SIZE 语句特性指定的值大于0且小于用 SQL_ATTR_ROW_ARRAY_SIZE 语句特性指定的值。
HY111 书签值无效 参数 FetchOrientation 为 SQL_FETCH_BOOKMARK, SQL_ATTR_FETCH_BOOKMARK_PTR 语句特性中的值指向的书签无效或为 null 指针。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能 驱动程序或数据源不支持 SQLBindCol 中 TargetType 的组合指定的转换和相应列的 SQL 数据类型。
HYT00 超时时间已到 在数据源返回请求的结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.23.SQLForeignKeys

3.23.1.功能描述

SQLForeignKeys可以返回:

  • 指定表中的外键列表(指定表中的列,这些列引用其他表中的主键) 。

  • 其他表中引用指定表中主键的外键列表。

驱动程序将每个列表作为指定语句的结果集返回。

3.23.2.语法

SQLRETURN SQLForeignKeys(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      PKCatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      PKSchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      PKTableName,  
     SQLSMALLINT    NameLength3,  
     SQLCHAR *      FKCatalogName,  
     SQLSMALLINT    NameLength4,  
     SQLCHAR *      FKSchemaName,  
     SQLSMALLINT    NameLength5,  
     SQLCHAR *      FKTableName,  
     SQLSMALLINT    NameLength6);  

3.23.3.参数

  • StatementHandle

    [输入]语句句柄。

  • PKCatalogName

    [输入]主键表目录名称。如果驱动程序为某些表(而不是其他表)支持目录,例如当驱动程序从不同 DBMS检索数据时(例如,当驱动程序检索不同 DBMS 的数据时),则空字符串( "" ) 表示这些表没有目录。PKCatalogName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 PKCatalogName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 PKCatalogName是普通参数;它按原义处理,其大小写有意义。

  • NameLength1

    [输入]*PKCatalogName的长度。

  • PKSchemaName

    [输入]主键表模式名称。如果驱动程序支持某些表的模式,而不支持其他表的模式(例如,当驱动程序从不同 DBMS检索数据时),则空字符串 ( "" ) 表示不具有模式的那些表。PKSchemaName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 PKSchemaName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 PKSchemaName是普通参数;它按原义处理,其大小写有意义。

  • NameLength2

    [输入]*PKSchemaName的长度。

  • PKTableName

    [输入]主键表名称。PKTableName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 PKTableName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 PKTableName是普通参数;它按原义处理,其大小写有意义。

  • NameLength3

    [输入]*PKTableName的长度。

  • FKCatalogName

    [输入]外键表目录名称。如果驱动程序为某些表(而不是其他表)支持目录,例如当驱动程序从不同 DBMS检索数据时(例如,当驱动程序检索不同 DBMS 的数据时),则空字符串( "" ) 表示这些表没有目录。FKCatalogName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 FKCatalogName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 FKCatalogName是普通参数;它按原义处理,其大小写有意义。

  • NameLength4

    [输入]*FKCatalogName的长度。

  • FKSchemaName

    [输入]外键表模式名称。如果驱动程序支持某些表的模式,而不支持其他表的模式(例如,当驱动程序从不同 DBMS检索数据时),则空字符串 ( "" ) 表示不具有模式的那些表。FKSchemaName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 FKSchemaName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 FKSchemaName是普通参数;它按原义处理,其大小写有意义。

  • NameLength5

    [输入]*FKSchemaName的长度。

  • FKTableName

    [输入]外键表名。FKTableName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 FKTableName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 FKTableName是普通参数;它按原义处理,其大小写有意义。

  • NameLength6

    [输入]*FKTableName的长度。

3.23.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.23.5.诊断

当 SQLForeignKeys 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLForeignKeys 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为 "(DM)" 位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLForeignKeys 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标,并且调用了 SQLFetch 或 SQLFetchScroll 。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA,驱动程序管理器将返回此错误,如果 SQLFetch 或 SQLFetchScroll 已 SQL_NO_DATA 返回,则由驱动程序返回。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll 。

40001 序列化失败 由于另一个事务发生资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle ,然后在 StatementHandle 上再次调用了该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY009 null 指针的使用无效

(DM) 参数 PKTableName 和 FKTableName 都是 null 指针。

SQL_ATTR_METADATA_ID 语句属性已设置为 SQL_TRUE,FKCatalogName 或 PKCatalogName 参数为 null 指针,SQL_CATALOG_NAME InfoType 返回支持目录名称。

(DM) 将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE,并且 FKSchemaName、PKSchemaName、FKTableName 或 PKTableName 参数为空指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLForeignKeys 函数时,此异步函数仍在执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM 代码,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM) 异步执行的函数 (不是此函数) StatementHandle 调用,并且仍在调用此函数时执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效

(DM) 名称长度参数之一的值小于 0,但不等于SQL_NTS。

其中一个名称长度参数的值超出了相应名称的最大长度值。

HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能

指定了目录名称,并且驱动程序或数据源不支持目录。

指定了模式名称,并且驱动程序或数据源不支持模式。

驱动程序或数据源不支持SQL_ATTR_CONCURRENCY和SQL_ATTR_CURSOR_TYPE语句属性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS语句属性设置为 SQL_UB_VARIABLE,SQL_ATTR_CURSOR_TYPE 语句属性设置为驱动程序不支持书签的游标类型。

HYT00 超时时间已到 查询超时期限在数据源返回结果集之前过期。超时期限通过 SQLSetStmtAttr、SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。

3.24.SQLFreeHandle

3.24.1.功能描述

SQLFreeHandle释放与特定环境、连接、语句或描述符句柄关联的资源。

3.24.2.语法

SQLRETURN SQLFreeHandle(  
     SQLSMALLINT   HandleType,  
     SQLHANDLE     Handle); 

3.24.3.参数

  • HandleType

    [输入] SQLFreeHandle 要释放的句柄的类型。必须是以下值之一:

    • SQL_HANDLE_DBC

    • SQL_HANDLE_DBC_INFO_TOKEN

    • SQL_HANDLE_DESC

    • SQL_HANDLE_ENV

    • SQL_HANDLE_STMT

    SQL_HANDLE_DBC_INFO_TOKEN句柄仅由驱动程序管理器和驱动程序使用。应用程序不应使用此句柄类型。

    如果 HandleType 不是这些值之一 ,SQLFreeHandle 将返回SQL_INVALID_HANDLE。

  • Handle

    [输入]要释放的句柄。

3.24.4.返回值

SQL_SUCCESS、SQL_ERROR或SQL_INVALID_HANDLE。

如果 SQLFreeHandle 返回SQL_ERROR,则句柄仍然有效。

3.24.5.诊断

当 SQLFreeHandle SQL_ERROR,可能会从 SQLFreeHandle 尝试释放但无法释放的句柄的诊断数据结构获取关联的SQLSTATE 值。下表列出了 SQLFreeHandle 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs 说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLFreeHandle 诊断代码

SQLSTATE 错误 说明
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误

(DM) HandleType 参数SQL_HANDLE_ENV,并且至少有一个连接处于已分配或已连接状态。在每个连接上调用包含 SQL_HANDLE_DBC 的 HandleType 的 SQLDisconnect 和 SQLFreeHandle 时,必须使用 SQL_HANDLE_ENV 的 HandleType 调用 SQLFreeHandle。

(DM) 调用了 HandleType SQL_HANDLE_DBC,并且函数在调用连接的 SQLDisconnect 之前被调用。

(DM) HandleType 参数已SQL_HANDLE_DBC。使用 Handle 调用了一个异步执行函数,调用此函数时该函数仍在执行。

(DM) HandleType 参数已SQL_HANDLE_STMT。SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 使用语句句柄调用,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

(DM) HandleType 参数已SQL_HANDLE_STMT。在语句句柄或关联的连接句柄上调用了异步执行函数,调用此函数时该函数仍在执行。

(DM) HandleType 参数已SQL_HANDLE_DESC。在关联的连接句柄上调用了异步执行函数;调用此函数时, 函数仍在执行。

(DM) 调用 SQLFreeHandle 之前未释放所有附属句柄和其他资源。

(DM) 为与句柄关联的某个语句句柄调用了SQLExecute、SQLExecDirect 或 SQLMoreResults,并将 HandleType 设置为 SQL_HANDLE_STMT 或 SQL_HANDLE_DESC 返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

HY013 内存管理错误 HandleType 参数SQL_HANDLE_STMT或SQL_HANDLE_DESC,并且由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY017 使用自动分配的描述符句柄无效 (DM) Handle 参数已设置为自动分配的描述符的句柄。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) HandleType 参数SQL_HANDLE_STMT,并且驱动程序不是有效的 ODBC 驱动程序。

3.25.SQLFreeStmt

3.25.1.功能描述

SQLFreeStmt停止与特定语句关联的处理、关闭、任何打开的游标,放弃挂起的结果,还可以释放与该语句句柄关联的所有资源。

3.25.2.语法

SQLRETURN SQLFreeStmt(
  SQLHSTMT       StatementHandle,
  SQLUSMALLINT   Option);  

3.25.3.参数

  • StatementHandle

    [输入]语句句柄。

  • Option

    [输入]以下选项之一:

    • SQL_CLOSE:如果定义了一个游标,则关闭与该StatementHandle(关联的游标(如果) 定义),并放弃所有挂起的结果。稍后,应用程序可以使用相同或不同的参数值再次执行 SELECT 语句来重新打开此游标。如果没有打开的游标,则此选项不会影响应用程序。还可以调用SQLCloseCursor 以关闭游标。

    • SQL_DROP:不推荐使用此选项。使用 SQL_DROP 选项的调用 SQLFreeStmt 在驱动程序管理器中映射到SQLFreeHandle。

    • SQL_UNBIND:将 ARD 的 SQL_DESC_COUNT 字段设置为0,释放由 SQLBindCol绑定的针对给定 StatementHandle 的所有列缓冲区。这不取消绑定书签列;为此,"书签" 列ARD 的 "SQL_DESC_DATA_PTR" 字段设置为 NULL。请注意,如果在由多个语句共享的显式分配的描述符上执行此操作,则该操作将影响所有共享描述符的语句的绑定。

    • SQL_RESET_PARAMS:将 APD 的 SQL_DESC_COUNT 字段设置为0,释放由SQLBindParameter 为给定的 StatementHandle 设置的所有参数缓冲区。如果在由多个语句共享的显式分配的描述符上执行此操作,此操作将影响共享该描述符的所有语句的绑定。

3.25.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.25.5.诊断

当 SQLFreeStmt 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLFreeStmt 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLFreeStmt 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLFreeStmt 时仍在执行此异步函数。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在为所有流式处理参数检索数据之前,调用此函数时,选项设置为 SQL_RESET_PARAMS。

(DM) 为 StatementHandle 调用了异步执行函数,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY092 选项类型超出范围 (DM) 为参数选项指定的值不包含:SQL_CLOSE、SQL_DROP 、SQL_UNBIND、 SQL_RESET_PARAMS。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。

3.26.SQLGetCursorName

3.26.1.功能描述

SQLGetCursorName返回与指定语句相关联的游标名称。

3.26.2.语法

SQLRETURN SQLGetCursorName(  
     SQLHSTMT        StatementHandle,  
     SQLCHAR *       CursorName,  
     SQLSMALLINT     BufferLength,  
     SQLSMALLINT *   NameLengthPtr);  

3.26.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CursorName

    [输出]指向缓冲区的指针,将在此缓冲区中返回游标名称。

  • BufferLength

    [输入]*CursorName的长度。

  • NameLengthPtr

    [输出]指向内存的指针,在该内存中要返回可返回到 * CursorName 中的字节总数 (不包括 NULL 终止字符)。如果可返回的字节数大于或等于BufferLength,* CursorName 中的的游标的名称被截断为BufferLength减去 NULL 终止字符的长度。

3.26.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.26.5.诊断

当 SQLGetCursorName 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLGetCursorName 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM) ”位于驱动程序管理器返回的 SQLSTATEs的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLGetCursorName 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区 * CursorName 不够大,无法返回整个游标名称,因此游标名称已被截断。在 *NameLengthPtr 中返回未截断游标名称的长度。(函数返回 SQL_SUCCESS_WITH_INFO。)
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLGetCursorName 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 为 StatementHandle 调用了异步执行函数,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY015 没有可用的游标名称 (DM) 该语句上没有打开的游标,并且没有使用 SQLSetCursorName 设置游标名称。
HY090 字符串或缓冲区长度无效 (DM) 参数 BufferLength 中指定的值小于0。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。

3.27.SQLGetData

3.27.1.功能描述

SQLGetData返回结果集中某一列的数据。可以多次调用它来部分地检索可不定长度的数据。

3.27.2.语法

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

3.27.3.参数

  • StatementHandle

    [输入]语句句柄。

  • Col_or_Param_Num

    [输入]要返回数据的列号。结果集的列按增序从1开始编号。书签列的列号为0。

  • TargetType

    [输入]* TargetValuePtr 缓冲中的 C 数据类型的类型标识符。如果 TargetType是SQL_ARD_TYPE ,驱动使用 ARD 的SQL_DESC_CONCISE_TYPE字段的类型标识符。如果它是SQL_C_DEFAULT,驱动根据源的 SQL数据类型选择缺省的 C 数据类型。

  • TargetValuePtr

    [输出]指向要返回数据的缓冲区的指针。

    TargetValuePtr 不能为 NULL。

  • BufferLength

    [输入]TargetValuePtr所指向缓冲区的长度。

  • StrLen_or_IndPtr

    [输出]一个指针,指向要返回其长度或指示器值的缓冲区。如果这是 null指针,则不返回长度或指示器值。当提取的数据为空时,这将返回错误。

    SQLGetData可以返回长度/指示器缓冲区中的以下值:

    • 可供返回的数据的长度

    • SQL_NO_TOTAL

    • SQL_NULL_DATA

3.27.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。

3.27.5.诊断

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

SQLGetData 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 并非指定列 Col_or_Param_Num 的所有数据都可以在对函数的单个调用中进行检索。SQL_NO_TOTAL 或当前调用 SQLGetData 之前指定列中剩余数据的长度,将在 * StrLen_or_IndPtr 中返回。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S07 小数截断 为一列或多列返回的数据被截断。对于数值数据类型,数值的小数部分被截断。对于包含时间部分的时间、时间戳和间隔数据类型,时间的小数部分将被截断。(函数返回 SQL_SUCCESS_WITH_INFO。)
07006 受限制的数据类型属性冲突 结果集中的列的数据值无法转换为参数 TargetType 指定的 C 数据类型。
07009 描述符索引无效

为参数 Col_or_Param_Num 指定的值为0,而 SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_OFF。

为参数 Col_or_Param_Num 指定的值大于结果集中的列数。

Col_or_Param_Num 值不等于可用的参数的序号。

已绑定指定列 (DM) 。此说明不适用于为 SQLGetInfo 中的 "SQL_GETDATA_EXTENSIONS" 选项返回 SQL_GD_BOUND 位掩码的驱动程序。

(DM) 指定的列数小于或等于最大绑定列号。此说明不适用于为 SQLGetInfo 中的 "SQL_GETDATA_EXTENSIONS" 选项返回 SQL_GD_ANY_COLUMN 位掩码的驱动程序。

(DM) 应用程序已为当前行调用 SQLGetData ;当前调用中指定的列号小于上一调用中指定的列号;而且,驱动程序不会在 SQLGetInfo 中返回 SQL_GETDATA_EXTENSIONS 选项的 SQL_GD_ANY_ORDER 位掩码。

(DM) TargetType 参数已 SQL_ARD_TYPE,并且 ARD 中的 Col_or_Param_Num 描述符记录未通过一致性检查。

(DM) TargetType 参数已 SQL_ARD_TYPE,并且 ARD 的SQL_DESC_COUNT字段中的值小于Col_or_Param_Num参数。

08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
22002 需要但未提供指示器变量 StrLen_or_IndPtr 为 null 指针,并且检索到 null 数据。
22003 数值超出范围 返回 (为列的数值或字符串) 的数值将导致整个 (而不是小数部分) 要截断的数字。
22007 Datetime 格式无效 结果集中的字符列已绑定到 C 日期、时间或时间戳结构,并且列中的值为无效的日期、时间或时间戳。
22012 被零除 返回了导致被零除的算术表达式的值。
22015 间隔字段溢出

从精确数值或间隔 SQL 类型赋值到 interval C 类型会导致前导字段的有效位丢失。

将数据返回到时间间隔 C 类型时,interval C 类型中没有 SQL 类型的值的表示形式。

22018 转换规范的字符值无效

结果集中的字符列已返回到字符 C 缓冲区,列包含的字符在缓冲区的字符集中没有表示形式。

C 类型是精确或近似数字、日期时间或间隔数据类型;列的 SQL 类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。

24000 无效的游标状态

(DM) 调用函数,而无需先调用 SQLFetch 或 SQLFetchScroll 将游标定位到所需的数据行。

(DM) StatementHandle 处于已执行状态,但没有与 StatementHandle 关联的结果集。

已调用 StatementHandle 和 SQLFetch 或 SQLFetchScroll 上打开了游标,但游标位于结果集的开头之前或结果集的结尾之后。

HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY003 程序类型超出范围

(DM) 参数 TargetType 不是有效的数据类型,SQL_C_DEFAULT,SQL_ARD_TYPE (检索列数据时) 或 SQL_APD_TYPE (检索参数数据)。

(DM) 参数 Col_or_Param_Num 为0,并且参数 TargetType 未 SQL_C_BOOKMARK 用于固定长度书签或长度可变的书签的 SQL_C_VARBOOKMARK。

HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle ,然后在 StatementHandle 上再次调用了该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle ,然后在 StatementHandle 上再次调用该函数。

HY009 空值指针的使用无效 (DM) 参数 TargetValuePtr 为 null 指针。
HY010 函数序列错误

(DM) 指定的 StatementHandle 未处于执行状态。调用函数时,无需先调用 SQLExecDirect、 SQLExecute 或 catalog 函数。

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLGetData 函数时,此异步函数仍在执行。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

(DM) StatementHandle 处于已执行状态,但没有与 StatementHandle 关联的结果集。

调用 SQLExeceute、SQLExecDirect 或 SQLMoreResults 的操作返回 SQL_PARAM_DATA_AVAILABLE,但调用 SQLGetData ,而不是 SQLParamData。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 为参数 BufferLength 指定的值小于0。

为参数 BufferLength 指定的值小于4,Col_or_Param_Num 参数设置为0。

HY109 游标位置无效

游标被 SQLSetPos、 SQLFetch、 SQLFetchScroll 或 SQLBulkOperations的位置,而该行已被删除或无法提取。

游标是一个只进游标,行集大小大于1。

HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

驱动程序或数据源不支持在 SQLFetchScroll 中使用具有多个行的 SQLGetData。此说明不适用于为 SQLGetInfo 中的 "SQL_GETDATA_EXTENSIONS" 选项返回 SQL_GD_BLOCK 位掩码的驱动程序。

驱动程序或数据源不支持通过 TargetType 参数和相应列的 SQL 数据类型的组合指定的转换。仅当该列的 SQL 数据类型映射到特定于驱动程序的 SQL 数据类型时,此错误才适用。

参数 TargetType 是以下项之一:SQL_C_NUMERIC SQL_C_SBIGINT SQL_C_UBIGINT。

HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 相对应的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.28.SQLGetDescField

3.28.1.功能描述

SQLGetDescField返回描述符记录的单个字段的当前设置或值。

3.28.2.语法

SQLRETURN SQLGetDescField(
  SQLHDESC        DescriptorHandle,
  SQLSMALLINT     RecNumber,
  SQLSMALLINT     FieldIdentifier,
  SQLPOINTER      ValuePtr,
  SQLINTEGER      BufferLength,
  SQLINTEGER *    StringLengthPtr); 

3.28.3.参数

  • DescriptorHandle

    [输入]描述符句柄。

  • RecNumber

    [输入]指示应用程序从中查找信息的描述符记录。描述符记录从0开始编号,记录号0为书签记录。如果 FieldIdentifier参数指示标头字段,则将忽略 RecNumber。如果 RecNumber 小于或等于 SQL_DESC_COUNT但行不包含列或参数的数据,则对 SQLGetDescField 的调用将返回字段的默认值。

  • FieldIdentifier

    [输入]指示要返回其值的描述符字段。

  • ValuePtr

    [输出]一个指针,指向要在其中返回描述符信息的缓冲区。数据类型取决于 FieldIdentifier 的值。

    如果将 valueptr 是整数类型,应用程序应使用SQLULEN生成的缓冲区并在调用此函数之前将值初始化为0,因为某些驱动程序只能写入缓冲区的较低32位或16位,并使高阶位保持不变。

    如果将 valueptr 为 NULL,则 StringLengthPtr 仍将返回 (排除字符数据的 NULL终止字符之外的总字节数)可在将 valueptr所指向的缓冲区中返回。

  • BufferLength

    [输入]如果FieldIdentifier是一个ODBC定义的字段,而将valueptr指向某个字符串或二进制缓冲区,则此参数的长度应为 * 将 valueptr。如果FieldIdentifier是一个ODBC定义的字段,而 * 将valueptr是一个整数,则将忽略BufferLength。如果在调用SQLGetDescFieldW)时,* 将valueptr中的值为Unicode数据类型,则BufferLength参数必须是偶数。

    如果FieldIdentifier是驱动程序定义的字段,应用程序会通过设置BufferLength参数来指示该字段的特性。BufferLength可具有以下值:

    • 如果*将valueptr是指向字符串的指针,则BufferLength是字符串或SQL_NTS的长度。

    • 如果*将valueptr是一个指向二进制缓冲区的指针,则应用程序将SQL_LEN_BINARY_ATTR(LENGTH)宏的结果放置于BufferLength。这会在BufferLength中置入负值。

    • 如果*将valueptr是一个指向字符串或二进制字符串以外的值的指针,则BufferLength的值应SQL_IS_POINTER。

    • 如果*将valueptr包含固定长度的数据类型,则BufferLength SQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT或SQL_IS_USMALLINT,视情况而定。

  • StringLengthPtr

    [输出]指向缓冲区的指针,将在此缓冲区中返回 null 终止字符所需的字节数排除 *将 valueptr 中可返回的字节数。

3.28.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_NO_DATA 或SQL_INVALID_HANDLE。

如果 RecNumber 大于当前说明符记录数,则返回 SQL_NO_DATA。

如果 DescriptorHandle 是 IRD 句柄,并且该语句处于已准备或已执行状态,但没有打开的游标,则返回SQL_NO_DATA。

3.28.5.诊断

当 SQLGetDescField 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLGetDescField 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)” 位于驱动程序管理器返回的 SQLSTATEs的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLGetDescField 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区 * 将 valueptr 不够大,无法返回整个描述符字段,因此字段被截断。在 *StringLengthPtr 中返回未截断描述符字段的长度。(函数返回 SQL_SUCCESS_WITH_INFO。)
07009 描述符索引无效

(DM) RecNumber 参数等于0,SQL_ATTR_USE_BOOKMARK 语句特性为 SQL_UB_OFF,DESCRIPTORHANDLE 参数为 IRD 句柄。(如果描述符与语句句柄相关联,则只能为显式分配的描述符返回此错误。)

FieldIdentifier 参数是一个记录字段,RecNumber 参数为0,DescriptorHandle 参数是 IPD 句柄。

RecNumber 参数小于0。

08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY007 未准备关联语句 DescriptorHandle 已与 StatementHandle 相关联,但未准备好或未执行关联的语句句柄。
HY010 函数序列错误

(DM) DescriptorHandle 与StatementHandle 相关联,该的异步执行函数 (未调用) 此函数,并且在调用此函数时仍在执行。

(DM) 描述符 Handle 与调用并返回 SQLExecute、SQLExecDirect、SQLBulkOperations 或 SQLSetPos 的 StatementHandle 相关联SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

(DM) 为与 DescriptorHandle 关联的连接句柄调用了异步执行函数。调用 SQLGetDescField 函数时,此异步函数仍在执行。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY021 描述符信息不一致 "SQL_DESC_TYPE" 和 "SQL_DESC_DATETIME_INTERVAL_CODE" 字段不构成有效的 ODBC SQL 类型、适用于 Ipd的特定于驱动程序的有效 SQL 类型或 Apd 或 ARDs 的有效 ODBC C 类型。
HY090 字符串或缓冲区长度无效 (DM) *valueptr 是字符串,BufferLength 小于零。
HY091 描述符字段标识符无效

FieldIdentifier 不是一个 ODBC 定义的字段,并且不是实现定义的值。

未为 DescriptorHandle 定义 FieldIdentifier 。

HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 DescriptorHandle 关联的驱动程序不支持该函数。

3.29.SQLGetDescRec

3.29.1.功能描述

SQLGetDescRec返回描述符记录的多个字段的当前设置或值。返回的字段描述列或参数数据的名称、数据类型和存储。

3.29.2.语法

SQLRETURN SQLGetDescRec(  
      SQLHDESC        DescriptorHandle,  
      SQLSMALLINT     RecNumber,  
      SQLCHAR *       Name,  
      SQLSMALLINT     BufferLength,  
      SQLSMALLINT *   StringLengthPtr,  
      SQLSMALLINT *   TypePtr,  
      SQLSMALLINT *   SubTypePtr,  
      SQLLEN *        LengthPtr,  
      SQLSMALLINT *   PrecisionPtr,  
      SQLSMALLINT *   ScalePtr,  
      SQLSMALLINT *   NullablePtr);  

3.29.3.参数

  • DescriptorHandle

    [输入]描述符句柄。

  • RecNumber

    [输入]指示应用程序从中查找信息的描述符记录。说明符记录的编号为1,记录号0为书签记录。RecNumber 参数必须小于或等于SQL_DESC_COUNT 的值。如果 RecNumber 小于或等于 SQL_DESC_COUNT但行不包含列或参数的数据,则对 SQLGetDescRec的调用将返回字段的默认值。

  • Name

    [输出]指向缓冲区的指针,将在该缓冲区中返回描述符记录的 SQL_DESC_NAME 字段。

    如果 name 为 NULL,则 StringLengthPtr 仍将返回 (排除字符数据的 NULL 终止字符的总字符数)可在按名称指向的缓冲区中返回。

  • BufferLength

    [输入]*name缓冲区的长度。

  • StringLengthPtr

    [输出]指向缓冲区的指针,该缓冲区用于返回名称缓冲区中可返回的数据的字符数 * ,不包括 null 终止字符。如果字符数大于或等于BufferLength,则 Name 中的数据将截断为 * BufferLength 减去 null终止字符的长度,并且由驱动程序以 null 终止。

  • TypePtr

    [输出]指向缓冲区的指针,该缓冲区用于返回描述符记录的 SQL_DESC_TYPE 字段的值。

  • SubTypePtr

    [输出]对于类型为 SQL_DATETIME 或 SQL_INTERVAL 的记录,这是指向要在其中返回SQL_DESC_DATETIME_INTERVAL_CODE 字段值的缓冲区的指针。

  • LengthPtr

    [输出]指向缓冲区的指针,该缓冲区用于返回描述符记录的 SQL_DESC_OCTET_LENGTH 字段的值。

  • PrecisionPtr

    [输出]指向缓冲区的指针,该缓冲区用于返回描述符记录的 SQL_DESC_PRECISION 字段的值。

  • ScalePtr

    [输出]指向缓冲区的指针,该缓冲区用于返回描述符记录的 SQL_DESC_SCALE 字段的值。

  • NullablePtr

    [输出]指向缓冲区的指针,该缓冲区用于返回描述符记录的 SQL_DESC_NULLABLE 字段的值。

3.29.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_NO_DATA 或SQL_INVALID_HANDLE。

如果 RecNumber 大于当前说明符记录数,则返回 SQL_NO_DATA。

如果 DescriptorHandle 是 IRD 句柄,并且该语句处于已准备或已执行状态,但没有打开的游标,则返回SQL_NO_DATA。

3.29.5.诊断

当 SQLGetDescRec 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_DESC 和 DescriptorHandle 的句柄调用 SQLGetDiagRec 来获取关联的 SQLSTATE 值。下表列出了通常由 SQLGetDescRec 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)” 位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLGetDescRec 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区*name不够大,无法返回整个描述符字段。因此,该字段已被截断。在 *StringLengthPtr 中返回未截断描述符字段的长度。(函数返回 SQL_SUCCESS_WITH_INFO。)
07009 描述符索引无效

FieldIdentifier 参数是一个记录字段,RecNumber 参数设置为0,DescriptorHandle 参数是 IPD 句柄。

(DM) RecNumber 参数设置为0,SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_OFF,并且 DESCRIPTORHANDLE 参数为 IRD 句柄。

RecNumber 参数小于0。

08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY007 未准备关联语句 DescriptorHandle 与 IRD 相关联,并且关联的语句句柄未处于已准备或已执行状态。
HY010 函数序列错误

(DM) DescriptorHandle 与一个 StatementHandle 相关联,该的异步执行函数 (未调用) 此函数,并且在调用此函数时仍在执行。

(DM) DescriptorHandle 与已调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 StatementHandle 相关联,并 SQL_NEED_DATA 返回。在为所有执行时数据参数或列发送数据之前,将调用此函数。

(DM) 为与 DescriptorHandle 关联的连接句柄调用了异步执行函数。调用 SQLGetDescRec 时仍在执行此异步函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 DescriptorHandle 关联的驱动程序不支持该函数。

3.30.SQLGetDiagField

3.30.1.功能描述

SQLGetDiagField 返回诊断数据结构的记录字段的当前值,与包含错误、警告和状态信息的指定句柄相关联。

3.30.2.语法

SQLRETURN SQLGetDiagField(
  SQLSMALLINT     HandleType,
  SQLHANDLE       Handle,
  SQLSMALLINT     RecNumber,
  SQLSMALLINT     DiagIdentifier, 
  SQLPOINTER      DiagInfoPtr,
  SQLSMALLINT     BufferLength,
  SQLSMALLINT *   StringLengthPtr);  

3.30.3.参数

  • HandleType

    [输入]一个句柄类型标识符,描述需要诊断的句柄的类型。必须是下列选项之一:

    • SQL_HANDLE_DBC

    • SQL_HANDLE_DBC_INFO_TOKEN

    • SQL_HANDLE_DESC

    • SQL_HANDLE_ENV

    • SQL_HANDLE_STMT

    SQL_HANDLE_DBC_INFO_TOKEN 句柄仅由驱动程序管理器和驱动程序使用。应用程序不应使用此句柄类型。

  • Handle

    [输入]HandleType 指示的类型的诊断数据结构的句柄。如果 SQL_HANDLE_ENV HandleType,则句柄可以是共享或非共享环境句柄。

  • RecNumber

    [输入]指示应用程序从中查找信息的状态记录。状态记录从1开始编号。如果 DiagIdentifier参数指示诊断标头的任何字段,则将忽略 RecNumber 。如果不是,则它应大于0。

  • DiagIdentifier

    [输入]指示要返回其值的诊断字段。

  • DiagInfoPtr

    [输出]输出指向要返回诊断信息的缓冲区的指针。数据类型取决于 DiagIdentifier 的值。如果 DiagInfoPtr是整数类型,则在调用此函数之前,应用程序应使用 sqlulen生成的缓冲区并将值初始化为0,因为某些驱动程序只能写入缓冲区中的较低32位或16位,并使高阶位保持不变。

    如果 DiagInfoPtr 为 NULL,则 StringLengthPtr 仍将返回 (排除字符数据的 NULL终止字符之外的总字节数) 可在 DiagInfoPtr 所指向的缓冲区中返回。

  • BufferLength

    [输入]如果 DiagIdentifier 是一个 ODBC 定义的诊断,并且 DiagInfoPtr指向某个字符串或二进制缓冲区,则此参数的长度应为 *DiagInfoPtr。如果 DiagIdentifier 是一个 ODBC 定义的字段,而 *DiagInfoPtr 是一个整数,则将忽略 BufferLength。如果在调用 SQLGetDiagFieldW)时, *DiagInfoPtr 中的值为 Unicode 字符串,则 BufferLength 参数必须是偶数。

    如果 DiagIdentifier 是驱动程序定义的字段,应用程序会通过设置 BufferLength 参数来指示该字段的特性。BufferLength 可具有以下值:

    • 如果 DiagInfoPtr 是指向字符串的指针,则 BufferLength 是字符串或 SQL_NTS 的长度。

    • 如果 DiagInfoPtr是一个指向二进制缓冲区的指针,则应用程序将SQL_LEN_BINARY_ATTR(LENGTH)宏的结果放置于BufferLength。这会在BufferLength 中置入负值。

    • 如果 DiagInfoPtr 是一个指向字符串或二进制字符串以外的其他值的指针,则 BufferLength 的值应SQL_IS_POINTER。

    • 如果 * DiagInfoPtr 包含固定 长度的数据类型,则相应地SQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT 或SQL_IS_USMALLINT。

  • StringLengthPtr

    [输出]指向缓冲区的指针,该缓冲区返回的字节总数 (不包括 null 终止字符) 可在 DiagInfoPtr 中返回的字节数 *(对于字符数据)。如果可返回的字节数大于或等于 BufferLength,则 DiagInfoPtr 中的文本将被截断为 *BufferLength 减去 null 终止字符的长度。

3.30.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_INVALID_HANDLE 或SQL_NO_DATA。

3.30.5.诊断

SQLGetDiagField 不会为自身发布诊断记录。它使用以下返回值报告其自身执行的结果:

  • SQL_SUCCESS:函数已成功返回诊断信息。

  • SQL_SUCCESS_WITH_INFO:* DiagInfoPtr 太小,无法容纳请求的诊断字段。因此,诊断字段中的数据被截断。若要确定是否发生了截断,应用程序必须将BufferLength 与可用的实际字节数(写入*StringLengthPtr)进行比较。

  • SQL_INVALID_HANDLE: HandleType 和句柄指示的句柄不是有效的句柄。

  • SQL_ERROR:发生以下情况之一:

  • DiagIdentifier 参数不是有效值之一。

  • DiagIdentifier 参数SQL_DIAG_CURSOR_ROW_COUNT、SQL_DIAG_DYNAMIC_FUNCTION、SQL_DIAG_DYNAMIC_FUNCTION_CODE 或 SQL_DIAG_ROW_COUNT,但句柄不是语句句柄。(驱动程序管理器返回此诊断。)

  • 当 DiagIdentifier 指示诊断记录中的字段时 ,RecNumber 参数为负数或0。对于标头字段,将忽略RecNumber 。

  • 请求的值为字符串,BufferLength 小于零。

  • 使用异步通知时,句柄上的异步操作不完整。

  • SQL_NO_DATA:RecNumber 大于在 handle中指定的句柄所存在的诊断记录数。如果没有适用于句柄的诊断记录,该函数还将为任何正RecNumber 返回 SQL_NO_DATA。

3.31.SQLGetDiagRec

3.31.1.功能描述

SQLGetDiagRec返回包含错误、警告和状态信息的诊断记录的多个字段的当前值。不同于SQLGetDiagField,后者每次调用返回一个诊断字段,SQLGetDiagRec将返回诊断记录的几个常用字段,包括 SQLSTATE、本机错误代码和诊断消息文本。

3.31.2.语法

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

3.31.3.参数

  • HandleType

    [输入]一个句柄类型标识符,描述需要诊断的句柄的类型。必须是下列选项之一:

    • SQL_HANDLE_DBC

    • SQL_HANDLE_DBC_INFO_TOKEN

    • SQL_HANDLE_DESC

    • SQL_HANDLE_ENV

    • SQL_HANDLE_STMT

    SQL_HANDLE_DBC_INFO_TOKEN句柄仅由驱动程序管理器和驱动程序使用。应用程序不应使用此句柄类型。

  • Handle

    [输入]诊断数据结构的句柄,其类型由HandleType来指出。如果HandleType是SQL_HANDLE_ENV,Handle可以是共享的或非共享的环境句柄。

  • RecNumber

    [输入]指示应用程序从中查找信息的状态记录。状态记录从1开始编号。

  • SQLState

    [输出]指向缓冲区的指针,该缓冲区存储着有关RecNumber的五字符的SQLSTATE码。

  • NativeErrorPtr

    [输出]指向缓冲区的指针,该缓冲区用于返回特定于数据源的本机错误代码。此信息包含在 SQL_DIAG_NATIVE诊断字段中。

  • MessageText

    [输出]指向要返回诊断消息文本字符串的缓冲区的指针。此信息包含在 SQL_DIAG_MESSAGE_TEXT诊断字段中。

  • BufferLength

    [输入]*MessageText的长度。

  • TextLengthPtr

    [输出]指向缓冲区的指针,返回MessageText中的字节总数。如果返回字节数大于BufferLength,则MessageText中的诊断信息文本被截断成BufferLength减去NULL结尾字符的长度。

3.31.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.31.5.诊断

  • SQL_SUCCESS:函数已成功返回诊断信息。

  • SQL_SUCCESS_WITH_INFO:* MessageText 缓冲区太小,无法容纳请求的诊断消息。未生成任何诊断记录。若要确定是否发生了截断,应用程序必须将 BufferLength 与可用的实际字节数(写入 *TextLengthPtr)进行比较。

  • SQL_INVALID_HANDLE: HandleType 和句柄指示的句柄不是有效的句柄。

  • SQL_ERROR:发生以下情况之一:

  • RecNumber 为负数或0。

  • BufferLength 小于零。

  • 使用异步通知时,句柄上的异步操作不完整。

  • SQL_NO_DATA:RecNumber 大于在 handle中指定的句柄所存在的诊断记录数。如果没有适用于句柄的诊断记录,该函数还将为任何正RecNumber 返回 SQL_NO_DATA。

3.32.SQLGetFunctions

3.32.1.功能描述

SQLGetFunctions返回有关驱动程序是否支持特定 ODBC函数的信息。此函数在驱动程序管理器中实现,还可以在驱动程序中实现。如果驱动程序实现SQLGetFunctions,驱动程序管理器将调用驱动程序中的函数;否则它将执行函数本身。

3.32.2.语法

SQLRETURN SQLGetFunctions(  
     SQLHDBC           ConnectionHandle,  
     SQLUSMALLINT      FunctionId,  
     SQLUSMALLINT *    SupportedPtr);  

3.32.3.参数

  • ConnectionHandle

    [输入]连接句柄。

  • FunctionId

    [输入]函数标识 #define ODBC函数的一个值;SQL_API_ODBC3_ALL_FUNCTIONS 或SQL_API_ALL_FUNCTIONS。

  • SupportedPtr

    [输出]函数指针如果FunctionId标识单个ODBC函数,SupportedPtr将指向单个SQLUSMALLINT值SQL_TRUE,如果驱动程序支持指定函数,则指向SQL_FALSE。

    如果FunctionId SQL_API_ODBC3_ALL_FUNCTIONS,SupportedPtr将指向一个SQLSMALLINT数组,该数组具有多个等于SQL_API_ODBC3_ALL_FUNCTIONS_SIZE。如果为FunctionId SQL_API_ALL_FUNCTIONS,SupportedPtr将指向包含100个元素的SQLUSMALLINT数组。该数组由FunctionId #define 标识每个ODBC函数的一些索引;数组的一些元素未使用并保留供将来使用。

    如果SQL_FALSE标识驱动程序不支持的 ODBC 函数,或者未标识 ODBC 函数,则不支持此参数。

    SupportedPtr 中返回的数组使用从零开始编制索引。

3.32.4.返回值

SQL_SUCCESS SQL_SUCCESS_WITH_INFO、SQL_ERROR或SQL_INVALID_HANDLE。

3.32.5.诊断

当 SQLGetFunctions 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_DBC 的 HandleType 和 ConnectionHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLGetFunctions 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为“(DM)” 位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLGetFunctions 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误

(SQLConnect) SQLBrowseConnect 或 SQLDriverConnect 之前调用了 DM 函数。

(CONNECTIONHandle) 调用了 SQLBrowseConnect 的 DM SQL_NEED_DATA。在 SQLBrowseConnect 返回 SQL_SUCCESS_WITH_INFO 或 SQL_SUCCESS。

为 ConnectionHandle) 调用了 SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY095 函数类型范围外 (DM) 指定了无效的 FunctionId 值。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。

3.33.SQLGetInfo

3.33.1.功能描述

SQLGetInfo返回与连接关联的驱动程序和数据源的常规信息。

3.33.2.语法

SQLRETURN SQLGetInfo(  
     SQLHDBC         ConnectionHandle,  
     SQLUSMALLINT    InfoType,  
     SQLPOINTER      InfoValuePtr,  
     SQLSMALLINT     BufferLength,  
     SQLSMALLINT *   StringLengthPtr);  

3.33.3.参数

  • ConnectionHandle

    [输入]连接句柄。

  • InfoType

    [输入]信息类型。

  • InfoValuePtr

    [输出]一个缓冲区的指针,此缓冲区用于存放返回的信息。根据请求的 InfoType, 返回的信息将是下列信息之一:以 null结尾的字符串、SQLUSMALLINT 值、SQLUINTEGER 位掩码、SQLUINTEGER标志、SQLUINTEGER 二进制值或 SQLULEN 值。

    如果 InfoType 参数是SQL_DRIVER_HDESC或SQL_DRIVER_HSTMT, 则 InfoValuePtr参数既是输入参数,也是输出参数。

    如果 InfoValuePtr 为 NULL,则 StringLengthPtr 将返回总字节数 (不包括字符数据),在InfoValuePtr 指向的缓冲区中返回的字符数据 null 终止字符。

  • BufferLength

    [输入]* InfoValuePtr缓冲区的长度。如果 * InfoValuePtr中的值不是字符串,或者InfoValuePtr 是 null 指针,则忽略BufferLength 参数。驱动程序假定 * InfoValuePtr 的大小是 SQLUSMALLINT 或SQLUINTEGER,基于 InfoType。如果在调用 SQLGetInfo时,*InfoValuePtr是Unicode字符串,则 BufferLength参数必须是一个偶数;否则,将返回 SQLSTATE HY090(无效的字符串或缓冲区长度) 。

  • StringLengthPtr

    [输出]指向缓冲区的指针,此缓冲区用于存放 *InfoValuePtr 中返回的字节总数 (对于字符数据,不包括空值终止字符)。

    对于字符数据,如果可返回的字节数大于或等于 BufferLength,则 *InfoValuePtr 中的信息将截断为BufferLength 字节减去 null 终止字符的长度,并且由驱动程序以 null 终止。

    对于所有其他类型的数据,BufferLength 的值将被忽略,驱动程序假定 * InfoValuePtr 的大小为SQLUSMALLINT 或 SQLUINTEGER,具体取决于 InfoType。

3.33.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.33.5.诊断

当 SQLGetInfo 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_DBC 的 HandleType 和 ConnectionHandle 句柄的 SQLGetDiagRec来获取关联的SQLSTATE 值。下表列出了 SQLGetInfo 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLGetInfo 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区 * InfoValuePtr 不够大,无法返回所有请求的信息。因此,信息被截断。所请求信息的长度(其未标识形式)在 StringLengthPtr 中返回。(函数返回 SQL_SUCCESS_WITH_INFO。)
08003 连接未打开 (DM) InfoType 中请求的信息类型需要打开连接。在 ODBC 保留的信息类型中,SQL_ODBC_VER打开连接的情况下才能返回这些类型
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误 (调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM 代码,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY024 属性值无效

(DM) InfoType 参数SQL_DRIVER_HSTMT, 并且 InfoValuePtr 指向的值不是有效的语句句柄。

(DM) InfoType 参数SQL_DRIVER_HDESC, 并且 InfoValuePtr 指向的值不是有效的描述符句柄。

HY090 字符串或缓冲区长度无效

(DM) BufferLength 参数指定的值小于 0。

(DM) BufferLength 指定的值为奇数,*InfoValuePtr 为 Unicode 数据类型。

HY096 信息类型范围外 为参数 InfoType 指定的值对于驱动程序支持的 ODBC 版本无效。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选字段 为自变量 InfoType 指定的 值是驱动程序不支持的特定于驱动程序的值。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) ConnectionHandle 对应的驱动程序不支持函数。

3.34.SQLGetTypeInfo

3.34.1.功能描述

SQLGetTypeInfo返回有关数据源支持的数据类型的信息。驱动程序以 SQL结果集的形式返回该信息。数据类型用于数据定义语言(DDL)语句中。

3.34.2.语法

SQLRETURN SQLGetTypeInfo(
  SQLHSTMT      StatementHandle,  
  SQLSMALLINT   DataType);  

3.34.3.参数

  • StatementHandle

    [输入]结果集的语句句柄。

  • DataType

    [输入]SQL 数据类型,SQL_ALL_TYPES 指定应返回有关所有数据类型的信息。

3.34.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.34.5.诊断

SQLGetTypeInfo 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 由于实现工作条件,指定的语句特性无效,因此临时替换相似的值。(调用 SQLGetStmtAttr 来确定暂时替换的值。) 替换值对 StatementHandle 有效,直到关闭游标。可以更改的语句属性有: SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、 SQL_ATTR_KEYSET_SIZE、SQL_ATTR_MAX_LENGTH、 SQL_ATTR_MAX_ROWS、SQL_ATTR_QUERY_TIMEOUT 和 SQL_ATTR_SIMULATE_CURSOR。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标 ,并且调用了 SQLFetch 或 SQLFetchScroll 。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA,驱动程序管理器将返回此错误,如果 SQLFetch 或 SQLFetchScroll 已 SQL_NO_DATA 返回,则由驱动程序返回。

已在 StatementHandle 上打开一个结果集,但尚未调用 SQLFetch 或 SQLFetchScroll 。

40001 序列化失败 由于另一个事务发生了资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数期间关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY004 SQL 数据类型无效 为参数数据类型指定的值既不是有效的 ODBC SQL 数据类型标识符,也不是驱动程序支持的特定于驱动程序的数据类型标识符。
HY008 操作已取消

已为 StatementHandle 启用异步处理,然后在完成执行之前调用了函数,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数在完成执行之前被调用,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLGetTypeInfo 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 相对应的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。

3.35.SQLMoreResults

3.35.1.功能描述

SQLMoreResults确定是否在包含SELECTUPDATEINSERTDELETE的语句上提供更多结果,如果是,则对这些结果初始化处理。

3.35.2.语法

SQLRETURN SQLMoreResults(
  SQLHSTMT     StatementHandle);  

3.35.3.参数

  • StatementHandle

    [输入]语句句柄。

3.35.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_NO_DATA、SQL_ERROR、SQL_INVALID_HANDLE 或 SQL_PARAM_DATA_AVAILABLE。

3.35.5.诊断

当 SQLMoreResults 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLMoreResults 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLMoreResults 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 处理批处理时,语句属性的值已更改。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
40001 序列化失败 由于另一个事务发生了资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数期间关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。SQLMoreResults 函数在完成执行前调用,在 StatementHandle 上调用 SQLCancel 或 SQLCancelHandle 。然后,在 StatementHandle 上再次调用 SQLMoreResults 函数。

SQLMoreResults 函数在完成执行之前调用,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLMoreResults 函数时,此异步函数仍在执行。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.36.SQLNativeSql

3.36.1.功能描述

SQLNativeSql返回驱动程序修改的 SQL 字符串。SQLNativeSql 不执行 SQL 语句。

3.36.2.语法

SQLRETURN SQLNativeSql(  
     SQLHDBC        ConnectionHandle,  
     SQLCHAR *      InStatementText,  
     SQLINTEGER     TextLength1,  
     SQLCHAR *      OutStatementText,  
     SQLINTEGER     BufferLength,  
     SQLINTEGER *   TextLength2Ptr);  

3.36.3.参数

  • ConnectionHandle

    [输入]连接句柄。

  • InStatementText

    [输入]要转换的SQL文本字符串。

  • TextLength1

    [输入]InStatementText文本字符串的长度。

  • OutStatementText

    [输出]指向缓冲区的指针,该缓冲区用于返回已翻译的 SQL 字符串。

    如果 OutStatementText 为 NULL,则TextLength2Ptr将返回除 null 终止字符以外的字符总数,可在OutStatementText 所指向的缓冲区中返回。

  • BufferLength

    [输入]OutStatementText缓冲区中的字符数。如果在调用SQLNativeSqlW时,*InStatementText中返回的值为Unicode字符串,则 BufferLength参数必须是偶数。

  • TextLength2Ptr

    [输出]指向缓冲区的指针,将在此缓冲区中返回OutStatementText中的除null终止字符以外的字符总数。如果可返回的字符数大于或等于BufferLength,则 OutStatementText 中的已转换SQL 字符串将截断为 BufferLength 减去null 终止字符的长度。

3.36.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.36.5.诊断

当 SQLNativeSql 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_DBC 和 ConnectionHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLNativeSql 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLNativeSql 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 缓冲区 * OutStatementText 不够大,无法返回整个 SQL 字符串,因此 SQL 字符串被截断。在 *TextLength2Ptr 中返回未截断 SQL 字符串的长度。(函数返回 SQL_SUCCESS_WITH_INFO。)
08003 连接未打开 ConnectionHandle 未处于已连接状态。
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
22007 Datetime 格式无效 *InStatementText 包含一个转义子句,该子句具有无效的日期、时间或时间戳值。
24000 无效的游标状态 语句中引用的游标位于结果集的开头之前或结果集结束之后。具有本机 DBMS 游标实现的驱动程序可能不返回此错误。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY009 空值指针的使用无效 (DM) *InStatementText 为 null 指针。
HY010 函数序列错误 (DM) 为 ConnectionHandle 调用了异步执行函数,并且在调用此函数时仍在执行。
HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 参数 TextLength1 小于0,但不等于 SQL_NTS。

(DM) 参数 BufferLength 小于0,而参数 OutStatementText 不是 null 指针。

HY109 游标位置无效 游标的当前行已被删除或尚未提取。具有本机 DBMS 游标实现的驱动程序可能不返回此错误。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 ConnectionHandle 关联的驱动程序不支持该函数。

3.37.SQLNumParams

3.37.1.功能描述

SQLNumParams返回 SQL 语句中参数的数目。

3.37.2.语法

SQLRETURN SQLNumParams(
  SQLHSTMT        StatementHandle,
  SQLSMALLINT *   ParameterCountPtr);  

3.37.3.参数

  • StatementHandle

    [输入]语句句柄。

  • ParameterCountPtr

    [输出]指向缓冲区的指针,将在此缓冲区中返回语句中的参数个数。

3.37.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.37.5.诊断

当 SQLNumParams 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联SQLSTATE 值。下表列出了通常由 SQLNumParams 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLNumParams 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。SQLNumParams 函数在完成执行前调用,在 StatementHandle 上调用 SQLCancel 或 SQLCancelHandle ;然后,在 StatementHandle 中再次调用 SQLNumParams 函数。

或者,在执行完 SQLNumParams 函数之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM)在为 StatementHandle 调用 SQLPrepare 或 SQLExecDirect 之前调用了函数。

(DM)为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLNumParams 函数时,此异步函数仍在执行。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM)为 StatementHandle 调用 SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置, SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM)与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.38.SQLParamData

3.38.1.功能描述

SQLParamData与SQLPutData一起用于在语句执行时提供参数数据,使用 SQLGetData 检索输出参数数据。

3.38.2.语法

SQLRETURN SQLParamData(
  SQLHSTMT       StatementHandle, 
  SQLPOINTER *   ValuePtrPtr);

3.38.3.参数

  • StatementHandle

    [输入]语句句柄。

  • ValuePtrPtr

    [输出]指向某个缓冲区的指针,该缓冲区用于返回在 SQLBindParameter 中为参数数据指定的ParameterValuePtr 缓冲区的地址 SQL_DESC_DATA_PTR,或者在 SQLBindCol中为列数据)指定的TargetValuePtr缓冲区的地址。

3.38.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR、SQL_INVALID_HANDLE 或 SQL_PARAM_DATA_AVAILABLE。

3.38.5.诊断

当 SQLParamData 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLParamData 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)”位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLParamData 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
07006 受限制的数据类型属性冲突

绑定参数的 SQLBindParameter 中的 ValueType 参数标识的数据值无法转换为 SQLBindParameter 中 ParameterType 参数所标识的数据类型。

为绑定为 SQL_PARAM_INPUT_OUTPUT 或 SQL_PARAM_OUTPUT 的参数返回的数据值无法转换为 SQLBindParameter 中 ValueType 参数标识的数据类型。

如果一个或多个行的数据值无法转换,但已成功返回一个或多个行,则此函数将返回 SQL_SUCCESS_WITH_INFO。

08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
22026 字符串数据,长度不匹配

SQLGetInfo 中的 SQL_NEED_LONG_DATA_LEN 信息类型为 "Y",为长参数发送了较少的数据 (数据类型为 SQL_LONGVARCHAR、SQL_LONGVARBINARY 或长数据源特定的数据类型) 与 SQLBindParameter 中的 StrLen_or_IndPtr 参数一起指定。

SQLGetInfo 中的 SQL_NEED_LONG_DATA_LEN 信息类型为"Y",为长列发送了较少的数据 (数据类型为 SQL_LONGVARCHAR、SQL_LONGVARBINARY 或长数据源特定的数据类型) ,该数据类型与使用 SQLBulkOperations 添加或更新的数据行中的列相对应,或使用 SQLSetPos 进行更新。

40001 序列化失败 由于另一个事务发生资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle;然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 之前的函数调用不是对在其中 SQL_NEED_DATA 了返回代码的 SQLExecDirect、 SQLExecute、 SQLBulkOperations 或 SQLSetPos 的调用,或者以前的函数调用是对 SQLPutData 的调用。

以前的函数调用是对 SQLParamData 的调用。

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLParamData 函数时,此异步函数仍在执行。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

为 StatementHandle 调用了 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用 SQLCancel 。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限 通过 SQLSetConnectAttr 设置, SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 相对应的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.39.SQLPrepare

3.39.1.功能描述

SQLPrepare准备要执行的SQL字符串。

3.39.2.语法

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

3.39.3.参数

  • StatementHandle

    [输入]语句句柄。

  • StatementText

    [输入]SQL文本字符串。

  • TextLength

    [输入]*StatementText 的长度(以字节为单位)。

3.39.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.39.5.诊断

当 SQLPrepare 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLPrepare 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLPrepare 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 由于实现工作环境,指定的语句属性无效,因此暂时替换了类似的值。(SQLGetStmtAttr 来确定暂时替换的值是什么。) 替换值对 StatementHandle 有效,直到游标关闭。可更改的语句属性包括:SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、SQL_ATTR_KEYSET_SIZE、SQL_ATTR_MAX_LENGTH、SQL_ATTR_MAX_ROWS、SQL_ATTR_QUERY_TIMEOUT、SQL_ATTR_SIMULATE_CURSOR。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
21S01 插入值列表与列列表不匹配 *StatementText 包含INSERT语句,要插入的值数与派生表的程度不匹配。
21S02 派生表的程度与列表不匹配 *StatementText 包含CREATE VIEW语句,并且指定的名称数与查询规范定义的派生表不同。
22018 强制转换规范的字符值无效 *StatementText 包含SQL文本或参数的语句,并且该值与关联的表列的数据类型不兼容。
22019 转义字符无效 Argument StatementText 在WHERE子句中包含具有 ESCAPE 的LIKE谓词,并且 ESCAPE 后转义字符的长度不等于 1。
22025 转义序列无效 Argument StatementText 在WHERE子句中包含 “LIKE模式值 ESCAPE 转 义字符”,模式值中的转义字符后的字符既不是“%”也不是“_”。
24000 游标状态无效

(DM)在 StatementHandle 上打开游标,并且已调用 SQLFetch 或 SQLFetchScroll。

游标已在 StatementHandle 上打开,但 SQLFetch 或 SQLFetchScroll 尚未调用。

34000 游标名称无效 *StatementText 包含定位的DELETE或定位的UPDATE,并且正在准备的语句引用的游标未打开。
3D000 目录名称无效 StatementText 中指定的目录名称无效。
3F000 模式名称无效 StatementText 中指定的模式名称无效。
42000 语法错误或访问冲突

*StatementText 包含SQL语句,该语句不可准备或包含语法错误。

*StatementText 包含用户没有所需权限的语句。

42S01 基表或视图已存在 *StatementText包含CREATE TABLECREATE VIEW语句,并且指定的表名或视图名称已存在。
42S02 找不到基表或视图

*StatementText 包含DROP TABLEDROP VIEW语句,并且指定的表名或视图名称不存在。

*StatementText 包含ALTER TABLE语句,并且指定的表名不存在。

*StatementText 包含CREATE VIEW语句,并且查询规范定义的表名或视图名称不存在。

*StatementText 包含CREATE INDEX语句,并且指定的表名不存在。

*StatementText 包含GRANTREVOKE语句,并且指定的表名或视图名称不存在。

*StatementText 包含SELECT语句,并且指定的表名或视图名称不存在。

*StatementText 包含DELETEINSERTUPDATE语句,并且指定的表名称不存在。

*StatementText 包含CREATE TABLE语句,并且约束中指定的(引用所创建的表) 表不存在。

42S11 索引已存在 *StatementText 包含CREATE INDEX语句,并且指定的索引名称已存在。
42S12 找不到索引 *StatementText 包含DROP INDEX, 并且指定的索引名称不存在。
42S21 列已存在 *StatementText 包含ALTER TABLE语句,并且ADD子句中指定的列不唯一或标识基表中的现有列。
42S22 找不到列

*StatementText 包含CREATE INDEX语句,并且列列表中指定的一个或多个列名不存在。

*StatementText 包含GRANTREVOKE语句,并且指定的列名不存在。

*StatementText 包含SELECTDELETEINSERTUPDATE语句,并且指定的列名不存在。

*StatementText 包含CREATE TABLE语句,以及约束语句中指定的 (引用所创建的表) 不存在的表。

HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。*MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

为 StatementHandle 启用了异步处理。调用了函数,在函数完成执行之前,在 StatementHandle 上调用 SQLCancel 或 SQLCancelHandle, 然后在 StatementHandle 上再次调用该函数。

调用了函数,在函数完成执行之前,从多线程应用程序中的不同线程对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle。

HY009 null 指针的使用无效 (DM) StatementText 为空指针。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLPrepare 函数时,此异步函数仍在执行。

(调用) SqlExecute、SQLExecDirect 或 SQLMoreResults 的 DM,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM) 异步执行的函数 (不是此函数) StatementHandle 调用,并且仍在调用此函数时执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效 (DM) TextLength 参数小于或等于 0,但不等于 SQL_NTS。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能

并发设置对于定义的游标类型无效。

SQL_ATTR_USE_BOOKMARKS语句属性设置为 SQL_UB_VARIABLE,SQL_ATTR_CURSOR_TYPE 语句属性设置为驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回结果集之前超时期限已过。超时期限通过 SQLSetStmtAttr、SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。

3.40.SQLPrimaryKeys

3.40.1.功能描述

SQLPrimaryKeys返回表主键的列名。驱动程序将信息作为结果集返回。这个函数不支持在单一调用中返回多表的主键。

3.40.2.语法

SQLRETURN SQLPrimaryKeys(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      CatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      SchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      TableName,  
     SQLSMALLINT    NameLength3);  

3.40.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CatalogName

    [输入]目录名称。如果驱动程序支持某些表的目录,但不支持其他表的目录,例如:当驱动程序从不同的DBMS中检索数据时,空字符串("")表示没有目录的表。CatalogName 不能包含字符串搜索模式。

    如果将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 CatalogName将被视为标识符,其大小写没有意义。如果为 SQL_FALSE, 则 CatalogName为普通参数;它按字面处理,其大小写显著。

  • NameLength1

    [输入]CatalogName 的长度。

  • SchemaName

    [输入]模式名称。如果驱动程序支持某些表的模式,但不支持其他表的模式,例如,当驱动程序从不同的 DBMS 中检索数据时,空字符串("") 表示没有模式的表。SchemaName 不能包含字符串搜索模式。

    如果将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE,则 SchemaName将被视为标识符,其大小写不明显。如果为 SQL_FALSE,则 SchemaName为普通参数;它按字面处理,其大小写不显著。

  • NameLength2

    [输入]SchemaName 的长度。

  • TableName

    [输入]表名。此参数不能为 null 指针。TableName 不能包含字符串搜索模式。

    如果将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE,则 TableName将被视为标识符,其大小写没有意义。如果为 SQL_FALSE,则 TableName为普通参数;它按字面处理,其大小写不显著。

  • NameLength3

    [输入]TableName 的长度。

3.40.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.40.5.诊断

当 SQLPrimaryKeys 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLPrimaryKeys 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为" (DM) "位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLPrimaryKeys 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
24000 游标状态无效

(DM) 在 StatementHandle 上打开游标,并且已调用 SQLFetch 或 SQLFetchScroll。

游标已在 StatementHandle 上打开,但 SQLFetch 或 SQLFetchScroll 尚未调用。

40001 序列化失败 由于资源与另一个事务发生死锁,事务已回滚。
40003 语句完成未知 在执行此函数期间,关联的连接失败,无法确定事务的状态。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区 中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

为 StatementHandle 启用了异步处理。调用了函数,在函数完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用函数。

调用了函数,在函数完成执行之前,从多线程应用程序中的不同线程对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle。

HY009 null 指针的使用无效

(DM) TableName 参数为空指针。

SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE,CatalogName 参数为 null 指针,具有 SQL_CATALOG_NAME 信息类型的 SQLGetInfo 返回支持目录名称。

(DM) 将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE,SchemaName 参数为 null 指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLPrimaryKeys 函数时,此异步函数仍在执行。

(调用) SqlExecute、SQLExecDirect 或 SQLMoreResults 的 DM,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM) 异步执行的函数 (不是此函数) StatementHandle 调用,并且仍在调用此函数时执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect、SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效

(DM) 名称长度参数之一的值小于 0 但不等于 SQL_NTS,并且关联的名称参数不是空指针。

其中一个名称长度参数的值超出了相应名称的最大长度值。

HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

指定了一个目录,但该驱动程序或数据源不支持目录。

指定了模式,但驱动程序或数据源不支持模式。

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回请求的结果集之前,超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.41.SQLProcedure

3.41.1.功能描述

SQLProcedure返回存储在特定数据源中的过程名称的列表。Procedure是一种通用术语,用于描述可执行对象或可使用输入和输出参数调用的命名实体。

3.41.2.语法

SQLRETURN SQLProcedure(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      CatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      SchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      ProcName,  
     SQLSMALLINT    NameLength3);  

3.41.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CatalogName

    [输入]如果驱动程序为某些表支持目录,而不是其他表目录,例如当驱动程序从不同 Dbms 检索不同 Dbms 的数据时,则空字符串("") 表示这些表没有目录。CatalogName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 CatalogName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 CatalogName是普通参数;它按原义处理,其大小写有意义。

  • NameLength1

    [输入]*CatalogName中的字符的长度。

  • SchemaName

    [输入]过程模式名称的字符串搜索模式。如果驱动程序支持某些过程的模式,而不支持其他过程的模式,例如当驱动程序从不同 DBMS检索数据时,空字符串( "" ) 表示不具有模式的那些过程。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 SchemaName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 SchemaName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength2

    [输入]*SchemaName中的字符的长度。

  • ProcName

    [输入]过程名称的字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 ProcName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 ProcName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength3

    [输入]*ProcName中的字符的长度。

3.41.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.41.5.诊断

当 SQLProcedure 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的SQLSTATE 值。下表列出了通常由 SQLProcedure 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为 "(DM)" 位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLProcedure 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标,并且调用了 SQLFetch 或 SQLFetchScroll 。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA,驱动程序管理器将返回此错误,如果 SQLFetch 或 SQLFetchScroll 已 SQL_NO_DATA 返回,则由驱动程序返回。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll 。

40001 序列化失败 由于另一个事务发生了资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle 。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY009 空值指针的使用无效

SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE, CatalogName 参数为 null 指针,SQL_CATALOG_NAME 的 InfoType 返回支持的目录名称。

(DM) SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,并且 SchemaName 或 ProcName 参数为 null 指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。此异步函数在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 一个名称长度参数的值小于0但不等于 SQL_NTS。

名称长度参数之一的值超出了相应名称的最大长度值。

HY117 由于未知的事务状态,连接被挂起。仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

指定了过程目录,并且该驱动程序或数据源不支持目录。

指定了过程模式,但驱动程序或数据源不支持模式。

为过程模式或过程名称指定了字符串搜索模式,并且数据源不支持其中一个或多个参数的搜索模式。

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回请求的结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持此函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.42.SQLProcedureColumns

3.42.1.功能描述

SQLProcedureColumns返回输入和输出参数的列表以及组成指定过程的结果集的列。驱动程序将信息作为指定语句的结果集返回。

3.42.2.语法

SQLRETURN SQLProcedureColumns(  
     SQLHSTMT      StatementHandle,  
     SQLCHAR *     CatalogName,  
     SQLSMALLINT   NameLength1,  
     SQLCHAR *     SchemaName,  
     SQLSMALLINT   NameLength2,  
     SQLCHAR *     ProcName,  
     SQLSMALLINT   NameLength3,  
     SQLCHAR *     ColumnName,  
     SQLSMALLINT   NameLength4); 

3.42.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CatalogName

    [输入]过程目录名称。如果驱动支持某些过程的目录但不支持其他过程的,比如当驱动程序从不同的 DBMS 中检索数据时,一个空串("") 表明这些过程没有目录。CatalogName 不能包含串查找模式。

    如果将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE,则 CatalogName将被视为标识符,其大小写没有意义。如果为 SQL_FALSE, 则 CatalogName为普通参数;它按字面处理,其大小写显著。

  • NameLength1

    [输入]CatalogName 的长度。

  • SchemaName

    [输入]过程模式名称的字符串搜索模式。如果驱动程序支持某些过程的模式,而不支持其他过程的,例如,当驱动程序从不同的 DBMS中检索数据时,空字符串 ("") 表示没有模式的过程。

    如果将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 SchemaName将被视为标识符,其大小写不明显。如果已 SQL_FALSE,SchemaName是模式值参数;它按字面处理,其大小写显著。

  • NameLength2

    [输入]SchemaName 的长度。

  • ProcName

    [输入]过程名称的字符串搜索模式。

    如果将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 ProcName将被视为标识符,其大小写不明显。如果为 SQL_FALSE, 则 ProcName是模式值参数;它按字面处理,其大小写显著。

  • NameLength3

    [输入]ProcName 的长度。

  • ColumnName

    [输入]列名的字符串搜索模式。

    如果将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE,则 ColumnName将被视为标识符,其大小写不显著。如果已 SQL_FALSE,则 ColumnName是模式值参数;它按字面处理,其大小写显著。

  • NameLength4

    [输入]ColumnName 的长度。

3.42.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.42.5.诊断

当 SQLProcedureColumns 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO时,可以通过调用具有 SQL_HANDLE_STMT 的 HandleType 和StatementHandle 句柄的 SQLGetDiagRec 来获取关联的 SQLSTATE 值。下表列出了SQLProcedureColumns 通常返回的 SQLSTATE 值,并说明了此函数上下文中的每个值;标注为" (DM)"位于驱动程序管理器返回的 SQLSTATEs 说明之前。除非另有说明,否则将与每个 SQLSTATE值关联的返回代码是SQL_ERROR。

SQLProcedureColumns 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
24000 游标状态无效

在 StatementHandle 上打开游标,并调用了 SQLFetch 或 SQLFetchScroll。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA,驱动程序管理器将返回此错误;如果 SQLFetch 或 SQLFetchScroll 返回了 SQL_NO_DATA,驱动程序将返回此错误。

游标已在 StatementHandle 上打开,但 SQLFetch 或 SQLFetchScroll 尚未调用。

40001 序列化失败 由于资源与另一个事务发生死锁,事务已回滚。
40003 语句完成未知 在执行此函数期间,关联的连接失败,无法确定事务的状态。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中的 SQLError 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

为 StatementHandle 启用了异步处理。调用了函数,在函数完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用函数。

调用了函数,在函数完成执行之前,从多线程应用程序中的不同线程对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle。

HY009 null 指针的使用无效

SQL_ATTR_METADATA_ID语句属性设置为 SQL_TRUE,CatalogName 参数为 null 指针,并且 SQL_CATALOG_NAME InfoType 返回支持目录名称。

(DM) 将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE,SchemaName、ProcName 或 ColumnName 参数为空指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLProcedureColumns 函数时,此非参数函数仍在执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM) 异步执行的函数 (不是此函数) StatementHandle 调用,并且仍在调用此函数时执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

HY090 字符串或缓冲区长度无效

(DM) 名称长度参数之一的值小于 0,但不等于SQL_NTS。

其中一个名称长度参数的值超出了相应目录、模式、过程或列名的最大长度值。

HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能

指定了过程目录,并且驱动程序或数据源不支持目录。

指定了过程模式,并且驱动程序或数据源不支持模式。

为过程模式、过程名称或列名指定了字符串搜索模式,并且数据源不支持其中一个或多个参数的搜索模式。

驱动程序或数据源不支持SQL_ATTR_CONCURRENCY和SQL_ATTR_CURSOR_TYPE语句属性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS语句属性设置为 SQL_UB_VARIABLE,SQL_ATTR_CURSOR_TYPE 语句属性设置为驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回结果集之前超时期限已过。超时期限通过 SQLSetStmtAttr、SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。

3.43.SQLPutData

3.43.1.功能描述

SQLPutData 允许应用程序在语句执行时将参数或列的数据发送到驱动程序。此函数可用于将字符或二进制数据值以部件形式发送到具有字符、二进制或数据源特定数据类型的列(例如SQL_LONGVARBINARY 或 SQL_LONGVARCHAR 类型的)。SQLPutData 支持绑定到 UnicodeC 数据类型,即使基础驱动程序不支持 Unicode 数据。

3.43.2.语法

SQLRETURN SQLPutData(
  SQLHSTMT     StatementHandle,
  SQLPOINTER   DataPtr,
  SQLLEN       StrLen_or_Ind);  

3.43.3.参数

  • StatementHandle

    [输入]语句句柄。

  • DataPtr

    [输入]指向包含参数或列的实际数据的缓冲区的指针。数据必须在 C 数据类型,数据类型由 SQLB indParameter(参数数据 ) 或 SQLB indCol(字段数据) 的 ValueType 参数指定。

  • StrLen_or_Ind

    [输入]* DataPtr 的长度。指定在调用 SQLPutData时发送的数据量。数据量可能因给定参数或列的每次调用而改变。StrLen_or_Ind,除非满足以下条件之一,否则将忽略此参数:

    • StrLen_or_Ind SQL_NTS SQL_NULL_DATA或SQL_DEFAULT_PARAM。

    • SQLBindParameter 或 SQLBindCol 中指定的 C数据类型SQL_C_CHAR或SQL_C_BINARY。

    • C 数据类型为 SQL_C_DEFAULT,并且指定数据类型的默认 C 数据类型SQL为 SQL_C_CHAR 或SQL_C_BINARY。

对于所有其他类型的 C 数据,如果 StrLen_or_Ind 不是 SQL_NULL_DATA 或SQL_DEFAULT_PARAM,则驱动程序 *DataPtr 缓冲区的大小是使用 ValueType 或 TargetType 指定的C 数据类型的大小,并发送整个数据值。

3.43.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.43.5.诊断

当 SQLPutData 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLPutData 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为" (DM) "位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLPutData 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 为输出参数返回的字符串或二进制数据导致截断非空字符或非 NULL 二进制数据。如果它是字符串值,则被右截断。(函数返回 SQL_SUCCESS_WITH_INFO。)
07006 受限数据类型属性冲突 绑定参数的 SQLBindParameter 中的 ValueType 参数标识的数据值无法转换为 SQLBindParameter 中 ParameterType 参数标识的数据类型。
07S01 默认参数的使用无效 使用 SQLBindParameter 设置的参数值SQL_DEFAULT_PARAM,并且相应的参数没有默认值。
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
22001 字符串数据,右截断

将字符或二进制值赋值给列会导致截断非空 (字符) 或非 null (二进制) 字符或字节。

SQLGetInfo 中的 SQL_NEED_LONG_DATA_LEN 信息类型为"Y",为长参数发送了更多数据 (数据类型为 SQL_LONGVARCHAR、SQL_LONGVARBINARY 或特定于数据源的长数据类型) 而不是 SQLBindParameter 中的 StrLen_or_IndPtr 参数指定的数据类型。

SQLGetInfo 中的 SQL_NEED_LONG_DATA_LEN 信息类型为"Y",为长列发送了更多数据 (数据类型为 SQL_LONGVARCHAR、SQL_LONGVARBINARY 或特定于数据源的长数据类型) ,而不是在长度缓冲区中指定的数据,该长度缓冲区对应于使用 SQLBulkOperations 添加或更新的数据行中的列,或者使用 SQLSetPos 进行更新。

22003 数值范围外

为绑定数值参数或列发送的数据导致整个 (而不是小数) 在分配给关联的表列时截断部分数字。

返回一 (输入/输出或输出参数的数值) 或字符串,则导致整个而不是数字的小数部分被截断。

22007 日期/时间格式无效

为绑定到日期、时间或时间戳结构的参数或列发送的数据分别是无效的日期、时间或时间戳。

输入/输出或输出参数绑定到日期、时间或时间戳 C 结构,返回的参数中的值分别为无效的日期、时间或时间戳。(函数返回 SQL_SUCCESS_WITH_INFO。)

22008 日期/时间字段溢出 为输入/输出或输出参数计算的 datetime 表达式导致日期、时间或时间戳 C 结构无效。
22012 被零除 为输入/输出或输出参数计算的算术表达式导致被零除。
22015 间隔字段溢出

为数据类型为间隔的精确数值或间隔列或参数发送SQL导致有效数字丢失。

为具有多个字段的间隔列或参数发送了数据,已转换为数值数据类型,并且该数据类型没有表示形式。

为列或参数数据发送的数据被分配给SQL类型的间隔,并且该类型在间隔中没有 C 类型的SQL表示形式。

为 C 类型的精确数值或间隔 C 列或参数发送的数据导致有效数字丢失。

为列或参数数据发送的数据已分配给间隔 C 结构,并且间隔数据结构中没有数据表示形式。

22018 强制转换规范的字符值无效

C 类型是精确或近似数值、日期/时间或间隔数据类型;列SQL类型是字符数据类型;列或参数中的值不是绑定 C 类型的有效文本。

数据类型SQL为精确或近似数值、日期时间或间隔数据类型;C 类型为 SQL_C_CHAR;列或参数中的值不是绑定类型SQL文本。

HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

为 StatementHandle 启用了异步处理。调用了函数,在函数完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用函数。

调用了函数,在函数完成执行之前,从多线程应用程序中的不同线程对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle。

HY009 null 指针的使用无效 (DM) 参数 DataPtr 为 null 指针,并且参数 StrLen_or_Ind 不是 0、SQL_DEFAULT_PARAM 或 SQL_NULL_DATA。
HY010 函数序列错误

(DM) 上一个函数调用不是对 SQLPutData 或 SQLParamData 的调用。

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLPutData 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (调用 StatementHandle) ,并且在调用此函数时仍在执行。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY019 分段发送非字符和非二进制数据 为某个参数或列调用了 SQLPutData ,但未使用将字符 c 数据发送到具有字符、二进制或数据源特定数据类型的列,或将二进制 c 数据发送到具有字符、二进制或数据源特定数据类型的列。
HY020 尝试连接 null 值 多次调用了 SQLPutData ,因为调用返回 SQL_NEED_DATA,并在其中一个调用中包含 SQL_NULL_DATA 或 SQL_DEFAULT_PARAM StrLen_or_Ind 参数。
HY090 字符串或缓冲区长度无效 参数 DataPtr 不是 null 指针,且参数 StrLen_or_Ind 小于0但不等于 SQL_NTS 或 SQL_NULL_DATA。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

如果在 SQL 语句中发送参数的数据时调用了 SQLPutData ,则它可以返回调用的函数可返回的任何 SQLSTATE,以执行语句(SQLExecute 或 SQLExecDirect) 。如果在发送使用 SQLBulkOperations更新或添加的列的数据时调用此方法,或者使用 SQLSetPos进行更新,则它可以返回 SQLBulkOperations 或 SQLSetPos 返回的任何 SQLSTATE。

3.44.SQLRowCount

3.44.1.功能描述

SQLRowCount返回受 UPDATE、INSERT 或DELETE 语句影响的行数;SQLBulkOperations 中的SQL_ADD、SQL_UPDATE_BY_BOOKMARK 或 SQL_DELETE_BY_BOOKMARK操作;SQLSetPos 中的 SQL_UPDATE或SQL_DELETE操作。

3.44.2.语法

SQLRETURN SQLRowCount(  
      SQLHSTMT   StatementHandle,  
      SQLLEN *   RowCountPtr); 

3.44.3.参数

  • StatementHandle

    [输入]语句句柄。

  • RowCountPtr

    [输出]指向要返回字段的缓冲区。对于 UPDATE、INSERT 和 DELETE 语句,对于 SQLBulkOperations中的 SQL_ADD、SQL_UPDATE_BY_BOOKMARK 和 SQL_DELETE_BY_BOOKMARK操作,以及 SQLSetPos 中的 SQL_UPDATE 或 SQL_DELETE 操作 ,RowCountPtr中返回的值是受请求影响的行数;如果受影响的行数不可用,则返回-1。

    调用 SQLExecute、SQLExecDirect、 SQLBulkOperations、SQLSetPos 或SQLMoreResults 时,诊断数据结构的 SQL_DIAG_ROW_COUNT字段设置为字段数,并且字段数以依赖实现的方式缓存。SQLRowCount返回缓存的字段数值。缓存字段数值有效,直到语句句柄设置回已准备或已分配状态、重新执行语句或 调用SQLCloseCursor。请注意,如果在设置 SQL_DIAG_ROW_COUNT字段后调用了函数,则 SQLRowCount 返回的值可能不同于SQL_DIAG_ROW_COUNT 字段中的值,因为任何函数调用都将 SQL_DIAG_ROW_COUNT 字段重置为0。

    对于其他语句和函数,驱动程序可以定义 * RowCountPtr 中返回的值。例如,某些数据源可能在提取行之前返回 SELECT语句或目录函数返回的行数。

注意

在提取结果集之前,许多数据源无法返回行数;为获得最大的互操作性,应用程序不应依赖此行为。

3.44.4.返回值

SQL_SUCCESS SQL_SUCCESS_WITH_INFO、SQL_ERROR或SQL_INVALID_HANDLE。

3.44.5.诊断

当 SQLRowCount 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLRowCount 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为"(DM) "位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLRowCount 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLRowCount 函数时,此异步函数仍在执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 之前调用了函数。

(DM) 为 StatementHandle 调用了异步执行函数,在调用此函数时仍在执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。

3.45.SQLSetConnectAttr

3.45.1.功能描述

SQLSetConnectAttr设置控制连接的各项属性。

3.45.2.语法

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

3.45.3.参数

  • ConnectionHandle

    [输入]连接句柄。

  • Attribute

    [输入]要设置的属性,在"注释"中列出。

  • ValuePtr

    [输入]指向要与属性关联的值的指针。根据 Attribute 的值,ValuePtr 将是无符号整数值,或将指向以 null结尾的字符串。请注意,Attribute 参数的整型类型不能固定长度。

  • StringLength

    [输入]如果 Attribute 是 ODBC 定义的属性,并且 ValuePtr 指向字符串或二进制缓冲区,则此参数的长度应为 *ValuePtr。对于字符串数据,此参数应包含字符串中的字节数。

    如果 Attribute 是 ODBC 定义的属性,ValuePtr 是整数,则忽略 StringLength。

    如果 Attribute 是驱动程序定义的属性,则应用程序通过设置 StringLength参数向驱动程序管理器指示属性的性质。StringLength可以具有以下值:

    • 如果 ValuePtr 是指向字符串的指针,则 StringLength 是字符串或字符串SQL_NTS的长度。

    • 如果 ValuePtr是指向二进制缓冲区的指针,则应用程序将SQL_LEN_BINARY_ATTR(LENGTH)宏的结果放置于BufferLength。这会在StringLength 中设置负值。

    • 如果 ValuePtr 是指向字符串或二进制字符串外值的指针,则 StringLength的值应为SQL_IS_POINTER。

    • 如果 ValuePtr 包含固定长度的值,则根据实际情况将StringLength对应设置为SQL_IS_INTEGER 或SQL_IS_UINTEGER。

3.45.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_INVALID_HANDLE 或SQL_STILL_EXECUTING。

3.45.5.诊断

当 SQLSetConnectAttr 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,通过设置SQL_HANDLE_DBC 的HandleType和 State memtHandle 的句柄,调用 SQLGetDiagRec,可以获得相应的 SQLSTATE 值。下表列出了 SQLSetConnectAttr 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为“(DM)”优先于被驱动管理器返回的 SQLSTATE的描述。除非另有说明,否则将指定与每个 SQLSTATE 值联合返回的代码是SQL_ERROR。

驱动程序可以返回SQL_SUCCESS_WITH_INFO,以提供有关设置选项的结果的信息。

SQLSetConnectAttr 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 驱动程序不支持 ValuePtr 中指定的值,并替换了类似的值。(函数返回 SQL_SUCCESS_WITH_INFO。)
08002 使用的连接名称 属性参数 SQL_ATTR_ODBC_CURSORS,并且驱动程序已连接到数据源。
08003 连接未打开 (DM) 指定了需要打开连接的属性值,但 ConnectionHandle 未在连接状态。
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
24000 游标状态无效 Attribute 参数已SQL_ATTR_CURRENT_CATALOG,并且结果集已挂起。
25000 在本地事务中非法操作

尝试在 DTC 的分布式事务连接中登记时,连接(本地事务) 将连接属性设置为 SQL_ATTR_ENLIST_IN_DTC。

连接已在 DTC 中登记。

连接已登记在分布式事务连接中,并且本地事务通过将 SQL_ATTR_AUTOCOMMIT 设置为 SQL_AUTOCOMMIT_OFF。

3D000 目录名称无效 Attribute 参数SQL_CURRENT_CATALOG,并且指定的目录名称无效。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区 中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消

为 ConnectionHandle 启用了异步处理。调用了 SQLSetConnectAttr 函数,在执行完毕之前,在 ConnectionHandle 上调用了 SQLCancelHandle函数,然后在 ConnectionHandle 上再次调用 SQLSetConnectAttr 函数。

或者,调用了 SQLSetConnectAttr 函数,在它完成执行之前,从多线程应用程序中的不同线程对 ConnectionHandle 调用 SQLCancelHandle。

HY009 null 指针的使用无效 Attribute 参数标识了需要字符串值的连接属性,ValuePtr 参数为 null 指针。
HY010 函数序列错误

(DM)调用了与 ConnectionHandle 关联的 StatementHandle 的异步执行函数,并且仍在调用 SQLSetConnectAttr 时执行。

(DM) 异步执行的函数(不是此函数) 为 ConnectionHandle 调用,并且仍在调用此函数时执行。

(SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 为与 ConnectionHandle 关联的语句句柄之一调用了 DM,并返回了 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 调用了与 ConnectionHandle 关联的 StatementHandle,并返回了 SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

(CONNECTIONHandle) 调用了 SQLBrowseConnect 的 DM SQL_NEED_DATA。在 SQLBrowseConnect 返回 SQL_SUCCESS_WITH_INFO 或 SQL_SUCCESS。

HY011 现在无法设置属性 Attribute 参数已SQL_ATTR_TXN_ISOLATION,并且事务已打开。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY024 属性值无效

给定指定的 Attribute 值 ,ValuePtr 中指定了无效值。(驱动程序管理器仅针对接受一组离散值(如值或值集)的连接和语句属性SQL_ATTR_ACCESS_MODE SQLSTATE SQL_ATTR_ASYNC_ENABLE。对于所有其他连接和语句属性,驱动程序必须验证 ValuePtr。)

Attribute 参数SQL_ATTR_TRACEFILE或 SQL_ATTR_TRANSLATE_LIB,ValuePtr 为空字符串。

HY090 字符串或缓冲区长度无效 (DM) *ValuePtr 是一个字符串,StringLength 参数小于 0,但SQL_NTS。
HY092 属性/选项标识符无效

(DM) 为参数 Attribute 指定的值对驱动程序支持的 ODBC 版本无效。

(DM) 为参数 Attribute 指定的值是只读属性。

HY114 驱动程序不支持连接级异步函数执行 (DM) 应用程序尝试为不支持异步连接SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE驱动程序启用异步函数执行。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HY121 无法同时Driver-Aware游标库和游标池  
HYC00 未实现可选功能 为参数 Attribute 指定的值是驱动程序支持的 ODBC 版本的有效 ODBC 连接或语句属性,但驱动程序不支持该值。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 ConnectionHandle 关联的驱动程序不支持函数。
IM009 无法加载转换 DLL 驱动程序无法加载为连接指定的转换 DLL。只有在属性为属性时,才能返回SQL_ATTR_TRANSLATE_LIB。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。
S1118 驱动程序不支持异步通知 SQL_ATTR_ASYNC_DBC_EVENT在 (后设置) ,但驱动程序不支持异步通知。

当 Attribute 是语句属性时 ,SQLSetConnectAttr 可以返回 SQLSetStmtAttr 返回的任何SQLSTATEs。

3.46.SQLSetCursorName

3.46.1.功能描述

SQLSetCursorName将游标名称与活动语句相关联。如果应用程序不调用 SQLSetCursorName,则驱动程序将根据需要为处理SQL 语句生成游标名称。

3.46.2.语法

SQLRETURN SQLSetCursorName(
  SQLHSTMT      StatementHandle,
  SQLCHAR *     CursorName,
  SQLSMALLINT   NameLength);

3.46.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CursorName

    [输入]游标名称。为实现有效处理,游标名称不应在游标名称中包括任何前导空格或尾随空格,并且如果游标名称包含分隔的标识符,则分隔符应作为游标名称中的第一个字符定位。

  • NameLength

    [输入] *CursorName中的字符的长度。

3.46.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.46.5.诊断

当 SQLSetCursorName 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLSetCursorName 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)”优先于被驱动管理器返回的 SQLSTATE的描述。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是SQL_ERROR。

SQLSetCursorName 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01004 字符串数据,右截断 游标名称超出了最大限制,因此只使用了允许的最大字符数。
24000 无效的游标状态 对应于 StatementHandle 的语句已经处于执行或游标定位状态。
34000 无效的游标名称 *CursorName 中指定的游标名称无效,因为它超出了驱动程序定义的最大长度,或者它以 "SQLCUR" 或 "SQL_CUR" 开头。
3C000 重复的游标名称 *CursorName 中指定的游标名已经存在。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY009 空值指针的使用无效 (DM) 参数 CursorName 为 null 指针。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLSetCursorName 函数时,此 aynchronous 函数仍在执行。

(DM) 为 StatementHandle 调用了异步执行函数,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效 (DM) 参数 NameLength 小于0但不等于 SQL_NTS。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。通过SQLSetStmtAttr 以 SQL_ATTR_CONNECTION_TIMEOUT 属性设置连接超时。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。

3.47.SQLSetDescField

3.47.1.功能描述

SQLSetDescField设置描述符记录的单个字段的值。

3.47.2.语法

SQLRETURN SQLSetDescField(
  SQLHDESC      DescriptorHandle,
  SQLSMALLINT   RecNumber,
  SQLSMALLINT   FieldIdentifier,
  SQLPOINTER    ValuePtr,
  SQLINTEGER    BufferLength);

3.47.3.参数

  • DescriptorHandle

    [输入]描述符句柄。

  • RecNumber

    [输入]指示包含应用程序要设置的字段的描述符记录。描述符记录从 0 编号,记录编号 0 作为书签记录。对于标头字段,忽略RecNumber 参数。

  • FieldIdentifier

    [输入]指示要设置其值的描述符的字段。

  • ValuePtr

    [输入]指向包含描述符信息的缓冲区的指针,或整数值。数据类型取决于 FieldIdentifier 的值。如果 ValuePtr是整数值,则它可视为 8 个字节 (SQLLEN) 、4 个字节 (SQLINTEGER) 或 2 个字节(SQLSMALLINT),具体取决于 FieldIdentifier 参数的值。

  • BufferLength

    [输入]如果 FieldIdentifier 是 ODBC 定义的字段,并且 ValuePtr指向字符串或二进制缓冲区,则此参数的长度应为 *ValuePtr。对于字符串数据,此参数应包含字符串中的字节数。

    如果 FieldIdentifier 是 ODBC 定义的字段 ,ValuePtr 是整数,则忽略 BufferLength。

    如果 FieldIdentifier 是驱动程序定义的字段,则应用程序通过设置 BufferLength参数向驱动程序管理器指示字段的性质。BufferLength可以具有以下值:

    • 如果 ValuePtr 是指向字符串的指针,则 BufferLength 是字符串或字符串SQL_NTS的长度。

    • 如果 ValuePtr是指向二进制缓冲区的指针,则应用程序将SQL_LEN_BINARY_ATTR(LENGTH)宏的结果放置于BufferLength。这会在BufferLength 中设置负值。

    • 如果 ValuePtr 是指向除字符串或二进制字符串外的值的指针,则BufferLength 的值是SQL_IS_POINTER数值。

    • 如果 ValuePtr 包含固定长度的值,则根据实际情况,BufferLength 的值可以是 SQL_IS_INTERGER,SQL_IS_UINTEGER,SQL_IS_SMALLINT 或SQL_IS_USMALLINT 。

3.47.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.47.5.诊断

当 SQLSetDescField 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_DESC 的 HandleType 和描述符 Handle 句柄的 SQLGetDiagRec 来获取关联的SQLSTATE 值。下表列出了 SQLSetDescField 通常返回的 SQLSTATE 值,并说明了此函数上下文中的每个值;标注为"(DM) "优先于驱动程序管理器返回的 SQLSTATEs 描述。除非另有说明,否则与每个 SQLSTATE 值联合返回 SQL_ERROR。

SQLSetDescField 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 如果 ValuePtr 是指针) ,或者 ValuePtr 是整数值) ,则驱动程序不支持 *ValuePtr (中指定的值,如果 ValuePtr 是整数值) ,则驱动程序不支持 *ValuePtr (中指定的值,因此驱动程序替换了类似的值。(函数返回 SQL_SUCCESS_WITH_INFO。)
07009 描述符索引无效

FieldIdentifier 参数是记录字段,RecNumber 参数为 0,DescriptorHandle 参数引用 IPD 句柄。

RecNumber 参数小于 0,描述符Handle 参数引用 ARD 或 APD。

RecNumber 参数大于数据源可支持的最大列数或参数数,并且 DescriptorHandle 参数引用 APD 或 ARD。

(DM) FieldIdentifier 参数为 * SQL_DESC_COUNT,ValuePtr 参数小于 0。

RecNumber 参数等于 0,DescriptorHandle 参数引用隐式分配的 APD。(显式分配的应用程序描述符不会发生此错误,因为在执行 time.) 之前,无法知道显式分配的应用程序描述符是 APD 还是 ARD。

08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
22001 字符串数据,右截断 FieldIdentifier 参数 SQL_DESC_NAME,BufferLength 参数的值大于 SQL_MAX_IDENTIFIER_LEN。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误

(DM) 描述符 Handle 与 StatementHandle 相关联,其异步执行函数 (而不是此函数) 调用此函数时仍在执行。

(调用了 DM) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos,该语句与 DescriptorHandle 关联并返回了 SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

(DM) 为与描述符Handle 关联的连接句柄调用了 异步执行函数。调用 SQLSetDescField 函数时,此异步函数仍在执行。

(SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 调用了与描述符Handle 关联的语句句柄之一,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY016 无法修改实现行描述符 DescriptorHandle 参数与 IRD 相关联,并且 FieldIdentifier 参数未SQL_DESC_ARRAY_STATUS_PTR或SQL_DESC_ROWS_PROCESSED_PTR。
HY021 描述符信息不一致

对于 IPD,SQL_DESC_TYPE 和 SQL_DESC_DATETIME_INTERVAL_CODE 字段不构成有效的 ODBC SQL 类型或特定于驱动程序的有效 SQL (类型) 或适用于 APD 或 ARD 的有效 ODBC C 类型。

在一致性检查期间检查的描述符信息不一致。(SQLSetDescRec.) 中的"一致性检查"。

HY090 字符串或缓冲区长度无效

(DM) *ValuePtr 是一个字符串 ,BufferLength 小于零,但不等于SQL_NTS。

HY091 描述符字段标识符无效

为 FieldIdentifier 参数指定的值不是 ODBC 定义的字段,并且不是实现定义的值。

FieldIdentifier 参数对于 DescriptorHandle 参数无效。

FieldIdentifier 参数是只读的 ODBC 定义字段。

HY092 无效的属性/选项标识符

*ValuePtr 中的值对 FieldIdentifier 参数无效。

FieldIdentifier 参数 SQL_DESC_UNNAMED,且 ValuePtr SQL_NAMED。。

HY105 无效的参数类型 (DM) 为 SQL_DESC_PARAMETER_TYPE 字段指定的值无效。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数  
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 DescriptorHandle 关联的驱动程序不支持该函数。

3.48.SQLSetEnvAttr

3.48.1.功能描述

SQLSetEnvAttr设置控制环境的各个方面的属性。

3.48.2.语法

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

3.48.3.参数

  • EnvironmentHandle

    [输入]环境句柄。

  • Attribute

    [输入]要设置的属性。

  • ValuePtr

    [输入]指向要与属性关联的值的指针。ValuePtr 可能是32位整型值,或指向空结束字符串。

  • StringLength

    [输入]如果 ValuePtr 指向字符串或二进制缓冲区,则此参数的长度应为 *ValuePtr。对于字符串数据,此参数应包含字符串中的字节数。

    如果将 valueptr 是整数,则将忽略 StringLength 。

3.48.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.48.5.诊断

当 SQLSetEnvAttr 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_ENV 和 EnvironmentHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLSetEnvAttr 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为 "(DM)" 位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值联合返回的代码是 SQL_ERROR。如果驱动程序不支持环境属性,则只能在连接时返回此错误。

SQLSetEnvAttr 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 该驱动程序不支持在将 valueptr 中指定的值,并将其替换为类似值。(函数返回 SQL_SUCCESS_WITH_INFO。)
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY009 空值指针的使用无效 Attribute 参数标识了需要字符串值的环境属性,ValuePtr 参数为 null 指针。
HY010 函数序列错误

DM) 已在 EnvironmentHandle 上分配连接句柄。

(DM) SQL_ATTR_ODBC_VERSION 尚未设置 SQLSetEnvAttr,并且属性与 SQL_ATTR_ODBC_VERSION 不相等。如果使用的是 SQLAllocHandleStd,则无需显式设置 SQL_ATTR_ODBC_VERSION 。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY024 属性值无效 给定指定的属性值,将 valueptr 中指定的值无效。
HY090 字符串或缓冲区长度无效 StringLength 参数小于0,但不是SQL_NTS。
HY092 无效的属性/选项标识符 (DM) 为参数属性指定的值对于该驱动程序支持的 ODBC 版本无效。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

为 argument 特性 指定的值为驱动程序所支持的 odbc 版本的有效 odbc 环境特性,但驱动程序不支持该特性。

(DM) 属性 参数已 SQL_ATTR_OUTPUT_NTS,并且已 SQL_FALSE 将 valueptr 。

3.49.SQLSetPos

3.49.1.功能描述

SQLSetPos设置行集的游标位置,并允许应用程序刷新行集的数据或更新、删除结果集内的数据。

3.49.2.语法

SQLRETURN SQLSetPos(
  SQLHSTMT        StatementHandle,
  SQLSETPOSIROW   RowNumber,
  SQLUSMALLINT    Operation,
  SQLUSMALLINT    LockType); 

3.49.3.参数

  • StatementHandle

    [输入]语句句柄。

  • RowNumber

    [输入]行集内要执行 Operation 参数指定的操作行的位置。如果 RowNumber 为 0,则操作将应用于行集的每一行。

  • Operation

    [输入]要执行的操作:SQL_POSITION、SQL_REFRESH、SQL_UPDATE 、SQL_DELETE。

  • LockType

    [输入]指示完成 Operation参数指定的操作之后,如何锁定行。

    SQL_LOCK_NO_CHANGE、SQL_LOCK_EXCLUSIVE、SQL_LOCK_UNLOCK。

3.49.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_STILL_EXECUTING、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.49.5.诊断

当 SQLSetPos 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可能会通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLSetPos 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为"(DM) "位于驱动程序管理器返回的SQLSTATEs 说明之前。除非另有说明,否则将指定与每个 SQLSTATE 值联合返回的代码是 SQL_ERROR。

对于可以返回 SQL_SUCCESS_WITH_INFO 或 SQL_ERROR (除了 01xxx SQLSTATE)的SQLSTATE),如果多行运算的一行或多行(但不是全部)发生错误,则返回SQL_SUCCESS_WITH_INFO;如果单行操作出错,则返回 SQL_ERROR。

SQLSetPos 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01001 游标操作冲突

Operation 参数SQL_DELETE或SQL_UPDATE,并且没有删除或更新任何行或多行。(有关对多行的更新详细信息,请参见 SQLSetStmtAttr。) (FFunction 中 SQL_ATTR_SIMULATE_CURSOR 属性返回 SQL_SUCCESS_WITH_INFO)。

Operation 参数SQL_DELETE或SQL_UPDATE,操作由于乐观并发而失败。(函数返回 SQL_SUCCESS_WITH_INFO。)

01004 字符串数据右截断 Operation参数SQL_REFRESH,并且为数据类型为 SQL_C_CHAR 或 SQL_C_BINARY 的列返回的字符串或二进制数据导致截断非空字符或非 NULL 二进制数据。
01S01 行中错误

RowNumber 参数为 0,执行 Operation 参数指定的操作时,一行或多行出错。

(SQL_SUCCESS_WITH_INFO多行运算的一行或多行(但不是全部)上发生错误,则返回 SQL_ERROR;如果单行操作出错,则返回。)

01S07 小数截断

Operation 参数SQL_REFRESH,应用程序缓冲区的数据类型未SQL_C_CHAR或SQL_C_BINARY,一列或多列返回到应用程序缓冲区的数据被截断。对于数值数据类型,数字的小数部分被截断。对于包含时间部分的timetimestamp和 interval 数据类型,该时间的小数部分将被截断。

函数返回 SQL_SUCCESS_WITH_INFO。

07006 受限数据类型属性冲突 在调用 SQLBindCol 时,无法将结果集内列的数据值转换为 TargetType 指定的数据类型。
07009 描述符索引无效 参数 Operation SQL_REFRESH或 SQL_UPDATE,并且列绑定的列号大于结果集的列数。
21S02 派生表的程度与列表不匹配 参数 Operation SQL_UPDATE,并且没有列可更新,因为所有列都是未绑定的、只读的,或者绑定长度/指示器缓冲区中的值SQL_COLUMN_IGNORE。
22001 字符串数据,右截断 Operation 参数为 SQL_UPDATE,将字符或二进制值赋值给列会导致字符) 的非空 (截断,或者为二进制) 字符或字节截断非 null 。
22003 数值范围外

参数 Operation SQL_UPDATE,将数值赋值给结果集的列会导致整个 (而不是数字) 小数部分被截断。

参数 Operation SQL_REFRESH,返回一个或多个绑定列的数值会丢失有效数字。

22007 日期/时间格式无效

参数 Operation SQL_UPDATE,将日期或时间戳值赋值给结果集的列会导致年、月或日字段超过范围。

参数 Operation SQL_REFRESH,返回一个或多个绑定列的日期或时间戳值将导致年、月或日字段超过范围。

22008 日期/时间字段溢出

Operation 参数为 SQL_UPDATE,对发送到结果集内列的数据执行日期时间算术会导致日期/时间字段 (年、月、日、小时、分钟或秒字段) 的结果超出字段允许的值范围,或者根据公历的 datetime 自然规则无效。

Operation 参数为 SQL_REFRESH,对从结果集检索的数据执行日期/时间算术会导致日期/时间字段 (年、月、日、小时、分钟或秒字段) 的结果超出字段允许的值范围,或者根据公历的 datetime 的自然规则无效。

22015 间隔字段溢出

Operation 参数SQL_UPDATE,将确切的数值或间隔 C 类型赋值给SQL类型的间隔导致有效数字丢失。

Operation 参数已SQL_UPDATE;当为类型SQL间隔时,该类型在间隔类型中没有 C 类型的SQL表示形式。

Operation 参数SQL_REFRESH,从确切的数值或间隔类型SQL为间隔 C 类型,导致前导字段中的有效数字丢失。

Operation 参数 SQL_REFRESH;当分配给间隔 C 类型时,在间隔 C 类型SQL类型的值没有表示形式。

22018 强制转换规范的字符值无效

Operation 参数已SQL_REFRESH;C 类型是精确或近似数值、日期/时间或间隔数据类型;列SQL类型是字符数据类型;列中的值不是绑定 C 类型的有效文本。

参数 Operation 已 SQL_UPDATE;SQL类型是精确或近似数值、日期时间或间隔数据类型;C 类型为 SQL_C_CHAR;并且列中的值不是绑定类型SQL文本。

23000 完整性约束冲突 Operation 参数是 SQL_DELETE 或 SQL_UPDATE,并且违反了完整性限制。
24000 游标状态无效

StatementHandle 处于已执行状态,但没有与 StatementHandle 关联的结果集。

(DM) 在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll 。

在 StatementHandle 上打开了游标,并且调用了 SQLFetch 或 SQLFetchScroll ,但游标位于结果集的开头之前或结果集的末尾。

参数操作是 SQL_DELETE、SQL_REFRESH 或 SQL_UPDATE,并且游标定位在结果集的开头之前或结果集的结尾之后。

40001 序列化失败 由于另一个事务发生了资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
42000 语法错误或访问冲突

驱动程序无法根据需要锁定行以执行在参数操作中请求的操作。

驱动程序无法按参数 LockType 中的要求锁定该行。

44000 WITH CHECK OPTION 冲突 Operation 参数为 SQL_UPDATE,并且更新针对通过指定 WITH CHECK OPTION 创建的已查看表或派生自已查看表的表执行,这样受更新影响的一行或多行将不再存在于被查看的表中。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle,然后在 StatementHandle 上再次调用了该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLSetPos 函数时,此异步函数仍在执行。

(DM) 指定的 StatementHandle 未处于执行状态。调用函数时,无需先调用 SQLExecDirect、SQLExecute 或 catalog 函数。

(DM) 异步执行的函数 (不是为 StatementHandle ) ,调用此函数时,该函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY011 现在无法设置属性 (DM) 该驱动程序已设置 SQL_ATTR_ROW_STATUS_PTR 语句特性;然后调用 SQLSetPos,然后调用 SQLFetch、SQLFetchScroll 或 SQLExtendedFetch。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效

操作参数已 SQL_UPDATE,数据值为 null 指针,列长度值不是0、SQL_DATA_AT_EXEC、SQL_COLUMN_IGNORE、 SQL_NULL_DATA 或小于或等于 SQL_LEN_DATA_AT_EXEC_OFFSET。

操作参数 SQL_UPDATE;数据值不是 null 指针;C 数据类型为 SQL_C_BINARY 或 SQL_C_CHAR;列长度值小于0,但不等于 SQL_DATA_AT_EXEC、SQL_COLUMN_IGNORE、 QL_NTS 或 SQL_NULL_DATA,或者小于或等于 SQL_LEN_DATA_AT_EXEC_OFFSET。

长度/指示器缓冲区中的值是SQL_DATA_AT_EXEC;SQL 类型是 SQL_LONGVARCHAR、SQL_LONGVARBINARY 或 long 特定于数据源的数据类型;SQLGetInfo 中的 SQL_NEED_LONG_DATA_LEN 信息类型为 "Y"。

HY092 无效的属性标识符

(DM) 为操作参数指定的值无效。

(DM) 为 LockType 参数指定的值无效。

操作参数已 SQL_UPDATE 或 SQL_DELETE,SQL_ATTR_CONCURRENCY 语句属性已 SQL_ATTR_CONCUR_READ_ONLY。

HY107 行值超出范围 为参数 RowNumber 指定的值大于行集中的行数。
HY109 游标位置无效

与 StatementHandle 关联的游标被定义为只进,因此无法将游标定位到行集中。请参见 SQLSetStmtAttr 中的 SQL_ATTR_CURSOR_TYPE 属性的说明。

操作参数 SQL_UPDATE、SQL_DELETE 或 SQL_REFRESH,并且由 RowNumber 参数标识的行已被删除或尚未提取。

RowNumber 参数 (DM) 为0,操作参数已 SQL_POSITION。

调用 SQLBulkOperations 后,调用 SQLFetchScroll 或 SQLFetch 之前调用了 SQLSetPos 。

HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能 驱动程序或数据源不支持操作参数或 LockType 参数中请求的操作。
HYT00 超时时间已到 在数据源返回结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 属性设置为 SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.49.6.RowNumber 参数

RowNumber 参数指定行集内要执行 Operation 参数指定的运算的行数。如果 RowNumber 为0,则操作将应用于行集的每一行。RowNumber 必须是从 0 到行集内行数的值。

注意

在 C 语言中,数组基于0,RowNumber 参数基于 1。例如,若要更新行集的第五行,应用程序将修改数组索引 4 中的行集缓冲区,但指定RowNumber 为 5。

所有操作将光标置于 RowNumber 指定的行上。以下操作需要光标位置:

  • 定位的更新和删除语句。

  • 对 SQLGetData 的调用。

  • 使用 SQL_DELETE、SQL_REFRESH 和 SQL_UPDATE 选项调用 SQLSetPos。

例如,如果对 OPERATION 为 SQL_DELETE 的 SQLSetPos 的调用的 RowNumber 为2,则游标将定位在行集的第二行,该行将被删除。第二行的(SQL_ATTR_ROW_STATUS_PTR 语句属性所指向的)行状态数组中的SQL_ROW_DELETED更改为SQL_ROW_DELETED。

应用程序在调用 SQLSetPos 时可以指定光标位置。通常,它使用 SQL_POSITION 或 SQL_REFRESH 操作调用SQLSetPos, 以在执行定位的更新或删除语句或调用 SQLGetData 之前定位游标。

3.49.7.Operation 参数

Operation 参数支持以下操作。为了确定数据源支持哪些选项,应用程序使用SQL_DYNAMIC_CURSOR_ATTRIBUTES1、SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1、SQL_KEYSET_CURSOR_ATTRIBUTES1 或 SQL_STATIC_CURSOR_ATTRIBUTES1 信息类型(调用 SQLGetInfo, 具体取决于游标) 。

Operation 参数

操作参数 Operation
SQL_POSITION 驱动程序将光标置于 RowNumber 指定的行上。对于操作 ,将忽略 SQL_ATTR_ROW_OPERATION_PTR 语句属性指向的行SQL_POSITION 数组的内容。
SQL_REFRESH 驱动程序将光标置于 RowNumber 指定的行上,并刷新该行的行集缓冲区中的数据。SQLSetPos SQL_REFRESH操作 更新当前提取的行集内的行的状态和内容。这包括刷新书签。由于缓冲区中的数据已刷新但不重新提取,因此行集的成员身份是固定的。这不同于 调用 SQLFetchScroll 且 FetchOrientation 为 SQL_FETCH_RELATIVE 且 RowNumber 等于 0 执行的刷新,该调用从结果集重新提取行集,以便它可以在驱动程序和游标支持这些操作时显示添加的数据并删除已删除的数据。使用 SQLSetPos 成功刷新 不会更改行状态SQL_ROW_DELETED。行集内已删除的行将继续标记为已删除,直到下次提取。如果游标支持(打包后续 SQLFetch 或 SQLFetchScroll 不返回已删除行的行,则行将在下一次提取时) 。执行 SQLSetPos 刷新时,不会显示添加的行。此行为不同于 FetchType 为 SQL_FETCH_RELATIVE 且 RowNumber 等于 0 的 SQLFetchScroll, 此行为还会刷新当前行集,但如果游标支持这些操作,则会显示添加的记录或打包已删除的记录。使用 SQLSetPos 成功刷新后,如果行状态数组存在SQL_ROW_ADDED,SQL_ROW_SUCCESS (行状态更改为) 。如果行状态数组存在,则 SQLSetPos 的成功刷新SQL_ROW_UPDATED行状态更改为该行的新状态 (行状态) 。如果对行执行 SQLSetPos 操作时发生错误,则行状态设置为SQL_ROW_ERROR (如果行状态数组存在,则行) 。对于使用 SQL_CONCUR_ROWVER 或 SQL_CONCUR_VALUES 的 SQL_ATTR_CONCURRENCY 语句属性打开的游标, 使用 SQLSetPos 刷新可能会更新数据源用于检测行已更改的乐观并发值。如果发生这种情况,则每当从服务器刷新行集缓冲区时,将更新用于确保游标并发的行版本或值。刷新的每一行都会出现此情况。对于操作,将忽略 SQL_ATTR_ROW_OPERATION_PTR 语句属性指向的行SQL_REFRESH 数组的内容。
SQL_UPDATE 驱动程序将光标置于 RowNumber 指定的行上,然后使用行集缓冲区中的值更新数据的基础行 (SQLBindCol) 中的 TargetValuePtr 参数。它从 SQLBindCol (中的 StrLen_or_IndPtr 参数的长度/指示器缓冲区中检索) 。如果任何列的长度为 SQL_COLUMN_IGNORE,则不更新该列。更新行后,驱动程序将行状态数组的相应元素SQL_ROW_UPDATED或SQL_ROW_SUCCESS_WITH_INFO (行状态数组存在时) 。如果在包含重复列的游标上调用 Operation 参数为 SQL_UPDATE SQLSetPos, 则行为由驱动程序定义。驱动程序可以返回驱动程序定义的 SQLSTATE,可以更新结果集内显示的第一列,或执行其他驱动程序定义的行为。SQL_ATTR_ROW_OPERATION_PTR 语句属性指向的行操作数组可用于指示在批量更新期间应忽略当前行集的行。
SQL_DELETE 驱动程序将光标定位在 RowNumber 指定的行上,并删除数据的基础行。它将行状态数组的相应元素更改为SQL_ROW_DELETED。删除行后,以下语句对行无效:定位的更新和删除语句、对 SQLGetData 的调用,以及对 SQLSetPos 的调用,操作设置为除 SQL_POSITION。对于支持打包的驱动程序,从数据源检索新数据时,将从游标中删除该行。行是否保持可见取决于游标类型。例如,已删除的行对静态游标和键集驱动的游标可见,但对动态游标不可见。SQL_ATTR_ROW_OPERATION_PTR 语句属性指向的行操作数组可用于指示在批量删除期间应忽略当前行集的行。

3.49.8.LockType 参数

LockType 参数为应用程序提供了一种控制并发的方式。在大多数情况下,支持并发级别和事务的数据源将仅SQL_LOCK_NO_CHANGELockType 参数的默认值。LockType 参数通常仅用于基于文件的支持。

LockType 参数指定执行 SQLSetPos 后行的锁状态。如果驱动程序无法锁定行以执行请求的操作或满足 LockType参数,它将返回 SQL_ERROR 和 SQLSTATE 42000 (语法错误或访问) 。

尽管为单个语句指定了 LockType 参数,但锁对连接上的所有语句具有相同的特权。具体而言,一个连接上的一个语句获取的锁可以通过同一连接上的另一个语句解锁。

通过 SQLSetPos 锁定的行将保持锁定状态,直到应用程序为 LockType 设置为 SQL_LOCK_UNLOCK 的行调用SQLSetPos, 或者直到应用程序使用 SQL_CLOSE 选项为 语句或 SQLFreeStmt 调用 SQLFreeHandle。对于支持事务的驱动程序,当应用程序调用 SQLEndTran 提交或回滚连接 (上的事务时,如果游标在提交或回滚时关闭(如SQLGetInfo) 返回的 SQL_CURSOR_COMMIT_BEHAVIOR 和SQL_CURSOR_ROLLBACK_BEHAVIOR 信息类型所指示的,则通过 SQLSetPos 锁定的行将被解锁。

LockType 参数支持以下类型的锁。若要确定数据源支持哪些锁,应用程序使用SQL_DYNAMIC_CURSOR_ATTRIBUTES1、SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1、SQL_KEYSET_CURSOR_ATTRIBUTES1 或 SQL_STATIC_CURSOR_ATTRIBUTES1 信息类型(调用 SQLGetInfo, 具体取决于游标类型) 。

LockType 参数锁类型

LockType 参数 锁类型
SQL_LOCK_NO_CHANGE 驱动程序或数据源可确保行与调用 SQLSetPos 之前的状态相同,保持锁定或解锁状态。LockType 的此值 允许不支持显式行级锁定的数据源使用当前并发和事务隔离级别所需的任何锁定。
SQL_LOCK_EXCLUSIVE 驱动程序或数据源以独占方式锁定行。不同连接或不同应用程序中的 语句不能用于获取行上的任何锁。
SQL_LOCK_UNLOCK 驱动程序或数据源解锁行。

如果驱动程序支持SQL_LOCK_EXCLUSIVE但不支持SQL_LOCK_UNLOCK,则锁定的行将保持锁定状态,直到发生上一段落中所述的函数调用之一。

如果驱动程序支持 SQL_LOCK_EXCLUSIVE 但不支持SQL_LOCK_UNLOCK,则锁定的行将保持锁定状态,直到应用程序使用SQL_CLOSE 选项为 语句调用 SQLFreeHandle 或 SQLFreeStmt。如果驱动程序支持事务,并且提交或回滚事务时关闭游标,则应用程序将调用SQLEndTran。

对于 SQLSetPos 中的更新和删除操作,应用程序使用 LockType 参数,如下所示:

  • 为了保证行在检索后不会更改,应用程序调用 SQLSetPos, 将 Operation 设置为 SQL_REFRESH LockType 设置为 SQL_LOCK_EXCLUSIVE。

  • 如果应用程序将 LockType SQL_LOCK_NO_CHANGE,则驱动程序保证只有在为SQL_ATTR_CONCURRENCY 语句属性指定的应用程序SQL_CONCUR_LOCK更新或删除操作才成功。

  • 如果应用程序为 SQL_ATTR_CONCURRENCY 语句属性指定 SQL_CONCUR_ROWVER 或SQL_CONCUR_VALUES,则驱动程序将比较行版本或值,如果该行自应用程序提取行后已更改,则拒绝该操作。

  • 如果应用程序为 SQL_CONCUR_READ_ONLY指定SQL_ATTR_CONCURRENCY,驱动程序将拒绝任何更新或删除操作。

有关语句属性SQL_ATTR_CONCURRENCY,请参见SQLSetStmtAttr

3.50.SQLSetStmtAttr

3.50.1.功能描述

SQLSetStmtAttr设置与语句相关的属性。

3.50.2.语法

SQLRETURN SQLSetStmtAttr(
  SQLHSTMT      StatementHandle,
  SQLINTEGER    Attribute,
  SQLPOINTER    ValuePtr,
  SQLINTEGER    StringLength); 

3.50.3.参数

  • StatementHandle

    [输入]语句句柄。

  • Attribute

    [输入]要设置的选项。

  • ValuePtr

    [输入]要与属性关联的值。根据 Attribute 的值,ValuePtr 将是下列值之一:

    • ODBC 描述符句柄。

    • SQLUINTEGER 值。

    • SQLULEN 值。

    • 指向以下项之一的指针:

    • 以 null 结尾的字符串。

    • 二进制缓冲区。

    • SQLLEN、SQLULEN 或 SQLUSMALLINT 类型的值或数组。

    • 驱动程序定义的值。

    如果 Attribute 参数是特定于驱动程序的值,则 ValuePtr 可能是有符号整数。

  • StringLength

    [输入]如果 Attribute是 ODBC 定义的属性,并且 ValuePtr 指向字符串或二进制缓冲区,则此参数应为*ValuePtr 的长度。如果 Attribute 是 ODBC 定义的属性,ValuePtr 是整数,则忽略StringLength。

    • 如果 Attribute 是驱动程序定义的属性,则应用程序通过设置 StringLength参数向驱动程序管理器指示属性的性质。StringLength可以具有以下值:

    • 如果 ValuePtr 是指向字符串的指针,则 StringLength 是字符串或字符串SQL_NTS的长度。

    • 如果 ValuePtr是指向二进制缓冲区的指针,则应用程序将SQL_LEN_BINARY_ATTR(LENGTH)宏的结果放置于BufferLength。这会在StringLength 中设置负值。

    • 如果 ValuePtr 是指向字符串或二进制字符串外值的指针,则 StringLength的值应SQL_IS_POINTER。

    • 如果 ValuePtr 包含固定长度的值,根据实际情况,StringLength的值是 SQL_IS_INTEGER或SQL_IS_UINTEGER。

3.50.4.返回值

SQL_SUCCESS SQL_SUCCESS_WITH_INFO、SQL_ERROR或SQL_INVALID_HANDLE。

3.50.5.诊断

当 SQLSetStmtAttr 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可能通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLSetStmtAttr 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为"(DM)"位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则与每个 SQLSTATE 值联合返回的代码是 SQL_ERROR。

SQLSetStmtAttr 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改

驱动程序不支持 ValuePtr 中指定的值,或者 ValuePtr 中指定的值由于实现工作环境而无效,因此驱动程序替换了类似的值。(SQLGetStmtAttr 来确定暂时替换的值。) 替换值对 StatementHandle 有效,直到游标关闭,此时语句属性将恢复为以前的值。

可更改的语句属性包括:SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、SQL_ATTR_KEYSET_SIZE、SQL_ATTR_MAX_LENGTH 、SQL_ATTR_MAX_ROWS 、SQL_ATTR_QUERY_TIMEOUT、 SQL_ATTR_ROW_ARRAY_SIZE 、SQL_ATTR_SIMULATE_CURSOR。

函数返回 SQL_SUCCESS_WITH_INFO。

08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
24000 游标状态无效 属性SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、 SQL_ATTR_SIMULATE_CURSOR 或 SQL_ATTR_USE_BOOKMARKS,并且游标已打开。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY009 null 指针的使用无效 Attribute 参数标识了需要字符串属性的语句属性,ValuePtr 参数为 null 指针。
HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLSetStmtAttr 函数时,此异步函数仍在执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。

(DM) 为 StatementHandle 调用了一个异步执行函数,在调用此函数时仍在执行。

(调用了 SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。

HY011 现在无法设置属性 属性已 SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、SQL_ATTR_SIMULATE_CURSOR或SQL_ATTR_USE_BOOKMARKS,并且语句已准备就绪。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY017 使用自动分配的描述符句柄无效

(DM) Attribute 参数已SQL_ATTR_IMP_ROW_DESC或SQL_ATTR_IMP_PARAM_DESC。

(DM) Attribute 参数为 SQL_ATTR_APP_ROW_DESC 或 SQL_ATTR_APP_PARAM_DESC,ValuePtr 中的值是隐式分配的描述符句柄,而不是最初为 ARD 或 APD 分配的句柄。

HY024 属性值无效

给定指定的 Attribute 值 ,ValuePtr 中指定了无效值。(驱动程序管理器仅针对接受一组离散值(如值或值集)的连接和语句属性SQL_ATTR_ACCESS_MODE SQLSTATE SQL_ATTR_ASYNC_ENABLE。对于所有其他连接和语句属性,驱动程序必须验证 ValuePtr。)

Attribute 参数SQL_ATTR_APP_ROW_DESC或 SQL_ATTR_APP_PARAM_DESC,ValuePtr 是显式分配的描述符句柄,与 StatementHandle 参数不在同一连接上。

HY090 字符串或缓冲区长度无效 (DM) *ValuePtr 是一个字符串,并且 StringLength 参数小于 0,但没有SQL_NTS。
HY092 无效的属性/选项标识符

(DM) 为参数属性指定的值对于该驱动程序支持的 ODBC 版本无效。

(DM) 为参数属性指定的值为只读属性。

HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

为 argument 特性指定的值为驱动程序支持的 odbc 版本的有效 odbc 语句属性,但驱动程序不支持该属性。

特性参数已 SQL_ATTR_ASYNC_ENABLE,对 InfoType 为 SQL_ASYNC_MODE 的 SQLGetInfo 的调用返回 SQL_AM_CONNECTION。

特性参数 SQL_ATTR_ENABLE_AUTO_IPD,而连接属性 SQL_ATTR_AUTO_IPD 的值 SQL_FALSE 为。

HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
S1118 驱动程序不支持异步通知 如果调用 SQLSetStmtAttr SQL_ATTR_ASYNC_STMT_EVENT 设置,则为;驱动程序不支持异步通知。

3.51.SQLSpecialColumns

3.51.1.功能描述

SQLSpecialColumns检索有关指定表中的列的下列信息:

  • 唯一标识表中行的一组最佳列。

  • 当事务更新行中的任何值时,自动更新的列。

3.51.2.语法

SQLRETURN SQLSpecialColumns(
  SQLHSTMT      StatementHandle, 
  SQLSMALLINT   IdentifierType,
  SQLCHAR *     CatalogName,
  SQLSMALLINT   NameLength1,
  SQLCHAR *     SchemaName,
  SQLSMALLINT   NameLength2,
  SQLCHAR *     TableName,
  SQLSMALLINT   NameLength3,
  SQLSMALLINT   Scope,
  SQLSMALLINT   Nullable); 

3.51.3.参数

  • StatementHandle

    [输入]语句句柄。

  • IdentifierType

    [输入]要返回的列的类型。必须是以下值之一:

    • SQL_BEST_ROWID:通过从一列或多列检索值来返回最优列或一组列,允许唯一标识指定表中的任何行。列可以是专门为此目的而设计的伪列 (如 Oracle ROWID 或 Ingres TID) 或表的任何唯一索引的一个或多个列。

    • SQL_ROWVER:返回指定表中的一个或多个列(如果有),当任何事务更新行中的任何值时,该列或列将由数据源自动更新, (如SQLBase ROWID 或 Sybase TIMESTAMP) 中所示。

  • CatalogName

    [输入]表的目录名称。如果驱动程序为某些表(而不是其他表)支持目录,例如当驱动程序从不同 DBMS检索数据时(例如,当驱动程序检索不同 DBMS的数据时),则空字符串 ("") 表示这些表没有目录。CatalogName不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 CatalogName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 CatalogName是普通参数;它按原义处理,其大小写有意义。

  • NameLength1

    [输入]*CatalogName中的字符的长度。

  • SchemaName

    [输入]表的模式名称。如果驱动程序支持某些表的模式,而不支持其他表的模式(例如,当驱动程序从不同 DBMS 检索数据时),则空字符串("") 表示不具有模式的那些表。SchemaName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 SchemaName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 SchemaName是普通参数;它按原义处理,其大小写有意义。

  • NameLength2

    [输入]*SchemaName中的字符的长度。

  • TableName

    [输入]表名称。此参数不能为 null 指针。TableName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 TableName将被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 TableName为普通参数;它按原义处理,其大小写有意义。

  • NameLength3

    [输入]*TableName的长度。

  • Scope

    [输入]Rowid 所需的最小范围。返回的 rowid 的作用域可能更大。必须是下列选项之一:

    • SQL_SCOPE_CURROW:仅当定位在该行上时,rowid 才能保证有效。如果行已由其他事务更新或删除,则以后使用rowid 重新选择的可能不会返回一行。

    • SQL_SCOPE_TRANSACTION:保证 rowid 在当前事务的持续时间内有效。

    • SQL_SCOPE_SESSION:保证 rowid 在会话的持续时间内保持有效()的事务边界。

  • Nullable

    [输入]确定是否返回可以具有 NULL 值的特殊列。必须是下列选项之一:

    • SQL_NO_NULLS:排除可以具有 NULL 值的特殊列。某些驱动程序无法支持 SQL_NO_NULLS,如果指定SQL_NO_NULLS,则这些驱动程序将返回空结果集。应用程序应为此情况做好准备,并且仅当绝对需要时才请求SQL_NO_NULLS。

    • SQL_NULLABLE:返回特殊列,即使它们可以具有 NULL 值也是如此。

3.51.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.51.5.诊断

当 SQLSpecialColumns 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLSpecialColumns 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为"(DM)"位于驱动程序管理器返回的 SQLSTATEs的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码为SQL_ERROR。

SQLSpecialColumns 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标,并且调用了 SQLFetch 或 SQLFetchScroll 。如果未 SQL_NO_DATA 返回 SQLFetch 或 SQLFetchScroll ,驱动程序管理器将返回此错误,如果 SQLFetch 或 SQLFetchScroll 已返回 SQL_NO_DATA,则由驱动程序返回。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll 。

40001 序列化失败 由于另一个事务发生了资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE * MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle 。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY009 空值指针的使用无效

TableName 参数为 null 指针。

SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE, CatalogName 参数为 null 指针,SQL_CATALOG_NAME 的 InfoType 返回支持的目录名称。

(DM) SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,并且 SchemaName 参数为 null 指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLSpecialColumns 时仍在执行此函数。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 一个长度参数的值小于0但不等于 SQL_NTS。

其中一个长度参数的值超过了对应名称的最大长度值。可以通过使用 InfoType 值调用 SQLGetInfo 来获取每个名称的最大长度: SQL_MAX_CATALOG_NAME_LEN、SQL_MAX_SCHEMA_NAME_LEN 或 SQL_MAX_TABLE_NAME_LEN。

HY097 列类型超出范围 (DM) 指定了无效的 IdentifierType 值。
HY098 范围类型超出范围 (DM) 指定的范围值无效。
HY099 可以为 null 的类型超出范围 (DM) 指定了无效的可以为 Null 的值。
HY117 由于未知的事务状态,连接被挂起。仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

指定了一个目录,但该驱动程序或数据源不支持目录。

指定了模式,但驱动程序或数据源不支持模式。

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回请求的结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.52.SQLStatistics

3.52.1.功能描述

SQLStatistics 检索与表相关联的单个表和索引的统计信息列表。驱动程序将以结果集的形式返回该信息。

3.52.2.语法

SQLRETURN SQLStatistics(
  SQLHSTMT        StatementHandle,
  SQLCHAR *       CatalogName,
  SQLSMALLINT     NameLength1,
  SQLCHAR *       SchemaName,
  SQLSMALLINT     NameLength2,
  SQLCHAR *       TableName,
  SQLSMALLINT     NameLength3,
  SQLUSMALLINT    Unique,
  SQLUSMALLINT    Reserved); 

3.52.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CatalogName

    [输入]目录名称。如果驱动程序为某些表(而不是其他表)支持目录,例如当驱动程序从不同 DBMS 检索数据时(例如,当驱动程序检索不同DBMS 的数据时),则空字符串( "" ) 指示这些表没有目录。CatalogName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 CatalogName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 CatalogName是普通参数;它按原义处理,其大小写有意义。

  • NameLength1

    [输入]*CatalogName中的字符的长度。

  • SchemaName

    [输入]模式名称。如果驱动程序支持某些表的模式,而不支持其他表的模式(例如,当驱动程序从不同 DBMS 检索数据时),则空字符串 ("") 指示不具有模式的那些表。SchemaName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 SchemaName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 SchemaName是普通参数;它按原义处理,其大小写有意义。

  • NameLength2

    [输入]*SchemaName中的字符的长度。

  • TableName

    [输入]表名称。此参数不能为 null 指针。SchemaName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 TableName将被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 TableName为普通参数;它按原义处理,其大小写有意义。

  • NameLength3

    [输入]*TableName的长度。

  • Unique

    [输入]索引的类型:SQL_INDEX_UNIQUE 或 SQL_INDEX_ALL。

  • Reserved

    [输入]指示结果集中基数列和页列的重要性。以下选项只影响基数列和页列的返回值;即使未返回基数和页,也会返回索引信息。

    SQL_ENSURE 请求驱动程序无条件检索统计信息。仅符合开放组标准且不支持 ODBC 扩展的 (驱动程序将不能支持SQL_ENSURE。)

    SQL_QUICK 请求,驱动程序仅在服务器可轻松使用时才检索基数和页面。在这种情况下,驱动程序不能保证是最新值。

3.52.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.52.5.诊断

当 SQLStatistics 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLStatistics 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为 "(DM)" 位于驱动程序管理器返回的SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLStatistics 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标,并且调用了 SQLFetch 或 SQLFetchScroll 。如果未 SQL_NO_DATA 返回 SQLFetch 或 SQLFetchScroll ,驱动程序管理器将返回此错误,如果 SQLFetch 或 SQLFetchScroll 已返回 SQL_NO_DATA,则由驱动程序返回。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll 。

40001 序列化失败 由于另一个事务发生资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。*MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle ,然后在 StatementHandle 上再次调用了该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY009 空值指针的使用无效

TableName 参数为 null 指针。

SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,CatalogName 参数为 null 指针,SQL_CATALOG_NAME 的 InfoType 返回支持的目录名称。

(DM) SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,并且 SchemaName 参数为 null 指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLStatistics 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 一个名称长度参数的值小于0但不等于 SQL_NTS。

名称长度参数之一的值超出了相应名称的最大长度值。

HY100 唯一性选项类型超出了范围 (DM) 指定了无效的唯一值。
HY101 准确性选项类型超出了范围 (DM) 指定了无效的保留值。
HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

指定了一个目录,但该驱动程序或数据源不支持目录。

指定了模式,但驱动程序或数据源不支持模式。

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回请求的结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync ,以执行后处理并完成操作。

3.53.SQLTablePrivileges

3.53.1.功能描述

SQLTablePrivileges返回表列表和与每个表关联的权限。驱动程序将该信息作为指定语句的结果集返回。

3.53.2.语法

SQLRETURN SQLTablePrivileges(
  SQLHSTMT      StatementHandle,
  SQLCHAR *     CatalogName,
  SQLSMALLINT   NameLength1,
  SQLCHAR *     SchemaName,
  SQLSMALLINT   NameLength2,
  SQLCHAR *     TableName,
  SQLSMALLINT   NameLength3); 

3.53.3.参数

  • StatementHandle

    [输入]语句句柄。

  • CatalogName

    [输入]表目录。如果驱动程序为某些表(而不是其他表)支持目录,例如当驱动程序从不同 DBMS 检索数据时(例如,当驱动程序检索不同DBMS 的数据时),则空字符串 ( "" ) 表示这些表没有目录。CatalogName 不能包含字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 CatalogName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 CatalogName是普通参数;它按原义处理,其大小写有意义。

  • NameLength1

    [输入]*CatalogName中的字符的长度。

  • SchemaName

    [输入]模式名称的字符串搜索模式。如果驱动程序支持某些表的模式,而不支持其他表的模式(例如,当驱动程序从不同 DBMS检索数据时),则空字符串( "" )表示不具有模式的那些表。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 SchemaName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 SchemaName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength2

    [输入]*SchemaName中的字符的长度。

  • TableName

    [输入]表名的字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 TableName将被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 TableName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength3

    [输入]*TableName的长度。

3.53.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.53.5.诊断

当 SQLTablePrivileges 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用HandleType 的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了通常由 SQLTablePrivileges 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为 "(DM)" 位于驱动程序管理器返回的 SQLSTATEs的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是 SQL_ERROR。

SQLTablePrivileges 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标,并且调用了 SQLFetch 或 SQLFetchScroll 。如果未 SQL_NO_DATA 返回 SQLFetch 或 SQLFetchScroll ,驱动程序管理器将返回此错误,如果 SQLFetch 或 SQLFetchScroll 已返回 SQL_NO_DATA,则由驱动程序返回。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll 。

40001 序列化失败 由于另一个事务发生了资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。调用 SQLTablePrivileges 函数,并在其完成执行之前,对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle 。然后,在 StatementHandle 上再次调用 SQLTablePrivileges 函数。

调用 SQLTablePrivileges 函数,并在其完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle。

HY009 空值指针的使用无效

SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE, CatalogName 参数为 null 指针,SQL_CATALOG_NAME 的 InfoType 返回支持的目录名称。

(DM) SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,并且 SchemaName 或 TableName 参数为 null 指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLTablePrivileges 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数(调用 StatementHandle)调用此函数时,该函数仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 一个名称长度参数的值小于0但不等于 SQL_NTS。

名称长度参数之一的值超出了相应限定符或名称的最大长度值。

HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

指定了一个目录,但该驱动程序或数据源不支持目录。

指定了模式,但驱动程序或数据源不支持模式。

为表模式、表名称或列名称指定了字符串搜索模式,并且数据源不支持其中一个或多个参数的搜索模式。

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync,以执行后处理并完成操作。

3.54.SQLTables

3.54.1.功能描述

SQLTables返回存储在特定数据源中的表、目录或模式名称以及表类型的列表。驱动程序将以结果集的形式返回该信息。

3.54.2.语法

SQLRETURN SQLTables(
  SQLHSTMT       StatementHandle,
  SQLCHAR *      CatalogName,
  SQLSMALLINT    NameLength1,
  SQLCHAR *      SchemaName,
  SQLSMALLINT    NameLength2,
  SQLCHAR *      TableName,
  SQLSMALLINT    NameLength3,
  SQLCHAR *      TableType,
  SQLSMALLINT    NameLength4); 

3.54.3.参数

  • StatementHandle

    [输入]检索结果的语句句柄。

  • CatalogName

    [输入]表的目录名。如果SQL_ODBC_VERSION环境属性SQL_OV_ODBC3,则CatalogName参数接受搜索模式;如果设置了SQL_OV_ODBC2,则它不接受搜索模式。如果驱动程序支持某些表目录,但不支持其他表的目录,例如当驱动程序从不同DBMS检索数据时,空字符串( "" )表示那些没有目录的表。

    如果SQL_ATTR_METADATA_ID语句属性设置为SQL_TRUE,则 CatalogName被视为标识符,其大小写没有意义。如果SQL_FALSE,则 CatalogName为模式值参数;按照字面意思处理处理,并且它的大小写是有意义的。

  • NameLength1

    [输入]*CatalogName中的字符的长度。

  • SchemaName

    [输入]模式名称的字符串搜索模式。如果驱动程序支持某些表的模式,而不支持其他表的模式(例如,当驱动程序从不同 DBMS检索数据时),则空字符串("")指示不具有模式的那些表。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 SchemaName被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 SchemaName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength2

    [输入]*SchemaName中的字符的长度。

  • TableName

    [输入]表名的字符串搜索模式。

    如果 SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,则 TableName将被视为标识符,并且其大小写无意义。如果 SQL_FALSE,则 TableName为模式值参数;它按原义处理,其大小写有意义。

  • NameLength3

    [输入]*TableName的长度。

  • TableType

    [输入]要匹配的表类型的列表。

    请注意,SQL_ATTR_METADATA_ID 语句特性对 TableType 参数无效。TableType是一个值列表参数,而不考虑 SQL_ATTR_METADATA_ID 的设置。

  • NameLength4

    [输入]*TableType的长度。

3.54.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.54.5.诊断

当 SQLTables 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过使用 HandleType的 SQL_HANDLE_STMT 和 StatementHandle 的句柄调用 SQLGetDiagRec 来获取关联的SQLSTATE 值。下表列出了通常由 SQLTables 返回的 SQLSTATE值,并对该函数的上下文中的每个值进行了说明:标注为“(DM)”位于驱动程序管理器返回的 SQLSTATEs 的说明之前。除非另有说明,否则与每个 SQLSTATE 值相关联的返回代码是SQL_ERROR。

SQLTables 诊断代码

SQLSTATE 错误 说明
01000 一般警告 驱动程序特定的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 在函数完成处理之前,驱动程序与连接到的数据源之间的通信链接失败。
24000 无效的游标状态

在 StatementHandle 上打开了游标,并且调用了 SQLFetch 或 SQLFetchScroll 。如果未 SQL_NO_DATA 返回 SQLFetch 或 SQLFetchScroll ,驱动程序管理器将返回此错误,如果 SQLFetch 或 SQLFetchScroll 已返回 SQL_NO_DATA,则由驱动程序返回。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetch 或 SQLFetchScroll 。

40001 序列化失败 由于另一个事务发生资源死锁,事务已回滚。
40003 语句完成情况未知 在执行此函数的过程中关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生了一个错误,该错误没有特定的 SQLSTATE,没有为其定义实现特定的 SQLSTATE。* MessageText 缓冲区中的 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成此函数所需的内存。
HY008 操作已取消

已为 StatementHandle 启用异步处理。函数被调用,在完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle。然后,在 StatementHandle 上再次调用该函数。

函数被调用,在完成执行之前,从多线程应用程序中的另一个线程调用 StatementHandle 上的 SQLCancel 或 SQLCancelHandle 。

HY009 空值指针的使用无效

SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE, CatalogName 参数为 null 指针,SQL_CATALOG_NAME 的 InfoType 返回支持的目录名称。

(DM) SQL_ATTR_METADATA_ID 语句特性设置为 SQL_TRUE,并且 SchemaName 或 TableName 参数为 null 指针。

HY010 函数序列错误

(DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLTables 时仍在执行此异步函数。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect 或 SQLMoreResults ,并返回 SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用此函数。

(DM) 异步执行的函数 (不是为 StatementHandle 调用了这一) ,并且在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用 SQLExecute、 SQLExecDirect、 SQLBulkOperations 或 SQLSetPos ,并返回 SQL_NEED_DATA。在为所有执行时数据参数或列发送数据之前,将调用此函数。

HY013 内存管理错误 未能处理函数调用,原因可能是由于内存不足而无法访问基础内存对象。
HY090 字符串或缓冲区长度无效

(DM) 一个长度参数的值小于0但不等于 SQL_NTS。

名称长度参数之一的值超出了相应名称的最大长度值。

HY117 由于未知的事务状态,连接被挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的详细信息,请参见SQLEndTran函数。
HYC00 未实现的可选功能

指定了一个目录,但该驱动程序或数据源不支持目录。

指定了模式,但驱动程序或数据源不支持模式。

为目录名称、表模式或表名称指定了字符串搜索模式,并且数据源不支持其中一个或多个参数的搜索模式。

驱动程序或数据源不支持 SQL_ATTR_CONCURRENCY 和 SQL_ATTR_CURSOR_TYPE 语句特性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS 语句特性设置为 SQL_UB_VARIABLE,并且 SQL_ATTR_CURSOR_TYPE 语句特性设置为该驱动程序不支持书签的游标类型。

HYT00 超时时间已到 在数据源返回请求的结果集之前,查询超时期限已过期。超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 连接超时已过期 连接超时期限在数据源响应请求之前过期。连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此功能 (DM) 与 StatementHandle 关联的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 无论何时使用通知模型,都将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上先前的异步操作 如果句柄上的上一个函数调用返回 SQL_STILL_EXECUTING 并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync,以执行后处理并完成操作。

3.55.SQLGetConnectAttr

3.55.1.功能描述

SQLGetConnectAttr返回连接属性的当前设置。

3.55.2.语法

SQLRETURN SQLGetConnectAttr(
  SQLHDBC        ConnectionHandle,
  SQLINTEGER     Attribute,
  SQLPOINTER     ValuePtr,
  SQLINTEGER     BufferLength,
  SQLINTEGER *   StringLengthPtr);

3.55.3.参数

  • ConnectionHandle

    [输入]连接句柄。

  • Attribute

    [输入]要检索的属性。

  • ValuePtr

    [输出]指向内存的指针,在内存中返回由 Attribute 指定的属性的当前值。对于整数类型属性,某些驱动程序可能只写入缓冲区的低32 位或 16 位,并保留高序位不变。因此,应用程序应在调用此函数之前使用 SQLULEN 的缓冲区,将值初始化为 0。

    如果 ValuePtr 为 NULL,则 StringLengthPtr 仍将返回总字节数 (不包括字符数据 null 终止字符) 可在ValuePtr 指向的缓冲区中返回。

  • BufferLength

    [输入]如果 Attribute 是 ODBC 定义的属性,并且 ValuePtr 指向字符串或二进制缓冲区,则此参数应为 *ValuePtr 的长度。如果 Attribute 是 ODBC 定义的属性, *ValuePtr 是整数,则忽略BufferLength。如果 *ValuePtr 中的值为 Unicode 字符串, (调用 SQLGetConnectAttrW)时,BufferLength 参数必须是一个偶数。

    如果 Attribute 是驱动程序定义的属性,则应用程序通过设置 BufferLength参数向驱动程序管理器指示属性的性质。BufferLength可以具有以下值:

    • 如果 *ValuePtr 是指向字符串的指针,则 BufferLength 是字符串或SQL_NTS 的长度。

    • 如果 *ValuePtr是指向二进制缓冲区的指针,则应用程序将SQL_LEN_BINARY_ATTR(LENGTH)宏的结果放置于BufferLength。这会在 BufferLength 中设置负值。

    • 如果 *ValuePtr 是指向字符串或二进制字符串外值的指针,则 BufferLength的值是SQL_IS_POINTER。

    • 如果 *ValuePtr 包含固定长度的数据类型,BufferLength视实际而定为 SQL_IS_INTEGER或SQL_IS_UINTEGER的值。

  • StringLengthPtr

    [输出]指向缓冲区的指针,在缓冲区中返回的字节总数 (Null 终止字符) *ValuePtr 中返回。如果属性值是字符串,并且可返回的字节数大于 BufferLength 减去 null终止字符的长度,则 *ValuePtr 中的数据将截断为 BufferLength 减去 null 终止字符的长度,并且驱动程序以null 结尾。

3.55.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_ERROR 或SQL_INVALID_HANDLE。

3.55.5.诊断

当 SQLGetConnectAttr 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_DBC 的HandleType 和 ConnectionHandle 句柄的 SQLGetDiagRec,从诊断数据结构获取关联的 SQLSTATE 值。下表列出了 SQLGetConnectAttr 通常返回的SQLSTATE 值,并说明了此函数上下文中的每个值;标注为"(DM) "位于驱动程序管理器返回的 SQLSTATEs 说明之前。除非另有说明,否则将指定与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLGetConnectAttr 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO.)
01004 字符串数据,右截断 *ValuePtr 中返回的数据被截断为 BufferLength 减去 null 终止字符的长度。未析构字符串值的长度在 * StringLengthPtr 中返回。(函数返回 SQL_SUCCESS_WITH_INFO.)
08003 连接未打开 (DM ) 指定了需要打开连接的属性值。
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。SQLGetDiagField 中的 MessageText 参数从诊断数据结构返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误 (CONNECTIONHandle) 调用了 SQLBrowseConnect 的 DM SQL_NEED_DATA。在 SQLBrowseConnect 返回 SQL_SUCCESS_WITH_INFO 或 SQL_SUCCESS。(为 ConnectionHandle) 调用了 SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效 (DM) *ValuePtr 是一个字符串,BufferLength 小于零但不等于 SQL_NTS。
HY092 属性/选项标识符无效 为参数 Attribute 指定的值对于驱动程序支持的 ODBC 版本无效。
HY114 驱动程序不支持连接级异步函数执行 (DM) 应用程序尝试为不支持异步连接SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE驱动程序启用异步函数执行。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能 为参数 Attribute 指定的值是驱动程序支持的 ODBC 版本的有效 ODBC 连接属性,但驱动程序不支持它。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) ConnectionHandle 对应的驱动程序不支持函数。

3.56.SQLGetEnvAttr

3.56.1.功能描述

SQLGetEnvAttrr返回环境属性的当前设置。

3.56.2.语法

SQLRETURN SQLGetEnvAttr(
  SQLHENV        EnvironmentHandle,
  SQLINTEGER     Attribute,
  SQLPOINTER     ValuePtr,
  SQLINTEGER     BufferLength,
  SQLINTEGER *   StringLengthPtr);  

3.56.3.参数

  • EnvironmentHandle

    [输入]环境句柄。

  • Attribute

    [输入]要检索的属性。

  • ValuePtr

    [输出]指向缓冲区的指针,该缓冲区返回由 Attribute 指定的特性的当前值。

    如果 ValuePtr 为 NULL,则 StringLengthPtr 仍将返回总字节数 (不包括字符数据 null 终止字符)可在ValuePtr 指向的缓冲区中返回。

  • BufferLength

    [输入]如果 ValuePtr 指向字符串,则此参数的长度应为 *ValuePtr。如果 *ValuePtr 是整数,则忽略BufferLength。如果 *ValuePtr 是一个 Unicode 字符串(调用 SQLGetEnvAttrW)时,BufferLength 参数必须是一个偶数。如果属性值不是字符串,则不使用 BufferLength。

  • StringLengthPtr

    [输出]一个指向缓冲区的指针,在缓冲区中返回的字节总数 (null 终止字符) *ValuePtr 中返回。如果属性值是字符串,并且可返回的字节数大于或等于 BufferLength,则ValuePtr 中的数据将截断为 * BufferLength 减去 null 终止字符的长度,并且驱动程序以 null 结尾。

3.56.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_ERROR 或SQL_INVALID_HANDLE。

3.56.5.诊断

当 SQLGetEnvAttr 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_ENV 的 HandleType 和 EnvironmentHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLGetEnvAttr 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为" (DM) "位于驱动程序管理器返回的 SQLSTATEs说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLGetEnvAttr 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO.)
01004 字符串数据,右截断 * ValuePtr 中返回的数据被截断为 BufferLength 减去 null 终止字符。未析构字符串值的长度在 StringLengthPtr 中返回。(函数返回 SQL_SUCCESS_WITH_INFO。)
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的SQLSTATE。* MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误 (尚未) SQL_ATTR_ODBC_VERSION SQLSetEnvAttr 设置 DM 实例。如果使用 SQLAllocHandleStd,则SQL_ATTR_ODBC_VERSION显式设置。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY092 属性/选项标识符无效 为参数 Attribute 指定的值对于驱动程序支持的 ODBC 版本无效。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能 为参数 Attribute 指定的值是驱动程序支持的 ODBC 版本的有效 ODBC 环境属性,但驱动程序不支持它。
IM001 驱动程序不支持此函数 (DM) EnvironmentHandle 对应的驱动程序不支持函数。

3.57.SQLGetStmtAttr

3.57.1.功能描述

SQLGetStmtAttr返回语句属性的当前设置。

3.57.2.语法

SQLRETURN SQLGetStmtAttr(
  SQLHSTMT        StatementHandle,
  SQLINTEGER      Attribute,
  SQLPOINTER      ValuePtr,
  SQLINTEGER      BufferLength,
  SQLINTEGER *    StringLengthPtr);  

3.57.3.参数

  • StatementHandle

    [输入]语句句柄。

  • Attribut

    [输入]要检索的属性。

  • ValuePtr

    [输出]指向缓冲区的指针,在缓冲区中返回 Attribute 中指定的属性的值。

    如果 ValuePtr 为 NULL, 则 StringLengthPtr 仍将返回总字节数(不包括字符数据 null 终止字符) 可在ValuePtr 指向的缓冲区中返回。

  • BufferLength

    [输入]如果 Attribute 是 ODBC 定义的属性,并且 ValuePtr 指向字符串或二进制缓冲区,则此参数应为 *ValuePtr 的长度。如果 Attribute 是 ODBC 定义的属性, *ValuePtr 是整数,则忽略BufferLength。如果在调用 SQLGetStmtAttrW ( *ValuePtr 中返回的值是 Unicode 字符串,)BufferLength 参数必须是一个偶数。

    如果 Attribute 是驱动程序定义的属性,则应用程序通过设置 BufferLength参数向驱动程序管理器指示属性的性质。BufferLength可以具有以下值:

    • 如果 *ValuePtr 是指向字符串的指针,则BufferLength 参数就应是字符串或字符串SQL_NTS的长度。

    • 如果 *ValuePtr是指向二进制缓冲区的指针,则应用程序将SQL_LEN_BINARY_ATTR(LENGTH)宏的结果放置于BufferLength。这会在 BufferLength 中设置负值。

    • 如果 *ValuePtr 是指向字符串或二进制字符串外值的指针,则 BufferLength的值是SQL_IS_POINTER。

    • 如果 *ValuePtr 包含固定长度的数据类型,则 BufferLengthSQL_IS_INTEGER或SQL_IS_UINTEGER值。

  • StringLengthPtr

    [输出]指向缓冲区的指针,在该缓冲区中存放 *ValuePtr中可返回的字节总数(不包括空终止字符)。如果ValuePtr是空指针,则不返回长度。如果属性值是字符串,并且可返回的字节数大于或等于BufferLength, *ValuePtr中的数据将被截断为BufferLength减去空终止字符的长度,并由驱动程序以空字符结尾。

3.57.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或 SQL_INVALID_HANDLE。

3.57.5.诊断

当 SQLGetStmtAttr 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的SQLGetDiagRec,可以获得关联的 SQLSTATE 值。下表列出了 SQLGetStmtAttr通常返回的 SQLSTATE 值,并说明了此函数上下文中的每个值;标注为" (DM) "位于驱动程序管理器返回的SQLSTATEs 说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLGetStmtAttr 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO.)
01004 字符串数据,右截断 *ValuePtr 中返回的数据被截断为 BufferLength 减去 null 终止字符的长度。未析构字符串值的长度在 StringLengthPtr 中返回。(函数返回 SQL_SUCCESS_WITH_INFO。)
24000 游标状态无效 参数 Attribute SQL_ATTR_ROW_NUMBER游标未打开,或者游标定位在结果集的开始位置或结果集的末尾之后。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。参数 MessageText 中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY010 函数序列错误 (DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLGetStmtAttr 函数时,此异步函数仍在执行。(DM) 为 StatementHandle 调用了一个异步执行函数,在调用此函数时仍在执行。(调用了 SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY090 字符串或缓冲区长度无效 (DM) *ValuePtr 是一个字符串,BufferLength 小于零,但不等于SQL_NTS。
HY092 属性/选项标识符无效 为参数 Attribute 指定的值对于驱动程序支持的 ODBC 版本无效。
HY109 光标位置无效 Attribute 参数SQL_ATTR_ROW_NUMBER,并且该行已删除或无法提取。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYC00 未实现可选功能 为参数 Attribute 指定的值是驱动程序支持的 ODBC 版本的有效 ODBC 语句属性,但驱动程序不支持它。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) StatementHandle 对应的驱动程序不支持函数。

3.58.SQLNumResultCols

3.58.1.功能描述

SQLNumResultCols返回结果集的列数。

3.58.2.语法

SQLRETURN SQLNumResultCols(
  SQLHSTMT        StatementHandle,  
  SQLSMALLINT *   ColumnCountPtr);  

3.58.3.参数

  • StatementHandle

    [输入]语句句柄。

  • ColumnCountPtr

    [输出]指向要返回结果集内列数的缓冲区的指针。此计数不包括绑定书签列。

3.58.4.返回值

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR 或SQL_INVALID_HANDLE。

3.58.5.诊断

当 SQLNumResultCols 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用具有SQL_HANDLE_STMT 的 HandleType 和 StatementHandle 句柄的 SQLGetDiagRec来获取关联的 SQLSTATE 值。下表列出了 SQLNumResultCols 通常返回的 SQLSTATE值,并说明了此函数上下文中的每个值;标注为" (DM) "位于驱动程序管理器返回的 SQLSTATEs 说明之前。除非另有说明,否则将与每个 SQLSTATE 值关联的返回代码是SQL_ERROR。

SQLNumResultCols 诊断代码

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。(函数返回 SQL_SUCCESS_WITH_INFO.)
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
HY000 常规错误 出现错误,其中没有特定的 SQLSTATE,并且未定义特定于实现的 SQLSTATE。* MessageText 缓冲区 中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消 为 StatementHandle 启用了异步处理。调用了函数,在函数完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle;然后,在 StatementHandle 上再次调用函数。调用了 函数,在函数完成执行之前,从多线程应用程序中的不同线程对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle。
HY010 函数序列错误 (DM) 为与 StatementHandle 关联的连接句柄调用了异步执行函数。调用 SQLNumResultsCols 函数时,此异步函数仍在执行。(调用了 SQLExecute) SQLExecute、SQLExecDirect 或 SQLMoreResults 的 DM,并返回SQL_PARAM_DATA_AVAILABLE。在检索所有流式处理参数的数据之前调用了此函数。(DM) 为 StatementHandle 调用 SQLPrepare 或 SQLExecDirect 之前调用了函数。(DM) 异步执行的函数 (调用 StatementHandle) 调用此函数时,该函数仍在执行。(调用了 SQLExecute) SQLExecute、SQLExecDirect、 SQLBulkOperations 或 SQLSetPos 的 DM 代码,并返回SQL_NEED_DATA。在发送所有执行时数据参数或列的数据之前,调用了此函数。有关何时可以释放语句句柄的详细信息,请参见 SQLPrepare 函数。
HY013 内存管理错误 由于内存不足,无法访问基础内存对象,因此无法处理函数调用。
HY117 连接因事务状态未知而挂起,仅允许断开连接和只读函数 (DM) 有关挂起状态的信息,请参见SQLEndTran函数。
HYT01 连接超时已过期 在数据源响应请求之前,连接超时期限已过期。连接超时期限通过 SQLSetConnectAttr、 SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,都会禁用轮询。
IM018 尚未调用 SQLCompleteAsync 以完成之前对此句柄的异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且如果启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后处理并完成操作。

当在 SQLPrepare 之前且在 SQLExecute 之后调用 SQLNumResultCols 时,SQLNumResultCols都可以返回SQLPrepare 或 SQLExecute 返回的任何 SQLSTATE ,具体取决于数据源何时计算与关联的SQL语句。

4.ODBC特性约束

4.1.数据类型的转换

  • 列类型到C数据类型的转换

    调用SQLBindCol和SQLGetData时可以参照该表。

    如果表的列定义为某种类型,那么当调用SQLGetData或者SQLBindCol时,TargeType参数只能是该数据类型对应的一行中填有"Y"的C数据类型。

    例:当表中的列定义为date,那么调用SQLGetData或者SQLBindCol时,TargetType参数就可以是SQL_C_DEFAULT,SQL_C_CHAR,SQL_C_DATE,SQL_C_TIME,SQL_C_TIMESTAMP,而不能是SQL_C_TINYINT。

    注意

    如果应用程序在SQLBindCol、SQLGetData或SQLBindParameter中指定SQL_C_DEFAULT,则驱动程序假定输出或输入缓冲区的C数据类型对应于缓冲区绑定到的列或参数的数据类型。应用程序不应使用SQL_C_DEFAULT。相反,它们应始终指定所使用的缓冲区的C类型。驱动程序无法确定列或参数的原始SQL数据类型。因此,它无法确定相应的默认C数据类型。

    列类型转换C数据类型_1

    C数据类型 表中的列定义
    SMALLINT INTEGER BIGINT NUMERIC
    DECIMAL
    FLOAT4
    REAL
    DOUBLE
    SQL_C_DEFAULT Y Y Y Y Y Y
    SQL_C_CHAR Y Y Y Y Y Y
    SQL_C_STINYINT Y Y Y Y Y Y
    SQL_C_TINYINT Y Y Y Y Y Y
    SQL_C_UTINYINT Y Y Y Y Y Y
    SQL_C_SSHORT Y Y Y Y Y Y
    SQL_C_SHORT Y Y Y Y Y Y
    SQL_C_USHORT Y Y Y Y Y Y
    SQL_C_SLONG Y Y Y Y Y Y
    SQL_C_LONG Y Y Y Y Y Y
    SQL_C_ULONG Y Y Y Y Y Y
    SQL_C_SBIGINT Y Y Y Y Y Y
    SQL_C_UBIGINT Y Y Y Y Y Y
    SQL_C_FLOAT Y Y Y Y Y Y
    SQL_C_DOUBLE Y Y Y Y Y Y
    SQL_C_BINARY
    SQL_C_BIT
    SQL_C_DATE
    SQL_C_TIME
    SQL_C_TIMESTAMP

    列类型转换C数据类型_2

    C数据类型 表中的列定义
    BIT BYTEA BOOL
    BOOLEAN
    DATE
    TIME
    TIMESTAMP
    INTERVAL
    CHAR
    VARCHAR
    TEXT
    SQL_C_DEFAULT Y Y Y
    SQL_C_CHAR Y Y Y
    SQL_C_STINYINT
    SQL_C_TINYINT
    SQL_C_UTINYINT
    SQL_C_SSHORT
    SQL_C_SHORT
    SQL_C_USHORT
    SQL_C_SLONG
    SQL_C_LONG
    SQL_C_ULONG
    SQL_C_SBIGINT
    SQL_C_UBIGINT
    SQL_C_FLOAT
    SQL_C_DOUBLE
    SQL_C_BINARY Y
    SQL_C_BIT Y Y
    SQL_C_DATE Y Y
    SQL_C_TIME Y Y
    SQL_C_TIMESTAMP Y Y
  • C数据类型到SQL数据类型的转换

    调用SQLBindParameter时可以参照该表。

    如果绑定参数的ValueType为某种C数据类型,那么当调用SQLBindParameter时,ParameterType参数只能是该C数据类型对应的一列中填有"Y"的SQL数据类型。

    例:如果绑定参数的ValueType为SQL_C_CHAR,那么调用SQLBindParameter时,ParameterType参数就可以是SQL_CHAR,SQL_VARCHAR,SQL_LONGVARCHAR,而不能是SQL_DECIMAL。

    C数据类型到SQL数据类型的转换_1

    C数据类型 SQL数据类型
    SQL_DECIMAL
    SQL_NUMERIC
    SQL_TINYINT
    SQL_SMALLINT
    SQL_BIGINT
    SQL_INTEGER SQL_REAL
    SQL_FLOAT
    SQL_DOUBLE
    SQL_BINARY
    SQL_VARBINARY
    SQL_LONGVARBINARY
    SQL_C_DEFAULT Y Y Y Y Y
    SQL_C_CHAR
    SQL_C_STINYINT Y Y Y Y
    SQL_C_TINYINT Y Y Y Y
    SQL_C_UTINYINT Y Y Y Y
    SQL_C_SSHORT Y Y Y Y
    SQL_C_SHORT Y Y Y Y
    SQL_C_USHORT Y Y Y Y
    SQL_C_SLONG Y Y Y Y
    SQL_C_LONG Y Y Y Y
    SQL_C_ULONG Y Y Y Y
    SQL_C_SBIGINT Y Y Y Y
    SQL_C_UBIGINT Y Y Y Y
    SQL_C_FLOAT Y Y Y
    SQL_C_DOUBLE Y Y Y Y
    SQL_C_BINARY Y
    SQL_C_BIT
    SQL_C_DATE
    SQL_C_TIME
    SQL_C_TIMESTAMP

    C数据类型到SQL数据类型的转换_2

    C数据类型 SQL数据类型
    SQL_CHAR
    SQL_VARCHAR
    SQL_LONGVARCHAR SQL_BIT SQL_TYPE_DATE
    SQL_TYPE_TIME
    SQL_TYPE_TIMESTAMP
    SQL_C_DEFAULT Y Y Y Y
    SQL_C_CHAR Y Y
    SQL_C_STINYINT Y
    SQL_C_TINYINT Y
    SQL_C_UTINYINT Y
    SQL_C_SSHORT Y
    SQL_C_SHORT Y
    SQL_C_USHORT Y
    SQL_C_SLONG Y
    SQL_C_LONG Y
    SQL_C_ULONG Y
    SQL_C_SBIGINT Y
    SQL_C_UBIGINT Y
    SQL_C_FLOAT Y
    SQL_C_DOUBLE Y
    SQL_C_BINARY
    SQL_C_BIT Y
    SQL_C_DATE Y Y
    SQL_C_TIME Y Y
    SQL_C_TIMESTAMP Y Y
  • 列类型到SQL数据类型的映射

    下表列出了调用SQLBindParameter时表中的列定义数据类型与SQL类型的对应关系。

    当表中的数据类型定义为第一列的某种类型,那么当调用SQLBindParameter时,ParameterType只能为其对应行中的第二列的值。如:表中的列类型为INTEGER(INT),那么对应的SQL数据类型只能为SQL_INTEGER,而不能为其它的SQL数据类型,否则数据转化将会出错。

    列定义数据类型与SQL类型的对应关系

    表中的列定义 可转换为如下SQL数据类型
    SMALLINT SQL_SMALLINT
    INTEGER SQL_INTEGER
    BIGINT SQL_BIGINT
    NUMERIC
    DECIMAL
    SQL_NUMERIC
    SQL_DECIMAL
    FLOAT4
    REAL
    SQL_REAL
    FLOAT8
    DOUBLE
    SQL_FLOAT
    SQL_DOUBLE
    BYTEA SQL_BINARY
    SQL_VARBINARY
    BOOL
    BOOLEAN
    SQL_BIT
    DATE SQL_DATE
    SQL_TYPE_DATE
    TIME SQL_TIME
    SQL_TYPE_TIME
    TIMESTAMP
    TIMESTAMPTZ
    SQL_TIMESTAMP
    SQL_TYPE_TIMESTAMP
    INTERVAL SQL_INTERVAL_MONTH
    SQL_INTERVAL_YEAR
    SQL_INTERVAL_YEAR_TO_MONTH
    SQL_INTERVAL_DAY
    SQL_INTERVAL_HOUR
    SQL_INTERVAL_MINUTE
    SQL_INTERVAL_SECOND
    SQL_INTERVAL_DAY_TO_HOUR
    SQL_INTERVAL_DAY_TO_MINUTE
    SQL_INTERVAL_DAY_TO_SECOND
    SQL_INTERVAL_HOUR_TO_MINUTE
    SQL_INTERVAL_HOUR_TO_SECOND
    SQL_INTERVAL_MINUTE_TO_SECOND
    CHAR
    VARCHAR
    SQL_CHAR
    SQL_VARCHAR
    TEXT SQL_LONGVARCHAR
    UUID SQL_GUID

5.UXDB ODBC应用程序编写指南

5.1.ODBC 应用程序编写的基本步骤

应用程序使用ODBC访问数据源,基本步骤如下所示。

  1. 调用SQLAllocHandle函数分配环境句柄。

  2. 调用SQLAllocHandle函数分配连接句柄。

  3. (可选)调用SQLSetEnvAttr函数设置环境句柄属性。

  4. (可选)调用SQLSetConnectAttr函数设置连接句柄属性。

  5. 利用分配后的连接句柄调用SQLConnect,SQLBrowseConnect或者SQLDriverConnect连接到数据源。它指定数据源名以及完成连接所需的任何附加信息。

  6. 调用函数SQLAllocHandle申请语句句柄。

  7. (可选)调用SQLPrepare函数对SQL语句和操作进行准备;如果省略此步,那么在执行时必须调用SQLExecDirect函数。

  8. (可选)如果需要绑定参数,则调用SQLBindCol、SQLBindParam等函数绑定相关的列和参数。

  9. (可选)调用SQLGetDescField, SQLColAttribute, SQLDescribeCol等函数来获取相关描述信息。

  10. 调用SQLExecute或SQLExecDirect函数执行SQL语句。

  11. 如果连接属性自动提交选项设置为手动提交状态,应用程序则需调用函数SQLEndTran来提交或回滚事务。

  12. (可选)如果需要获取结果,调用SQLFetch、SQLGetData函数获取结果。

  13. 调用函数SQLFreeHandle来释放申请的语句句柄。

  14. 调用函数SQLDisconnect来断开应用程序与数据源之间的连接。

  15. 调用函数SQLFreeHandle来释放申请的连接、环境句柄。

直接使用ODBC函数开发应用程序的基本步骤流程图如下所示。

5.2.Linux平台 ODBC应用程序开发过程

  1. 建立ODBC数据源,参见Linux平台创建ODBC数据源

  2. 编写测试应用程序odbctest.c,参见连接程序示例

  3. 编译并执行可执行程序。

    a. 使用gcc编译,如下所示。

    [uxdb@local101:~/test]$ gcc -o odbctest odbctest.c -lodbc
    [uxdb@local101:~/test]$ ls
    odbctest  odbctest.c
    [uxdb@local101:~/test]$ ./odbctest 
    connected
    disconnecting
    [uxdb@local101:~/test]$ 
    

    注意,如果UnixODBC没有安装到系统路径下,在编译时还需要指定-I/INCLUDE -L/LIBODBC。INCLUDE是如下两个头文件的绝对路径。

    #include <sql.h>
    #include <sqlext.h>
    

    LIBODBC:odbc动态库路径,按照如下方式查看,或者直接find命令查找odbc动态库的路径

    [uxdb@local101:~/test]$ odbc_config --libs
    -L/usr/lib64 -lodbc
    

    b. 编写Makefile文件,通过make编译,Makefile文件内容如下所示。

    TARGET = odbctest
    CFLAGS = -g -Wall
    CC = gcc
    
    OBJS = odbctest.o
    
    ## UnixODBC头文件对应的路径(sql.h、sqlext.h)
    CPPFLAGS = -I/usr/include
    
    ## UnixODBC库的路径
    ODBC_CONDIG = /usr/bin/odbc_config
    LIBODBC :=$(shell $(ODBC_CONDIG) --libs)
    
    $(TARGET):$(OBJS)
      $(CC) $(OBJS) -o $(TARGET) $(LIBODBC)
    
    %.o : %.c
      $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
    
    clean:
      -rm $(OBJS) $(TARGET) 
    

    执行make进行编译,编译之后执行结果如下所示。

    [uxdb@local101:~/test]$ ls
    Makefile  odbctest  odbctest.c  odbctest.o
    [uxdb@local101:~/test]$ ./odbctest 
    connected
    disconnecting
    [uxdb@local101:~/test]$
    

5.3.Windows 中 ODBC 驱动使用步骤(Visual Studio 2019)

  1. 打开Visual Studio 2019。

  2. 选择"创建新项目",在项目模板中选择"控制台应用",如下图所示,然后单击 "下一步" 。

  3. 如下配置新项目路径,完成后单击"创建"。

  4. 创建连接、断开数据库的程序,示例参见连接程序示例

  5. 在ODBC数据源管理工具中配置DNS,配置步骤参见Windows平台创建ODBC数据源

  6. 右键单击“解决方案资源管理器”中的ODBC项目,选择【生成】进行编译;选择菜单栏“调试”下的【启动调试】或者按"F5"键,执行程序。执行结果如下图所示。

    a. 选择“机器数据源”=>已配置的数据源如:UXsinoDB35W 后,单击"确定";

    b. 若数据源配置正确,参数已默认填充,单击“OK”;

    c. 观察控台输出无报错,打印连接及断开过程日志。

6.示例

6.1.连接程序示例

本示例展示了初始化创建连接和释放断开连接。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>

#ifdef _WIN32
#include <windows.h>
#endif

#include <sql.h>
#include <sqlext.h>

SQLHENV env;
SQLHDBC conn;
SQLHSTMT        hstmt ;

/* 公共接口,可使用该函数打印相关信息,也可直接调用printf */
void
print_diag(char *msg, SQLSMALLINT htype, SQLHANDLE handle)
{
	char		sqlstate[32];
	char		message[1000];
	SQLINTEGER	nativeerror;
	SQLSMALLINT textlen;
	SQLRETURN	ret;
	SQLSMALLINT	recno = 0;

	if (msg)
		printf("%s\n", msg);

	do
	{
		recno++;
		ret = SQLGetDiagRec(htype, handle, recno, sqlstate, &nativeerror,
							message, sizeof(message), &textlen);
		if (ret == SQL_INVALID_HANDLE)
			printf("Invalid handle\n");
		else if (SQL_SUCCEEDED(ret))
			printf("%s=%s\n", sqlstate, message);
	} while (ret == SQL_SUCCESS);

	if (ret == SQL_NO_DATA && recno == 1)
		printf("No error information\n");
}


void test_connect_ext(char *extraparams)
{
	SQLRETURN ret;
	SQLCHAR str[1024];
	SQLSMALLINT strl;
	SQLCHAR dsn[1024];
	const char * const test_dsn ="uxdb"; /* DSN名称即odbc.ini中配置的名字 */
	char *envvar;

	/*
	 *	Use an environment variable to switch settings of connection
	 *	strings throughout the regression test. Note that extraparams
	 *	parameters have precedence over the environment variable.
	 *	ODBC spec says
	 *		If any keywords are repeated in the connection string,
	 *		the driver uses the value associated with the first
	 *		occurrence of the keyword.
	 *	But the current uxsqlodbc driver uses the value associated with
	 *	the last occurrence of the keyword. Here we place extraparams
	 *	both before and after the value of the environment variable
	 *	so as to protect the priority order whichever way we take.
	 */
	if ((envvar = getenv("COMMON_CONNECTION_STRING_FOR_REGRESSION_TEST")) != NULL && envvar[0] != '\0')
	{
		if (NULL == extraparams)
			snprintf(dsn, sizeof(dsn), "DSN=%s;%s", test_dsn, envvar);
		else
			snprintf(dsn, sizeof(dsn), "DSN=%s;%s;%s;%s",
			 test_dsn, extraparams, envvar, extraparams);
	}
	else
		snprintf(dsn, sizeof(dsn), "DSN=%s;%s",
			 test_dsn, extraparams ? extraparams : "");

	/* 初始化ODBC的环境资源 */
	SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);

	/* 设置ODBC的版本 */
	SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
	/* 申请连接句柄 */
	SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
	/* 使用数据源名建立连接 */
    // ret = SQLConnect(conn, dsn, SQL_NTS, NULL, 0, NULL, 0);
	ret = SQLDriverConnect(conn, NULL, dsn, SQL_NTS,
						   str, sizeof(str), &strl,
						   SQL_DRIVER_COMPLETE);
	if (SQL_SUCCEEDED(ret)) {
		printf("connected\n");
	} else {
		print_diag("SQLDriverConnect failed.", SQL_HANDLE_DBC, conn);
		fflush(stdout);
		exit(1);
	}
}

void
test_disconnect(void)
{
	SQLRETURN rc;

	printf("disconnecting\n");
	rc = SQLDisconnect(conn);
	if (!SQL_SUCCEEDED(rc))
	{
		print_diag("SQLDisconnect failed", SQL_HANDLE_DBC, conn);
		fflush(stdout);
		exit(1);
	}

	rc = SQLFreeHandle(SQL_HANDLE_DBC, conn);
	if (!SQL_SUCCEEDED(rc))
	{
		print_diag("SQLFreeHandle failed", SQL_HANDLE_DBC, conn);
		fflush(stdout);
		exit(1);
	}
	conn = NULL;

	rc = SQLFreeHandle(SQL_HANDLE_ENV, env);
	if (!SQL_SUCCEEDED(rc))
	{
		print_diag("SQLFreeHandle failed", SQL_HANDLE_ENV, env);
		fflush(stdout);
		exit(1);
	}
	env = NULL;
}

int main(int argc, char **argv)
{
	/* 建立连接 */
	test_connect_ext(NULL);

	/* 断开连接 */
	test_disconnect();

	return 0;
}

6.2.字典函数的应用

本示例通过接口SQLTables的调用来说明对字典函数的使用,示例包含数据库连接与断开处理,保存为.c文件后可直接编译使用。

#include <stdio.h>
#include <sql.h>        // This is the the main include for ODBC Core functions.
#include <sqlext.h>     // This is the include for applications using the Microsoft SQL Extensions

#ifdef _WIN32
#include <windows.h>
#endif

#define STR_LEN 256

SQLHENV serverhenv = NULL;   //环境句柄
SQLHDBC serverhdbc = NULL;   //连接句柄
SQLHSTMT serverhstmt = NULL; //语句句柄
SQLRETURN retcode = 0; //结果集
SQLLEN length = 0;
int iTabNum = 0;

void ODBC_Connect();
void ODBC_Close();
void TESTSQLTables();

void ODBC_Connect()
{
    // 分配环境句柄
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &serverhenv);

    // 设置环境属性
    retcode = SQLSetEnvAttr(serverhenv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);

    if (!SQL_SUCCEEDED(retcode))
    {
        printf("AllocEnvHandle error!");
    }
    // 分配连接句柄
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc);
    if (!SQL_SUCCEEDED(retcode))
    {
        printf("AllocDbcHandle error!");
    }

    // 数据库连接
    // Set login timeout to 5 seconds
    SQLSetConnectAttr(serverhdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

    SQLCHAR OutConnStr[1024];
    SQLSMALLINT OutConnStrLen;

    // HWND desktopHandle = GetDesktopWindow();   // desktop's window handle
    retcode = SQLDriverConnect( // SQL_NULL_HDBC
        serverhdbc,
        NULL,
        (SQLCHAR *)"DSN=UXsinoDB35W",
        sizeof("DSN=UXsinoDB35W"),
        OutConnStr,
        1024,
        &OutConnStrLen,
        SQL_DRIVER_NOPROMPT); // SQL_DRIVER_COMPLETE  SQL_DRIVER_NOPROMPT 若使用SQL_DRIVER_PROMPT,可使用 window handle
    if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))
    {
        SQLTCHAR state[128] = {0};
        SQLTCHAR msg[128] = {0};
        retcode = SQLError(serverhenv, serverhdbc, serverhstmt, state, NULL, msg, sizeof(msg), NULL);
        printf("state:%s\n msg:%s\n", state, msg);
        printf("SQL_Connect error!");
    }
    else
    {
        //printf("SQL_Connect success uxsinodatabase!");
    }

    // 分配执行语句句柄
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, serverhdbc, &serverhstmt);
    if (!SQL_SUCCEEDED(retcode))
    {
        printf("Alloc serverhstmt Handle error!");
    }
}

void ODBC_Close()
{
    // 释放语句句柄
    retcode = SQLFreeHandle(SQL_HANDLE_STMT, serverhstmt);
    if (SQL_SUCCESS != retcode && SQL_SUCCESS_WITH_INFO != retcode)
        printf("free hstmt error!");

    // 断开数据库连接
    retcode = SQLDisconnect(serverhdbc);
    if (SQL_SUCCESS != retcode && SQL_SUCCESS_WITH_INFO != retcode)
        printf("disconnected error!");

    // 释放连接句柄
    retcode = SQLFreeHandle(SQL_HANDLE_DBC, serverhdbc);
    if (SQL_SUCCESS != retcode && SQL_SUCCESS_WITH_INFO != retcode)
        printf("free hdbc error!");

    // 释放环境句柄句柄
    retcode = SQLFreeHandle(SQL_HANDLE_ENV, serverhenv);
    if (SQL_SUCCESS != retcode && SQL_SUCCESS_WITH_INFO != retcode)
        printf("free henv error!");
}

void TESTSQLTables()
{
    SQLCHAR        szCatalog[STR_LEN] = "";
    SQLCHAR        szSchema[STR_LEN] = "";
    SQLCHAR        szTableName[STR_LEN] = "";
    SQLCHAR        szTableType[STR_LEN] = "";
    SQLCHAR        szRemarks[STR_LEN] = "";

    SQLRETURN      retcode;
    SQLHSTMT       hstmt;

    /* 为可返回的结果集, 声明接收缓冲区 */
    SQLLEN         cbCatalog, cbSchema, cbTableName, cbTableType, cbRemarks;

    /* 使用前必须分配语句句柄 */
    retcode = SQLAllocStmt(serverhdbc, &hstmt);

    /* 直接执行DDL语句 */
    retcode = SQLExecDirect(hstmt, (SQLCHAR *)"CREATE TABLE tb1(c1 int)", SQL_NTS);

    /* 获取数据库的"tb1"表的元信息 */
    retcode = SQLTables(hstmt, NULL, 0, NULL, 0, (SQLCHAR*)"tb1", SQL_NTS, NULL, 0);
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
         /* 把接收缓冲区关联到返回列上 */
        SQLBindCol(hstmt, 1, SQL_C_CHAR, szCatalog, STR_LEN, &cbCatalog);
        SQLBindCol(hstmt, 2, SQL_C_CHAR, szSchema, STR_LEN, &cbSchema);
        SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName, STR_LEN, &cbTableName);
        SQLBindCol(hstmt, 4, SQL_C_CHAR, szTableType, STR_LEN, &cbTableType);
        SQLBindCol(hstmt, 5, SQL_C_CHAR, szRemarks, STR_LEN, &cbRemarks);
        while (1)
        {
            /* 对行数据进行循环取值*/
            retcode = SQLFetch(hstmt);
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
                printf("Catalog = %s, Schema = %s, TableName = %s, TableType = %s, Remarks = %s\n",
                       szCatalog, szSchema, szTableName, szTableType, szRemarks);
            else
                break;
        }
    }
    else
        printf("Error!\n");

    /* 释放语句句柄*/
    retcode = SQLFreeStmt(hstmt, SQL_CLOSE);

    /* 删除测试表*/
    retcode = SQLExecDirect(hstmt, (SQLCHAR *)"DROP TABLE tb1", SQL_NTS);

    retcode = SQLFreeStmt(hstmt, SQL_DROP);
}

int main(int argc, char *argv[])
{
    // 连接数据库
    ODBC_Connect();

    TESTSQLTables();

    // 断开连接
    ODBC_Close();

    return 0;
}

6.3.批量DML

本示例展示批量DML操作,涉及函数接口如下:SQLSetConnectAttr,SQLPrepare,SQLSetStmtAttr,SQLBindParameter,SQLExecute,示例包含数据库连接与断开处理,保存为.c文件后可直接编译使用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sql.h>        // This is the the main include for ODBC Core functions.
#include <sqlext.h>     // This is the include for applications using the Microsoft SQL Extensions

#ifdef _WIN32
#include <windows.h>
#endif

#define STR_LEN 256

SQLHENV serverhenv = NULL;   //环境句柄
SQLHDBC serverhdbc = NULL;   //连接句柄
SQLHSTMT serverhstmt = NULL; //语句句柄
SQLRETURN retcode = 0; //结果集
SQLLEN length = 0;
int iTabNum = 0;

void output_result(SQLRETURN rc, HSTMT stmt, int repcnt, SQLUSMALLINT status[]);
void ODBC_Connect();
void ODBC_Close();
void print_diag(char *msg, SQLSMALLINT htype, SQLHANDLE handle);
int Batch_inset_all_sucess();

void output_result(SQLRETURN rc, HSTMT stmt, int repcnt, SQLUSMALLINT status[])
{
    int i = 0;

    printf("insert into test_batch returns %d\n", rc);
    if (!SQL_SUCCEEDED(rc))
        print_diag("", SQL_HANDLE_STMT, stmt);

    for (i = 0; i < repcnt; i++)
    {
        printf("row: %d, status: %s\n", i,
            (status[i] == SQL_PARAM_SUCCESS ? "success" :
             (status[i] == SQL_PARAM_UNUSED ? "unused" :
              (status[i] == SQL_PARAM_ERROR ? "error" :
              (status[i] == SQL_PARAM_SUCCESS_WITH_INFO ? "success_with_info" : "????")))));
    }
}

void ODBC_Connect()
{
    // 分配环境句柄
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &serverhenv);

    // 设置环境属性
    retcode = SQLSetEnvAttr(serverhenv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);

    if (!SQL_SUCCEEDED(retcode))
    {
        printf("AllocEnvHandle error!");
    }
    // 分配连接句柄
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc);
    if (!SQL_SUCCEEDED(retcode))
    {
        printf("AllocDbcHandle error!");
    }

    // 数据库连接
    // Set login timeout to 5 seconds
    SQLSetConnectAttr(serverhdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

    SQLCHAR OutConnStr[1024];
    SQLSMALLINT OutConnStrLen;

    // HWND desktopHandle = GetDesktopWindow();   // desktop's window handle
    retcode = SQLDriverConnect( // SQL_NULL_HDBC
        serverhdbc,
        NULL,
        (SQLCHAR *)"DSN=UXsinoDB35W",
        sizeof("DSN=UXsinoDB35W"),
        OutConnStr,
        1024,
        &OutConnStrLen,
        SQL_DRIVER_NOPROMPT); // SQL_DRIVER_COMPLETE  SQL_DRIVER_NOPROMPT 若使用SQL_DRIVER_PROMPT,可使用 window handle
    if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))
    {
        SQLTCHAR state[128] = {0};
        SQLTCHAR msg[128] = {0};
        retcode = SQLError(serverhenv, serverhdbc, serverhstmt, state, NULL, msg, sizeof(msg), NULL);
        printf("state:%s\n msg:%s\n", state, msg);
        printf("SQL_Connect error!");
    }
    else
    {
        //printf("SQL_Connect success uxsinodatabase!");
    }

    //分配执行语句句柄
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, serverhdbc, &serverhstmt);
    if (!SQL_SUCCEEDED(retcode))
    {
        printf("Alloc serverhstmt Handle error!");
    }
}

void ODBC_Close()
{
    // 释放语句句柄
    retcode = SQLFreeHandle(SQL_HANDLE_STMT, serverhstmt);
    if (SQL_SUCCESS != retcode && SQL_SUCCESS_WITH_INFO != retcode)
        printf("free hstmt error!");

    // 断开数据库连接
    retcode = SQLDisconnect(serverhdbc);
    if (SQL_SUCCESS != retcode && SQL_SUCCESS_WITH_INFO != retcode)
        printf("disconnected error!");

    // 释放连接句柄
    retcode = SQLFreeHandle(SQL_HANDLE_DBC, serverhdbc);
    if (SQL_SUCCESS != retcode && SQL_SUCCESS_WITH_INFO != retcode)
        printf("free hdbc error!");

    // 释放环境句柄句柄
    retcode = SQLFreeHandle(SQL_HANDLE_ENV, serverhenv);
    if (SQL_SUCCESS != retcode && SQL_SUCCESS_WITH_INFO != retcode)
        printf("free henv error!");
}

/* 批量参数数组的行数 */
#define ARRAY_SIZE 20

/* 打印诊断信息 */
void print_diag(char *msg, SQLSMALLINT htype, SQLHANDLE handle)
{
     char          sqlstate[32];
     char          message[1000];
     SQLINTEGER     nativeerror;
     SQLSMALLINT textlen;
     SQLRETURN     ret;
     SQLSMALLINT     recno = 0;

     if (msg)
          printf("%s\n", msg);

     do
     {
          recno++;
          /* 获取诊断信息 */
          ret = SQLGetDiagRec(htype, handle, recno, (SQLCHAR*)sqlstate, &nativeerror,
               (SQLCHAR*)message, sizeof(message), &textlen);
          if (ret == SQL_INVALID_HANDLE)
               printf("Invalid handle\n");
          else if (SQL_SUCCEEDED(ret))
               printf("%s=%s\n", sqlstate, message);
     } while (ret == SQL_SUCCESS);

     if (ret == SQL_NO_DATA && recno == 1)
          printf("No error information\n");
}

/* 批量插入数据的样例 */
int Batch_inset_all_sucess()
{
    SQLRETURN rc;
    HSTMT hstmt = SQL_NULL_HSTMT;
    char *sql;
    int i;

    SQLUINTEGER int_array[ARRAY_SIZE];
    char *param1_float;
    char *param1_timestamp;
    char *param1_char;
    char *param1_varchar;
    SQLLEN nCount = 0;

    SQLLEN int_ind_array[ARRAY_SIZE];
    SQLLEN str_ind_array[ARRAY_SIZE];
    SQLUSMALLINT status_array[ARRAY_SIZE];
    SQLULEN nprocessed;

    /* 开启批量DML优化参数 */
    /* test_connect_ext("BatchInsertSize_Ext=1"); */

    /* 申请语句句柄 */
    rc = SQLAllocHandle(SQL_HANDLE_STMT, serverhdbc, &hstmt);
    if (!SQL_SUCCEEDED(rc))
    {
        print_diag("failed to allocate stmt handle", SQL_HANDLE_DBC, serverhdbc);
        exit(1);
    }

    /* 准备表*/
    rc = SQLExecDirect(hstmt, (SQLCHAR *)"drop table if exists tmptable", SQL_NTS);
    if (!SQL_SUCCEEDED(rc))
    {
        print_diag("SQLExecDirect failed while creating temp table", SQL_HANDLE_STMT, hstmt);
        exit(1);
    }

    sql = "CREATE TABLE tmptable (c1 int4 primary key, c2 varchar, c3 char(2) \
    , c4 NUMBER(4,2), c5 NUMBER(4, 2), c6 timestamp, c7 char(4) \
    ,  c8 char(4), c9 char(4), c10 char(4), c11 char(4))";

    rc = SQLExecDirect(hstmt, (SQLCHAR *)sql, SQL_NTS);
    if (!SQL_SUCCEEDED(rc))
    {
        print_diag("SQLExecDirect failed while creating temp table", SQL_HANDLE_STMT, hstmt);
        exit(1);
    }

    /* 释放语句句柄 */
    rc = SQLFreeStmt(hstmt, SQL_CLOSE);
    if (!SQL_SUCCEEDED(rc))
    {
        print_diag("SQLFreeStmt failed", SQL_HANDLE_STMT, hstmt);
        exit(1);
    }

    int nVarcharLength = 0;
    int nCharLength = 0;
    int nLength_time = 0;
    int nLength_lob = 0;
    int param1_float_length = 5;
    int param1_timestamp_length = 21;
    int param1_varchar_length = 5;
    int param1_char_length = 3;

    /* 申请缓存区 */
    param1_float = (char*)malloc(ARRAY_SIZE * param1_float_length);
    memset(param1_float, 0, ARRAY_SIZE * param1_float_length * sizeof(char));

    param1_timestamp = (char*)malloc(ARRAY_SIZE * param1_timestamp_length * sizeof(char));
    memset(param1_timestamp, 0, ARRAY_SIZE * param1_timestamp_length * sizeof(char));

    param1_varchar = (char*)malloc(ARRAY_SIZE * param1_varchar_length * sizeof(char));
    memset(param1_varchar, 0, ARRAY_SIZE * param1_varchar_length * sizeof(char));

    param1_char = (char*)malloc(ARRAY_SIZE * param1_char_length * sizeof(char));
    memset(param1_char, 0, ARRAY_SIZE * param1_char_length * sizeof(char));

    /* 对缓存区数组进行赋值 */
    for (i = 0; i < ARRAY_SIZE; i++)
    {
        int_array[i] = i + 1;
        int_ind_array[i] = 0;
        int str_array2_length = 5;
        int str_array3_length = 4097;
        int str_array4_length = 5;
        char *str_array2 = (char *)malloc(str_array2_length);
        char *str_array3 = (char *)malloc(str_array3_length);
        char *str_array4 = (char *)malloc(str_array4_length);
        char a = 'a' + i % 26;

        memset(str_array2, 0, str_array2_length);
        memset(str_array2, 'a', str_array2_length - 1);

        memset(str_array3, 0, str_array3_length);
        memset(str_array3, 'a', str_array3_length - 1);

        memset(str_array4, 0, str_array4_length);
        memset(str_array4, 'b', str_array4_length - 1);

        str_ind_array[i] = SQL_NTS;

        strncpy(param1_varchar + nVarcharLength, (const char *)str_array2, str_array2_length);
        strncpy(param1_float + nVarcharLength, "3.40", 4);
        strncpy(param1_timestamp + nLength_time, "2017-02-23 11:34:46", 20);
        strncpy(param1_char + nCharLength, "cc", 2);

        nVarcharLength += 5;
        nCharLength += 3;
        nLength_lob += 4097;
        nLength_time += 21;
    }

    /* 设置语句句柄属性的按列绑定 */
    SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_BIND_TYPE, SQL_PARAM_BIND_BY_COLUMN, 0);
    /* 设置语句句柄的返回执行状态数组 */
    SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_STATUS_PTR, status_array, 0);
    /* 设置参数数组的总行数 */
    SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)ARRAY_SIZE, 0);

    /* 按位置进行占位符参数绑定 */
    SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,
                     int_array, 0, int_ind_array);
    SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 29, 0,
                     param1_varchar, param1_varchar_length, str_ind_array);
    SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 29, 0,
                     param1_char, param1_char_length, str_ind_array);
    SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_FLOAT, 20, 0,
                     param1_float, 0, str_ind_array);
    SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_FLOAT, 20, 0,
                     param1_float, 0, str_ind_array);
    SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_TIMESTAMP, 20, 0,
                     param1_timestamp, param1_timestamp_length, str_ind_array);
    SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 29, 0,
                     param1_varchar, param1_varchar_length, str_ind_array);
    SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 29, 0,
                     param1_varchar, param1_varchar_length, str_ind_array);
    SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 29, 0,
                     param1_varchar, param1_varchar_length, str_ind_array);
    SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 29, 0,
                     param1_varchar, param1_varchar_length, str_ind_array);
    SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 29, 0,
                     param1_varchar, param1_varchar_length, str_ind_array);

    sql = "insert INTO tmptable VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

    /* 预编译SQL语句 */
    rc = SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS);

    /* 执行SQL语句 */
    rc = SQLExecute(hstmt);

    // if (rc < 0)
    //     return nCount;

    if (!SQL_SUCCEEDED(rc))
    {
        print_diag("SQLExecDirect failed", SQL_HANDLE_STMT, hstmt);
        exit(1);
    }

    /* 释放缓存区 */
    free(param1_float);
    free(param1_timestamp);
    free(param1_char);
    free(param1_varchar);

    /* 输出批量插入各行的结果 */
    output_result(rc, hstmt, ARRAY_SIZE, status_array);

    /* 获取执行语句的影响行数 */
    rc = SQLRowCount(hstmt, &nCount);

    return nCount;
}

int main(int argc, char *argv[])
{
    int iNum = 0;

    // 连接数据库
    ODBC_Connect();

    // 批量插入数据
    iNum = Batch_inset_all_sucess();
    printf("执行语句: %d\n", iNum);

    // 断开连接
    ODBC_Close();

    return 0;
}