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

时间:2013-12-12 14:38:51

标签: database db2 odbc database-connection db2-400

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

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

上面的连接字符串指定了多个要使用的库/模式。但是当我尝试从第一个库以外的库(例如LIB2 ... LIB8)访问文件/表时,我得到一个例外,说“在LIB1中找不到文件xx”

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

我需要针对这种情况采取解决方法。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

这与手册中记载的一样:

  

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

答案 2 :(得分:-1)

如上所述,Schema / library list用于解析函数/过程名称,而不是表。

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

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

a)要求数据库管理员为 - 你需要使用的每个表 - 相应的模式名称,然后执行" select * from lib1.tab1在[...]&#34上加入lib2.tab2 ; ;-) b)要求db admin在schema" MyAlias"您要使用的每个表的多个别名(创建别名)。然后做"设置当前架构= MyAlias"然后是您需要的所有SQL语句,例如"从tab1中选择*加入tab2"。因为您正在查询myalias.tab1,它是指向表lib1.tab1的别名,所以它应该可以工作。

c)复杂:创建自己的SQL函数,返回表的相应schema_name(例如myfunct(' TAB1')。这可以通过读取系统视图“qsys2.systables”来完成,其中table_name =' TAB1'并返回TABLE_SCHEMA列,它是一个varchar(128)。一旦你得到它,使用你刚刚获得的变量建立一个动态准备。 "设置mylib = myfunct(' TAB1')。 "设置mystmt ='从' || table_schema ||中选择* '.tab1'......“

准备mystmt,然​​后执行myst​​mt。

我在使用ado ibmdrda的VBA中做了类似的事情并且有效。

希望这会有所帮助。

F。