Perl DBD :: ODBC使用相同的ODBC驱动程序管理器

时间:2014-05-12 05:47:54

标签: perl odbc dbi unixodbc dbd

我有一个问题,在重新编译和重新安装后我无法让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

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

我可以看到我在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;

1 个答案:

答案 0 :(得分:2)

你没有说你是否在构建结束时进行了make install,但我认为你做了。

你没有说那些LD_LIBRARY_xx env vars是否也只是设置或导出。

首先,解决其他意见。

  1. “DBI:ODBC:$ dsn”应该是“dbi:ODBC:$ dsn”。
  2. Perl DBI根据“dbi:”之后的字符串加载驱动程序 “ODBC”加载DBD :: ODBC模块。
  3. “在DBD :: ODBC配置时,它选择哪个 ODBC驱动程序管理器使用“不正确。仅配置 选择要编译的驱动程序管理器。我不相信 链接时提供链接器的“runpath”指令。那么你 可以愉快地建立对抗unixODBC并与你对抗DD 似乎在做。
  4. 在你的Perl树中查找ODBC.so(它应该在一个名为DBD / ODBC的目录中,例如/home/martin/perl5/perlbrew/perls/perl-5.19.10/lib/site_perl/5.19.10/x86_64 -linux /自动/ CAD / 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身份运行并且有全局方式告诉动态liker在哪里查找。阅读你的ld.so.1第1节手册页。