使用 CLI SQLDriverConnect 的隐式本地连接无密码失败,原因为 SQL30082N 3 PASSWORD MISSING

问题描述

我正在使用 Db2 CLI/ODBC API 接口进行编码。视窗 10

如果我在连接字符串中提供用户名密码 (UID / PWD) 键,我可以使 SQLDriverConnect 函数正常工作,并且可以连接到任何本地或远程数据库。 这部分工作正常。

例如。如果我的连接字符串类似于 "DSN=SAMPLE;UID=xxxxx;PWD=yyyyy",则连接工作正常。

但根据 documentation,Db2 应该支持隐式本地连接(当应用程序与数据库服务器在同一主机上运行时),并且您应该能够在不提供用户/密码信息的情况下连接到本地数据库

服务器代码检测连接是本地的还是远程的。对于本地连接,当认证为SERVER时,认证成功不需要用户ID和密码

在本地,使用 CLP CONNECT 命令,它也可以在不传递密码的情况下隐式运行 db2 connect to sample。这证明服务器配置正确。 (认证设置为SERVER)

但是,当使用应用程序 CLI 代码尝试相同的方法时,如果我只在连接字符串中提供 DSN(数据库名称),我会收到 sql30082N 原因 3 PASSWORD MISSING 错误。我尝试了几种变体,例如:

DSN=SAMPLE;
DSN=SAMPLE;UID=;PWD=;
DSN=SAMPLE=UID=;
DSN=SAMPLE=UID='';PWD='';
DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1;

它们都以相同的 sqlstate 失败。密码丢失。

我错过了什么?

--- PS ----

为了测试,我可以使用不同的编程接口来使这项工作正常进行,例如使用 IBM.Data.Db2 .Net 提供程序的 Powershell

# $dbFactory = [System.Data.Common.DbProviderFactories]::GetFactory('IBM.Data.DB2')
# $connection = $dbFactory.CreateConnection()
# $connection.ConnectionString = "Database=SAMPLE" 
# $connection.open()

# $connection 
...
ConnectionString                     : Database=SAMPLE
Database                             : SAMPLE
IsOpen                               : True
...
DataSource                           : SAMPLE
UserId                               : Samuel
ClientUser                           :
ClientWorkStation                    : Samuel-ALW
InternalClientWorkStation            : Samuel-ALW
...

并且我来自 powershell 的隐式连接在 db2 db 中列为应用程序:

# db2 list applications for db sample

Auth Id  Application    Appl.      Application Id                                                 DB       # of
         Name           Handle                                                                    Name    Agents
-------- -------------- ---------- -------------------------------------------------------------- -------- -----
SAMUEL   powershell.exe 5316       *LOCAL.DB2.210103171916                                        SAMPLE   1

为什么使用 sqlDriverConnectCLI 中不能使用相同的方法

解决方法

它对我来说工作正常(Db2-LUW v11.5.5.0)。

它也可以在带有 Db2-LUW v11.5.4.0 的 Win10 上正常工作。

我使用了与 IBM 提供的示例程序 dbconn.c 中相同的代码(可在 github、Db2 知识中心和 Db2-LUW 实例的示例目录中获得)。它显示了三种方法,包括 SQLDriverConnect(这是我在本地测试的一种)。

我注意到 printf() 报告的连接字符串在它工作时是例如: DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1;

所以我对您的建议是尝试构建并运行 IBM 示例程序(samples/cli/dbconn.c - 可能需要对文件/构建稍作修改,因为 IBM 似乎没有将其示例代码保存在示例目录中,也许在 github 上有所不同)。 IBM 提供了示例脚本来构建位于同一目录树中的这些程序(bldapp 等)。

要进行故障排除,请仔细检查您要连接到的别名的定义方式。特别检查目录和(对于 IBM 提供的驱动程序)db2dsdriver.cfg 内容,如有必要,手动创建后者。 SQL30082N 原因 3 将导致非本地数据库。

您还可以使用 CLI 跟踪来观察幕后发生的事情,有关运行 db2trc 命令、转储其输出、将其二进制输出格式化为可读文本等的详细信息,请参阅 Db2 知识中心。

,

1st,感谢@mao 的帮助。我在不同的工作站中执行了另一个全新安装,并且它在那里工作。所以,我原来的系统出现了“错误”。

几天/几个小时后,我终于在@Mitchell Waite 的帮助下找到了问题

cli 驱动程序为此数据库提供了默认用户名,但没有提供密码,因此出现 PASSWORD MISSING 错误。

默认 UID 来自具有以下内容的 db2cli.ini 文件:

[SAMPLE]
DBALIAS=SAMPLE
UID=samuel

我不记得是手动创建的,但我想这是在我玩 ODBC DSN Windows GUI 进行一些测试时出现的。

无论如何,从这个条目中删除UID,或者删除整个 [SAMPLE] 部分,它又开始工作了,正如预期的那样!