使用 cli 连接到 db2 失败,错误代码为 -1531

Posted

技术标签:

【中文标题】使用 cli 连接到 db2 失败,错误代码为 -1531【英文标题】:Connecting to db2 using cli fails with error code -1531 【发布时间】:2019-05-09 07:43:18 【问题描述】:

我正在尝试使用我的 C++ 代码连接到远程 db2 服务器。我能够使用 db2CLP 连接到 db2 服务器来连接服务器。我已经使用以下命令配置了 db2cli:

db2cli writecfg add -dsn alias -database BLUDB -host hostname -port 50000

甚至使用

验证它
db2cli validate -dsn alias -connect -user userid -passwd password

我收到以下错误代码:本机错误代码 = -1531 当我使用该功能时

SQLConnect(hdbc,
        (SQLWCHAR *)db1Alias,
        SQL_NTS,
        (SQLWCHAR *)user,
        SQL_NTS,
        (SQLWCHAR *)pswd,
        SQL_NTS); 

并且没有错误消息。 谁能指出我做错了什么?

我检查了 IBM 页面中的错误代码,但未在其列表中找到 -1531。 (https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/codes/src/tpc/db2z_n.html)

这是我正在使用的代码的 sn-p: 我是从 ibm 的示例部分(https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.apdv.sample.doc/doc/cli/s-dbconn-c.html)

#define DBC_HANDLE_CHECK(hdbc, cliRC)              \
if (cliRC != SQL_SUCCESS)                          \
                                                  \

    SQLWCHAR message[SQL_MAX_MESSAGE_LENGTH + 1]; \
    SQLWCHAR sqlstate[SQL_SQLSTATE_SIZE + 1]; \
    SQLINTEGER sqlcode; \
    SQLSMALLINT length, i; \

    i = 1; \

    /* get multiple field settings of diagnostic record */
    while (SQLGetDiagRec(SQL_HANDLE_DBC, \
        hdbc, \ 
        i, \
        sqlstate, \
        &sqlcode, \
        message, \
        SQL_MAX_MESSAGE_LENGTH + 1, \
        &length) == SQL_SUCCESS) \
     \
        printf("\n  SQLSTATE          = %s\n", sqlstate); \
        printf("  Native Error Code = %d\n", sqlcode); \
        printf("Error Meassgaes:%s\n", message); \
        i++; \
     \

    printf("-------------------------\n"); \
  if (rc != 0) return rc;                          \

/* allocate a database connection handle */
    cliRC = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    ENV_HANDLE_CHECK(henv, cliRC);

    printf("\n  Connecting to the database %s ...\n", db1Alias);

    /* connect to the database */
    cliRC = SQLConnect(hdbc,
        (SQLWCHAR *)db1Alias,
        SQL_NTS,
        (SQLWCHAR *)user,
        SQL_NTS,
        (SQLWCHAR *)pswd,
        SQL_NTS);
    DBC_HANDLE_CHECK(hdbc, cliRC);

实际结果

  Native Error Code = -1531
Error Meassgaes:[
-------------------------

预期:应该建立连接。

【问题讨论】:

一个链接指向 Db2 for z/OS,一个指向 Db2 LUW。您要连接到什么产品和版本? 我正在连接到 db2 LUW。 【参考方案1】:

这是SQL01531N 的文档。 -1531转化为SQL+5位+N(负数),即SQL01531N。

db2dsdriver.cfg 配置文件包含数据库目录 一些 IBM 使用的信息和客户端配置参数 数据服务器客户端和驱动程序。

CLI/ODBC 初始化文件 (db2cli.ini) 包含各种 可用于配置 CLI 行为的关键字和值 以及使用 CLI 的应用程序。

当在 带有“DSN”连接关键字但指定的连接字符串 在以下任一位置都找不到数据源名称:

在 db2dsdriver.cfg 配置文件中使用“dsn alias”配置关键字指定 在 db2cli.ini 配置文件中指定为节头

db1Alias 在您的代码中是如何以及在何处设置的?配置的 DSN 别名是什么?修复它,它应该可以工作。

【讨论】:

这是 db2dsdriver.cfg 的内容 ` ` 并且 db2cli.ini 为空且 dbalias 设置为 "testdb21" 我在 db2cli.ini 中添加了一些行` [testdb21] autocommit=0 ` 我还运行了db2cli validate -dsn testdb21,它返回Success: The schema validation completed successfully without any errors. 您的代码在执行时使用什么别名?你检查过那个值吗? db1Alias="testdb21"; 我已经编译并链接了dbconn.c。在运行它时,我得到了这个输出。 THIS SAMPLE SHOWS HOW TO CONNECT TO AND DISCONNECT FROM A DATABASE. ----------------------------------------------------------- USE THE CLI FUNCTIONS SQLAllocHandle SQLConnect SQLDisconnect SQLFreeHandle TO CONNECT TO AND DISCONNECT FROM A DATABASE: Connecting to the database testdb21 ... --CLI ERROR-------------- cliRC = -1 line = 158 file = d:\db2odbctesttool\db2odbctesttool\db2odbctesttool\db2odbctesttool.cpp SQLSTATE = Native Error Code = -1531 Error Meassgaes:[【参考方案2】:

修复是更新应用程序的字符集。以前它被设置为 Unicode。

我去了解决方案属性->通用->字符集并将其值设置为Not Set,它开始工作了。

【讨论】:

以上是关于使用 cli 连接到 db2 失败,错误代码为 -1531的主要内容,如果未能解决你的问题,请参考以下文章

通过 JDBC 连接到远程 db2 数据库失败

DB2数据库显示未启动,但是可以连接到

重启后,db2无法从客户端连接

为啥在 SSIS 包中连接到 DB2 时出现错误 58031?

发生连接授权失败。原因:GSSAPI 服务器凭据无效。错误代码=-4214,SQLSTATE=28000

无法使用带有 securityMechanism=13 的 DataGrip 连接到 DB2