使用 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 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的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 SSIS 包中连接到 DB2 时出现错误 58031?