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

这是一个“双重”问题,可能只有一个答案。

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

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

我能够很好地连接到系统。

* USRLIBL包含来自用户的所有必需库(属于“仅API”类型,可以访问所有用户库)。

但是,当我尝试访问某些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 connectionstring DefaultLibraries = * USRLIBL没有返回正确的库? (注意:我也使用iDB2Connection进行了测试,实际上工作正常……但是,iDB2Connection无法部署,因为它会导致服务器崩溃)

为什么第二次演练抛出一个exception,它似乎只是在从LibraryB读取一次之后“跳过”* USRLIBL。

有什么想法吗?

开始编辑:

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

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

然后,* USRLIBL从API用户中提取必要的库。

要澄清,它的设置方式确实可以使用iDB2连接器,但由于我们的ERP系统(我们认为)的局限性,将它与IIS 7服务器一起使用会导致灾难性故障,因此我们正在使用ODBC连接器。

结束编辑:

您可以将表名限定为library.filename,而不必处理任何库列表问题。

欲获得更多信息:

客户端访问ODBC:默认库设置

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.iSeries .NET数据提供程序,那么从上面得到的关键点是使用naming=1而不指定“默认集合”。 在我的连接字符串中使用以下部分时,我终于成功了

 LibraryList= MyLibrary1,MyLibrary2,MyLibrary3,MyLibrary4;naming=1; 

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

user:WEB job desc:WEB库列表:CUSTPROD,ITEMPROD,UTILITY

user:WEBTEST job desc:WEBTEST库列表:CUSTTEST,ITEMTEST,UTILITY

除使用测试或生产用户ID进行身份validation外,C#代码不会更改。