SQLDataSources -获取数据源列表

SQLDataSources() 返回可用目标数据库的列表,一次一个。 必须对数据库进行编目才能可用。

有关编目的更多信息,请参阅 SQLConnect() 的使用说明,或参阅 "使用关系数据库 (RDB) 目录项" (WRKRDBDIRE) 命令的联机帮助。

通常在建立连接之前调用 SQLDataSources() ,以确定可连接到的数据库。

如果您在 SQL 服务器模式下运行 Db2 for i CLI,则在使用 SQLDataSources() 时会受到一些限制。

有关以服务器方式运行的更多信息,请参阅 在服务器方式下运行 Db2 for i CLI 的限制

Unicode (UTF-16) 等效: 此函数还可以与 Unicode (UTF-16) 字符集配合使用。 相应的 Unicode 函数是 SQLDataSourcesW() 。有关 DB2® CLI 的 Unicode 支持的更多信息,请参阅 Db2 for i CLI 中的 Unicode

语法

SQLRETURN   SQLDataSources   (SQLHENV           EnvironmentHandle,
                              SQLSMALLINT       Direction,
                              SQLCHAR           *ServerName,
                              SQLSMALLINT       BufferLength1,
                              SQLSMALLINT       *NameLength1Ptr,
                              SQLCHAR           *Description,
                              SQLSMALLINT       BufferLength2,
                              SQLSMALLINT       *NameLength2Ptr);

函数自变量

表 1. SQLDataSources 参数
数据类型 自变量 使用 描述
SQL经 V EnvironmentHandle 输入 环境句柄。
SQLSMALLINT 方向 输入 应用程序使用此选项来请求列表中的第一个数据源名称或列表中的下一个数据源名称。 方向 只能采用以下值:
  • sql_fetch_first
  • SQL_FETCH_NEXT
SQLCHAR * ServerName 输出 指向缓冲区的指针,用于保存检索到的数据源名称。
SQLSMALLINT BufferLength1 输入 ServerName指向的缓冲区的最大长度 (以字符计)。 这应该小于或等于 SQL_MAX_DSN_LENGTH + 1。
SQLSMALLINT * NameLength1Ptr 输出 指向存储 ServerName 中可返回的最大字符数的位置的指针。
SQLCHAR * 描述 输出 指向返回数据源描述的缓冲区的指针。 Db2 for i CLI 返回与编目到数据库管理系统 (DBMS) 的数据库相关联的 注释 字段。
SQLSMALLINT BufferLength2 输入 描述 缓冲区的最大长度 (以字符计)。
SQLSMALLINT * NameLength2Ptr 输出 指向位置的指针,该函数返回可用于返回数据源描述的实际字符数。

用法

应用程序可以随时通过将 Direction 设置为 SQL_FETCH_FIRST 或 SQL_FETCH_NEXT 来调用此函数。

如果指定了 SQL_FETCH_FIRST ,那么将始终返回列表中的第一个数据库。

如果指定了 SQL_FETCH_NEXT:
  • 直接跟随 SQL_FETCH_FIRST 调用,将返回列表中的第二个数据库
  • 在任何其他 SQLDataSources() 调用之前,将返回列表中的第一个数据库
  • 当列表中没有更多数据库时,将返回 SQL_NO_DATA_FOUND。 如果再次调用该函数,那么将返回第一个数据库。
  • 任何其他时间,将返回列表中的下一个数据库。

返回码

  • SQL_SUCCESS
  • sql_success_with_info
  • SQL_ERROR
  • sql_invalid_handle
  • sql_noo_data_found

错误状态

表 2。 SQLDataSources SQLSTAT
SQLSTATE 描述 说明
01004 数据已截断 自变量 ServerName 中返回的数据源名称比自变量 BufferLength1中指定的值长。 自变量 NameLength1Ptr 包含完整数据源名称的长度。 (函数返回 SQL_SUCCESS_WITH_INFO。)

自变量 描述 中返回的数据源名称比自变量 BufferLength2中指定的值长。 自变量 NameLength2Ptr 包含完整数据源描述的长度。 (函数返回 SQL_SUCCESS_WITH_INFO。)

58004 意外的系统故障 不可恢复的系统错误。
HY000 一般错误 发生了错误,没有为其定义特定 SQLSTATE ,也没有为其定义特定 SQLSTATE。 SQLError() 在参数 ErrorMsg 中返回的错误消息描述了错误及其原因。
HY001 内存分配失败 Db2 for i CLI 无法分配支持处理或完成功能所需的内存。
HY009 参数值无效 参数 ServerName, NameLength1Ptr, Description, 或 NameLength2Ptr 是一个空指针。

方向的值无效。

HY013 意外内存处理错误 Db2 for i CLI 无法访问支持处理或完成该功能所需的内存。
HY103 方向选项超出范围 为自变量 Direction 指定的值不等于 SQL_FETCH_FIRST 或 SQL_FETCH_NEXT。

授权

无。

示例

注: 通过使用代码示例,您同意 代码许可证和免责声明信息的条款。
/* From CLI sample datasour.c */
/* ... */
 
#include <stdio.h>
#include <stdlib.h>
#include <sqlcli1.h>
#include "samputil.h"          /* Header file for CLI sample code */
 
/* ... */
 
/*******************************************************************
** main
** - initialize
** - terminate
*******************************************************************/
int main() {
 
    SQLHANDLE henv ;
    SQLRETURN rc ;
    SQLCHAR source[SQL_MAX_DSN_LENGTH + 1], description[255] ;
    SQLSMALLINT buffl, desl ;
 
/* ... */
 
    /* allocate an environment handle */
    rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ;
    if ( rc != SQL_SUCCESS ) return( terminate( henv, rc ) ) ;
 
    /* list the available data sources (servers) */
    printf( "The following data sources are available:\n" ) ;
    printf( "ALIAS NAME                      Comment(Description)\n" ) ;
    printf( "----------------------------------------------------\n" ) ;
 
    while ( ( rc = SQLDataSources( henv,
                                   SQL_FETCH_NEXT,
                                   source,
                                   SQL_MAX_DSN_LENGTH + 1,
                                   &buffl,
                                   description,
                                   255,
                                   &desl
                                 )
            ) != SQL_NO_DATA_FOUND
          ) printf( "%-30s  %s\n", source, description ) ;
 
    rc = SQLFreeHandle( SQL_HANDLE_ENV,  henv ) ;
    if ( rc != SQL_SUCCESS ) return( terminate( henv, rc ) ) ;
 
    return( SQL_SUCCESS ) ;
 
 
}