3

我用于连接到 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”

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

对于这种情况,我需要一种解决方法。

4

3 回答 3

4

使用“系统命名”模式,通过添加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
于 2013-12-13T05:02:50.413 回答
1

这如手册中所述工作:

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

于 2013-12-12T22:49:19.360 回答
-1

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

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

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

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

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

准备 mystmt 然后执行 mystmt。

我在 VBA 中使用 ado ibmdrda 做了类似的事情,它奏效了。

希望这可以帮助。

F。

于 2017-04-06T10:56:50.177 回答