1

我有一个问题,在重新编译和重新安装后,我无法让 Perl DBD::ODBC 使用 unixODBC。它以前安装过。

我已编译 DBD::ODBC 以使用 DataDirect ODBC 驱动程序管理器。我现在想重新编译它以使用 unixODBC。然而,尽管从新的源代码开始,配置(它选择 unixODBC),然后编译和安装,它似乎卡在使用 DataDirect ODBC 驱动程序管理器。我已经从 Perl 模块文件夹中删除了所有文件(我知道),但是重新安装时问题仍然存在。

我正在从源代码编译,因为我正在安装的服务器没有 Internet 连接,所以我没有使用 CPAN。

我在 Solaris 10 上使用 unixODBC 1.2.3 和 Perl 5.8.4(它与环境匹配)。

我已经删除了所有我能找到的:

 1. cd /usr/perl5/site_perl/5.8.4/sun4-solaris-64int/auto/DBD/
 2. sudo rm -R ODBC
 3. cd /usr/perl5/site_perl/5.8.4/sun4-solaris-64int/DBD/
 4. sudo rm -R ODBC
 5. sudo rm ODBC.pm
 6. cd /usr/perl5/5.8.4/man/man3/
 7. sudo rm DBD::ODBC.3
 8. sudo vi /usr/perl5/5.8.4/lib/sun4-solaris-64int/perllocal.pod

然后我删除了 DBD::ODBC 中的所有条目perllocal.pod

当我运行它时,我可以看到perl Makefile.PL它正在查找 unixODBC。

Looking for odbc_config at /usr/local/unixODBC_sp64/bin/odbc_config
  Found odbc_config (via /usr/local/unixODBC_sp64/bin/odbc_config) version 2.3.2

  odbc_config reports --prefix=/usr/local/unixODBC_sp64
  odbc_config reports --include-prefix=/usr/local/unixODBC_sp64/include
  odbc_config reports --lib-prefix=/usr/local/unixODBC_sp64/lib
  ODBC INC dir set to /usr/local/unixODBC_sp64/include from odbc_config
  ODBC LIB dir set to /usr/local/unixODBC_sp64/lib from odbc_config
Using ODBC HOME /usr/local/unixODBC_sp64

This looks like a unixodbc type of driver manager.
Looking for odbcinst
  odbcinst -j reports:

unixODBC 2.3.2
DRIVERS............: /usr/local/unixODBC_sp64/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/unixODBC_sp64/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/unixODBC_sp64/etc/ODBCDataSources
USER DATA SOURCES..: /usr/local/unixODBC_sp64/etc/odbc.ini

这是我正在编译和安装模块的环境中与 ODBC 相关的所有环境变量

LD_LIBRARY_PATH=/usr/local/unixODBC_sp64/lib:
LD_LIBRARY_PATH_64=/usr/local/unixODBC_sp64/lib:
PATH=/usr/local/unixODBC_sp64/bin:/usr/sfw/bin:/usr/ccs/bin:/opt/SUNWspro/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/bin
ODBCINI=/usr/local/unixODBC_sp64/etc/odbc.ini
ODBCHOME=/usr/local/unixODBC_sp64

当我运行测试时,我仍然看到来自 DataDirect 驱动程序管理器的错误:

DBI connect('lksdjhf','ljkshdf',...) failed: [DataDirect][ODBC lib] System information file not found. Please check the ODBCINI environment variable. (SQL-IM002) at ./test_odbcdb2.pl line 19

忽略它找不到驱动程序的事实,因为没有填充 odbc.ini。我正在使用垃圾连接进行测试,因为我想从 unixODBC 看到同样的错误消息。

我用于测试的 Perl 脚本如下。它与 DataDirect 驱动程序管理器一起使用。

#!/usr/bin/perl -w

use DBI;
use DBD::ODBC;
use DBD::DB2::Constants;

print "Enter Data Source Name:";
my $dsn =<STDIN>;
chomp $dsn;
my $data_source = "DBI:ODBC:$dsn";
print "Enter Username:";
my $user =<STDIN>;
print "Enter password:";
my $password =<STDIN>;
chomp $user;
chomp $password;

# Connect to the db2 database using odbc
my $dbh = DBI->connect($data_source, $user, $password, {AutoCommit =>1})
                or die "Can't connect to $data_source: $DBI::errstr";
$stmt = "SELECT current timestamp from sysibm.sysdummy1; ";
$sth = $dbh->prepare($stmt);
$sth->execute();

#associate variable with output columns...

$sth->bind_col(1,\$timestap);
while ($sth->fetch) {
           print "The time is: $timestap\n";
}
$dbh->disconnect;
4

1 回答 1

3

您没有说是否在构建结束时进行了 make install,但我假设您这样做了。

您没有说那些 LD_LIBRARY_xx 环境变量是否也只是设置或导出。

首先,解决其他评论。

  1. “DBI:ODBC:$dsn”确实应该是“dbi:ODBC:$dsn”。
  2. Perl DBI 确实根据“dbi:”之后的字符串加载驱动程序,因此“ODBC”加载 DBD::ODBC 模块。
  3. “它在 DBD::ODBC 配置时选择使用哪个 ODBC 驱动程序管理器”不正确。配置仅选择要编译的驱动程序管理器。我不相信在链接时提供了链接器的“运行路径”指令。因此,您可以愉快地针对 unixODBC 构建并针对您似乎正在做的 DD 运行。

在您的 Perl 树中找到 ODBC.so(它应该在一个名为 DBD/ODBC 的目录中,例如 /home/martin/perl5/perlbrew/perls/perl-5.19.10/lib/site_perl/5.19.10/x86_64-linux/自动/DBD/ODBC/ODBC.so)。现在在其上运行“ldd ODBC.so”并查看输出中 libodbc.so 的来源,例如:

$ ldd ./blib/arch/auto/DBD/ODBC/ODBC.so
        libodbc.so.1 =>  /usr/local/lib/libodbc.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        libthread.so.1 =>        /usr/lib/libthread.so.1
        libc.so.1 =>     /usr/lib/libc.so.1
        /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1

在这里,动态链接器正在使用 /usr/local/lib/libodbc.so.1 解决对 libodbc.so.1 的依赖。您需要告诉动态链接器在它现在查看的任何位置之前查看您的 unixODBC lib 目录。使用 LD_LIBRARY_PATH 可能不起作用 - 特别是如果您以 root 身份运行并且有全局方式告诉动态喜欢者在哪里查找。阅读您的 ld.so.1 第 1 节手册页。

于 2014-05-13T09:07:28.513 回答