Odbc连接字符串格式,不查找文件

本文关键字:查找 文件 格式 连接 字符串 Odbc | 更新日期: 2023-09-27 18:14:55

这是一种可能只有一个答案的"双重"问题。

我正在使用与AS/400的Odbc连接,连接字符串如下:

driver={iSeries Access ODBC Driver}; system={0}; uid={1}; pwd={2}; DefaultLibraries=*USRLIBL;    

我可以很好地连接到系统。

*USRLIBL包含来自用户的所有必要库(类型为'API only',可以访问所有用户库)。

然而,当我试图访问某些ERP库时,它说它们找不到,而其他的可以。

作为一个非常基本的演练:

1. Open Connection - Query File 1 from Library A:  OK! - Close Connection
2. Open Connection - Query File 2 from Library A:  OK! - Close Connection
3. Open Connection - Query File 1 from Library B:  Exception  SQL0204 - in UserName type *FILE not found 

好的,所以我添加了ERP文件所在的特定库,使连接字符串如下,只是为了测试程序:

driver={iSeries Access ODBC Driver}; system={0}; uid={1}; pwd={2}; DefaultLibraries=*USRLIBL, LibraryB; 

但是我开始遇到一个不同的问题(另一个非常基本的演练)

1. Open Connection - Query File 1 from Library A:  OK! - Close Connection
2. Open Connection - Query File 2 from Library A:  OK! - Close Connection
3. Open Connection - Query File 1 from Library B:  OK! - Close Connection
4. Open Connection - Query File 1 from Library A again:  Exception SQL0202 - in LibraryB type *FILE not found.  

所以我的问题是:

为什么odbc连接字符串DefaultLibraries=*USRLIBL不返回正确的库?(注意:我还使用iDB2Connection进行了测试,实际上工作得很好……但是,无法部署iDB2Connection,因为它实际上会使服务器崩溃)

为什么第二个攻略抛出一个异常,它似乎只是"跳过"*USRLIBL从LibraryB读取后,甚至一次。

任何想法吗?

开始编辑:

实际上有两个用户,DEV和PROD

*USRLIBL从环境本身获取所有必要的库,因此,如果在打开连接时,它检测到本地主机环境或任何不安全的环境(加上一些其他警告),则在创建连接之前,它默认使用DEV登录凭据。这就是为什么system、uid和pwd被指定为连接中的参数(而不仅仅是stackoverflow i - not -want-to- out-data占位符)

*USRLIBL然后从API用户那里提取必要的库。

澄清一下,它的设置方式是使用iDB2连接器工作的,但是由于我们的ERP系统的限制(我们认为),在IIS 7服务器上使用它会导致灾难性的失败,所以我们使用ODBC连接器。

结束编辑:

Odbc连接字符串格式,不查找文件

可以将表名限定为库。文件名,而不必处理任何库列表问题。

查看更多信息:

Client Access ODBC: Default Libraries Setting

ODBC连接字符串关键字


相关部分节选如下:

使用SQL命名约定,操作系统不会执行库列表搜索来定位不合格的对象。如果定义了默认集合,则使用默认集合来解析非限定SQL语句。

使用SYS命名约定,不合格的SQL语句进入默认集合。如果没有默认集合,则使用当前库。如果没有指定当前库,则使用库列表。

默认收藏

ODBC设置的一个作业属性,用于确定处理包含非限定SQL名称的SQL语句时使用的库。当设置默认集合时,除了过程、函数和类型之外的所有非限定对象都必须驻留在默认集合中,而不考虑命名约定。

如何让ODBC搜索库列表?

如上所述,编辑ODBC数据源并将系统命名设置为SYS。默认库必须为空,或者在R510之前的版本中,默认库设置必须以逗号开头,以便不定义默认集合(例如,",MYLIB1, MYLIB2")。


尝试此连接字符串以启用系统命名,并且不设置默认库:

driver={iSeries Access ODBC Driver}; system={0}; uid={1}; pwd={2}; naming=1; DefaultLibraries=,*USRLIBL,LibraryB;

如果有人看到这篇文章,并且正在使用IBM.Data.DB2. xml。我是iSeries . net数据提供者,从上面得到的关键点是使用naming=1而不指定"默认集合"。当我在连接字符串

中使用以下部分时,我终于成功了
LibraryList= MyLibrary1,MyLibrary2,MyLibrary3,MyLibrary4;naming=1;

另一种方法是为每个环境设置单独的用户配置文件。由于*USRLIBL是由职位描述设置的,因此这也需要设置一个单独的职位描述。例如:

user: WEB job desc: WEB library list: CUSTPROD, ITEMPROD, UTILITY

user: WEBTEST job desc: WEBTEST library list: CUSTTEST, ITEMTEST, UTILITY

c#代码没有改变,除了使用测试或生产用户ID进行身份验证。