C# Odbc连接字符串格式,找不到文件

C# Odbc连接字符串格式,找不到文件,c#,asp.net,configuration,odbc,ibm-midrange,C#,Asp.net,Configuration,Odbc,Ibm Midrange,这是一个可能只有一个答案的“双重”问题 我正在使用带有AS/400的Odbc连接,连接字符串如下: driver={iSeries Access ODBC Driver}; system={0}; uid={1}; pwd={2}; DefaultLibraries=*USRLIBL; 我可以很好地连接到系统 *USRLIBL包含用户提供的所有必要库,用户类型为“仅API”,可以访问所有用户库 然而,当我试图访问某些ERP库时,它说找不到它们,而其他的可以 作为一个非常基本的演练: 1

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

我正在使用带有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连接字符串DefaultLibraries=*USRLIBL不返回正确的库?注意:我还使用一个IDB2连接测试了它,它实际上工作得很好。。。但是,无法部署IDB2连接,因为它确实会使服务器崩溃

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

有什么想法吗

开始编辑:

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

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

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

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


结束编辑:

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

有关更多信息:

有关部分摘录如下:

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

使用SYS命名约定,非限定SQL语句将转到默认集合。如果没有默认集合,则使用当前库。如果未指定当前库,则使用库列表

默认集合

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

如何获取ODBC以搜索库列表

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

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


驱动程序={iSeries访问ODBC驱动程序};系统={0};uid={1};pwd={2};命名=1;DefaultLibraries=,*USRLIBL,LibraryB

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

用户:WEB作业描述:WEB库列表:CUSTPROD、ITEMPROD、实用程序

用户:WEBTEST作业描述:WEBTEST库列表:custest、ITEMTEST、实用程序


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

如果有人遇到这篇文章,并且像我一样使用IBM.Data.DB2.iSeries.NET数据提供程序,那么上面的要点是使用naming=1,而不是指定默认集合。在连接字符串中使用以下部分时,我终于成功了

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

是的,但尽管这是一个很好的想法,可以让它工作起来,这样我就可以测试程序本身,但在我们的环境中,对每个数据库调用都这样做并不太可行,因为有多个库的多个副本。测试版本、特殊测试版本、生产版本等。。*USRLIBL和连接字符串通过系统名(至少使用iDB2)负责“环境”,因此我们一般不必限定。然而,对于测试应用程序代码来说,这是一个奇迹。添加硬编码的限定符意味着为一个
使用了大量的查询。这样做不会太困难,只需要花费一点时间,但这不应该从驱动程序本身完成吗?我通常使用一个远程连接配置文件,然后根据模式测试prod参数化客户端中的库名称,等等。@Gobbledigook我用更多信息和一个示例连接字符串更新了我的答案。当我最终有机会回到它时,结果证明这就是答案。谢谢也许我应该在我的第一篇文章中更清楚一点,但这正是它的设置方式。它实际上被设置为DEV和PROD,以及与之关联的库。我将编辑问题以进行澄清。