使用Perl DBI通过ip:port连接到Informix

时间:2012-02-17 18:28:19

标签: perl informix dbi

我正在尝试使用DBI(带DBD::Informix)连接到Informix,只给出一个ip地址和端口号。在这种情况下,我不能依赖机器上的sql hosts文件是准确的。我正在做什么?

在文档中,他们以//machine1/dbase的形式提到连接字符串,所以我尝试了一下:

DBI->connect("dbi:Informix://10.1.23.232:2232/eris", $user, $pass);

但收到以下错误:

  

DBI connect('// 10.1.23.232:2232/eris','someuser',...)失败:SQL:-1804:无效的数据库环境。 at tools / check_informix.pl第63行

连接到只知道端口和IP地址的Informix服务器的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

查看DBD :: Informix的文档,你的方法看起来不错,除了DBD :: Informix的pod只是说// machine1 / dbase并没有提到端口。也许您忘了在您的环境中设置INFORMIXDIR。请参阅CONNECTING TO A DATABASE

答案 1 :(得分:0)

使用//machine/dbase的符号主要用于Informix标准引擎,SE(我相信:port符号即使在那时也不会被识别;我必须研究找出哪个端口使用,但很可能是1525或1526)。 AFAIK,它不适用于Informix Dynamic Server,IDS。您需要在sqlhosts文件中为服务器名称创建一个条目,该条目指定机器(原始I / P地址OK)和端口(原始端口号OK),例如:

myremoteserver   olsoctcp   10.1.23.232   2232

然后,您可以将连接字符串指定为:

eris@myremoteserver

您可以使用INFORMIXSQLHOSTS变量将任何文件指定为sqlhosts文件。您在sqlhosts文件中指定的服务器名称必须与正在侦听端口2232的I / P地址10.1.23.232的主机上的实际服务器名称匹配。

答案 2 :(得分:0)

正如Jonathan Leffler所描述的那样,知道服务器名称(以及REAL服务器名称)是不可避免的。这是一个概念验证脚本,它根据所需信息生成并使用自己的sqlhosts文件。

#!/usr/bin/env perl

use strict;
use warnings;

use 5.10.0;

# core
use File::Temp qw(tempfile);

# CPAN
use DBI;

die "Usage: $0 host port server database user password\n" if (@ARGV != 6);
my ($host, $port, $server, $database, $user, $password) = @ARGV;

my ($handle, $path) = tempfile("sqlhosts_$server\_XXXXX");

print $handle "$server onsoctcp $host $port\n";

close($handle);

my $sqlhosts = File::Spec->rel2abs($path);

$ENV{'INFORMIXSQLHOSTS'} = $sqlhosts;
$ENV{'INFORMIXSERVER'}   = $server;

my $dbh = DBI->connect("dbi:Informix:$database\@$server", $user, $password);

say 'Yay! It worked!';

$dbh->disconnect();

unlink $sqlhosts;