问题描述
我正在使用 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;
我错过了什么?
--- 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 中不能使用相同的方法?
解决方法
它对我来说工作正常(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] 部分,它又开始工作了,正如预期的那样!