0

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

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

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

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

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

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

它们都以相同的 SQL 状态失败。密码丢失。

我错过了什么?

--- 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

为什么使用SQLDriverConnect在CLI中不起作用?

4

2 回答 2

1

它对我来说可以正常工作(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 跟踪来观察幕后发生的事情,请参阅 Db2 知识中心以获取有关运行db2trc命令、转储其输出、将其二进制输出格式化为可读文本等的详细信息。

于 2021-01-03T19:31:28.590 回答
0

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

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

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

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

[SAMPLE]
DBALIAS=SAMPLE
UID=samuel

我不记得手动创建它,但我想这是在我使用 ODBC DSN Windows GUI 进行一些测试时得到的。

不管怎样,从这个条目中删除UID,或者删除整个 [SAMPLE] 部分,它再次开始工作,正如预期的那样!

于 2021-01-04T14:37:27.910 回答