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#代码不会更改。