Database 在ODBC连接字符串中指定并使用多个库
用于连接到DB2i的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” 为什么不自动搜索其他指定库中的文件/表,
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解决了我的问题……这有点不成文。