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

Implicit local connection (passwordless) using CLI SQLDriverConnect fails with SQL30082N reason 3 PASSWORD MISSING

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

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

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

但是根据 documentation,Db2 应该支持隐式本地连接(当应用程序与数据库服务器在同一主机上运行时),并且您应该能够连接到本地数据库而无需提供 user/pwd 信息。

The server code detects whether a connection is local or remote. For local connections, when authentication is SERVER, a user ID and password are not required for authentication to be successful.

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

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

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

所有这些都失败并出现相同的 SQLstate。密码丢失。

我错过了什么?

--- PS ----

只是为了测试,我可以使用不同的编程接口使这项工作正常,比如 Powershell 使用 IBM.Data.Db2 .Net provider

# $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)。

它在 Win10 和 Db2-LUW v11.5.4.0 上也能正常工作。

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

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

所以我对您的建议是尝试构建并运行 IBM 示例程序(samples/cli/dbconn.c - 可能需要对 files/build 进行轻微修改,因为 IBM 似乎没有在示例目录,在 github 上可能有所不同)。 IBM 提供示例脚本来构建位于同一目录树中的这些程序(bldapp 等)。

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

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

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

在days/hours之后,在@Mitchell Waite

的帮助下,我终于找到了问题

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

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

[SAMPLE]
DBALIAS=SAMPLE
UID=samuel

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

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