Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在ODBC连接字符串中指定并使用多个库_Database_Db2_Odbc_Database Connection_Db2 400 - Fatal编程技术网

Database 在ODBC连接字符串中指定并使用多个库

Database 在ODBC连接字符串中指定并使用多个库,database,db2,odbc,database-connection,db2-400,Database,Db2,Odbc,Database Connection,Db2 400,用于连接到DB2i的odbc连接字符串如下所示: Driver={客户端访问ODBC驱动程序(32位)};系统=xx.xx.xx.xx;dbq=lib1lib2lib3lib4lib5lib6lib7lib8;languageid=ENU;qrystglmt=-1;cmt=0;signon=1 上面的连接字符串指定要使用的多个库/架构。但是,当我尝试从第一个库以外的库(如LIB2…LIB8)访问文件/表时,我会遇到一个异常,即“LIB1中找不到文件xx” 为什么不自动搜索其他指定库中的文件/表,

用于连接到DB2i的odbc连接字符串如下所示:

Driver={客户端访问ODBC驱动程序(32位)};系统=xx.xx.xx.xx;dbq=lib1lib2lib3lib4lib5lib6lib7lib8;languageid=ENU;qrystglmt=-1;cmt=0;signon=1

上面的连接字符串指定要使用的多个库/架构。但是,当我尝试从第一个库以外的库(如LIB2…LIB8)访问文件/表时,我会遇到一个异常,即“LIB1中找不到文件xx”

为什么不自动搜索其他指定库中的文件/表,而只搜索第一个库中的文件?


我需要一个解决这种情况的方法。

此方法按照手册中的说明进行:

库列表用于解析非限定存储过程调用和在目录API调用中查找库。。。 注: 此属性中列出的第一个库也是默认库,用于解析SQL语句中的非限定名称

使用“”模式,将
naming=1
添加到

在库列表中,在第一个库之前放置逗号

Driver={Client Access ODBC Driver (32-bit)};system=systemname;naming=1;
dbq=,LIB1,LIB2,LIB3,LIB4,LIB5,LIB6,LIB7,LIB8;languageid=ENU;cmt=0;signon=1

如上所述,模式/库列表用于解析函数/过程名称,而不是表

假设您需要从lib1.tab1和lib2.tab2读取数据

这里是我的个人解决方法(从简单到复杂):

a) 要求db管理员为您需要使用的每个表提供相应的架构名称,然后执行“select*from lib1.tab1 join lib2.tab2 on[…]”;-) b) 请db管理员在模式“MyAlias”上为要使用的每个表创建几个别名(创建别名)。然后执行“set current schema=MyAlias”,然后执行所有需要的SQL语句,例如“select*from tab1 join tab2”。由于您正在查询myalias.tab1,这是一个指向表lib1.tab1的别名,所以它应该可以工作

c) 复杂:创建自己的SQL函数,返回表的相应架构名称(例如myfunct('TAB1')。这可以通过读取系统视图“qsys2.systables”来完成,其中table_name='TAB1'和returning table_schema列,即varchar(128).一旦你得到它,使用你刚得到的变量建立一个动态准备的。 “设置mylib=myfunct('TAB1')。 “set mystmt='select*from'| | | table| |'。tab1'”

准备mystmt,然后执行mystmt

我使用ado IBMRDA在VBA中做了类似的事情,并且效果很好

希望这有帮助


f、

您链接到的关于“系统命名”与“SQL命名”的文章很好。我认为值得一提的是,文章接着解释了,如果要隐式搜索多个库(又称模式),则需要系统命名,因为SQL命名模式只为非限定名称提供一个模式。但文章指出,默认模式可以包含别名或访问其他模式的视图,以防这是某些人的选项。完美。我的问题是,我使用的是“默认集合”或“库列表”为了设置默认的模式/范围,“dbq”=myschema解决了我的问题……这有点不成文。