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

Posted

技术标签:

【中文标题】通过 ip:port 使用 Perl DBI 连接到 Informix【英文标题】:Connecting to Informix with Perl DBI by ip:port 【发布时间】:2012-02-17 18:28:18 【问题描述】:

我正在尝试使用DBI(与DBD::Informix)连接到仅给定IP 地址和端口号的Informix。在这种情况下,我不能依赖机器上的 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:数据库环境无效。在工具/check_informix.pl 第 63 行

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

【问题讨论】:

【参考方案1】:

使用//machine/dbase 的符号主要用于Informix Standard Engine, 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 的主机上的实际服务器名称匹配。

【讨论】:

谢谢!我提交需要接受一个服务器名称。我创建了一个临时主机文件(使用 File::Temp)并将 INFORMIXSQLHOSTS 更改为指向它。有什么办法可以避免摆弄环境变量或写入文件系统?【参考方案2】:

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

【讨论】:

【参考方案3】:

正如 Jonathan Leffler 所描述的,知道服务器名称(以及真实的服务器名称)是不可避免的。这是一个概念验证脚本,它根据所需的信息生成并使用它自己的 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;

【讨论】:

以上是关于通过 ip:port 使用 Perl DBI 连接到 Informix的主要内容,如果未能解决你的问题,请参考以下文章

Perl 连接 MySQL,DBI怎么安装?

在Perl的DBI连接方法中设置keepalive的任何方法

为啥这个 ISQL 命令不能通过 Perl 的 DBI 运行?

Perl:在不死的情况下捕获错误

在 Perl 中使用 DBI 连接到 Oracle 数据库,在 Windows 中出现 ERROR OCIEnvNlsCreate

MS Access Professional Plus 2019 的 Perl 连接字符串