Perl脚本在命令提示符下工作正常,但在ODBC上作为CGI脚本失败

时间:2010-11-23 22:17:39

标签: perl odbc cgi windows64

问题:Perl脚本在命令提示符下工作正常,但在ODBC上作为CGI脚本失败

设置: Win XP Pro 64位版本2003 SP2 Apache 2.2.17 Win32 Active Perl 5.12.2(不是Perl64) 为SQL SERVER创建ODBC DSN

详细信息:从命令提示符开始,Phone.pl运行正常 - 它按预期获得查询结果 - 这意味着DBI正常工作

作为CGI脚本,Phone.pl在ODBC初始化代码之前按预期打印HTML。 (Apache设置适用于非ODBC脚本。)

这是Apache的错误日志中的msg

[Tue Nov 23 13:27:57 2010] [error] [client 127.0.0.1] DBI connect('SQLSVR206','administrator',...)失败:[Microsoft] [ODBC Driver Manager]数据源在C:/CGI/Phone.pl第32行找不到名称且未指定默认驱动程序(SQL-IM002)

知道它为什么表现不同?

#!c:/perl/bin/perl.exe
use CGI qw(:standard);
use strict;
use warnings;
use DBI;

my ($sqlstr, $sql_UNITED, $dbh206);

# 206
# select * from getProvFINON('270762789')#TIN
my @colUNITED = qw/ADR_LN_1_TXT  PROV_SYS_ID  ZIP_CD  FULL_NM  SOURCE  PROV_TIN  BILL_TEL/;

sub Init(){
    $dbh206 = DBI->connect ("dbi:ODBC:SQLSVR206",'USER','PASSWORD',{RaiseError=>1})
        or die $DBI::errstr;
    $sqlstr = qq/ select * from getProvFINON(?) /; #parameters TIN
    $sql_UNITED = $dbh206->prepare($sqlstr)
        or die "prepare failed: " . $dbh206->errstr(); 
}

sub test1{
    my $tin = shift();
    $sql_UNITED->execute($tin) or die $sql_UNITED->errstr;
    my $row = $sql_UNITED->fetchrow_hashref;
    while(defined ($row)){
    foreach(@colUNITED){
        print $row->{$_}."~~~";
    }
    print "<p>";
    $row = $sql_UNITED->fetchrow_hashref;
    }
}

print header;
print "test text<p>";
Init();
test1('270762789');
print "999999999999<p>";

=============================================== =========== 更新:部分问题是32位VS 64位ODBC问题 见http://support.microsoft.com/kb/942976

但是,在我设置ODBC之后,我仍然在Apache日志中遇到以下错误 [Wed 11月24日01:38:48 2010] [错误] [客户端127.0.0.1] DBI连接('SQLSVR206-32','',...)失败:[Microsoft] [ODBC SQL Server驱动程序] [SQL Server ]用户'MYDOMAIN \ GARY $'登录失败。 (SQL-28000)在C:/CGI/test.pl第15行

我以MYDOMAIN \管理员身份登录并启动了Apache。 ODBC设置为使用“使用网络登录ID进行Windows NT身份验证”这个“MYDOMAIN \ GARY $”来自哪里?谢谢!

=============================================== =========== 最终更新:Apache服务使用“本地系统帐户”运行,这就是“MYDOMAIN \ GARY $”的来源。事情是GARY不在公司,他的ID已从SQL Server中删除,但CGI中的ODBC代码从Apache继承了GARY,导致错误28000。 所以问题是卷积 1)32/64位ODBC DSN和 2)Apache使用的默认帐户

2 个答案:

答案 0 :(得分:1)

可能ODBC数据源列在“用户DSN”下,而不是“系统DSN”。我认为您的Web服务器运行的标识只能访问系统DSN。

如果我的帖子没有意义,我正在编辑它,以便添加指向用户与系统DSN之间差异的信息的链接:http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm

答案 1 :(得分:0)

Windows 7 ODBC连接出现了一些问题,我也想不通。我设置了ODBC,它会测试得很好但是会出现类似的错误。即使将MS SQL Server Mgmt Studio连接到某些SQL服务器,我也必须明确地添加额外的连接设置。由于我只在某些SQL服务器(我不拥有)上遇到问题,我认为这是服务器端问题。 在PERL上,我终于放弃了,只是创建了带有所述额外连接设置的DSN文件并直接指向它。请注意服务器名称是如何存在两次。

use DBI;
use SQL::Abstract;
my $CONNECT = "FILEDSN=thefile.dsn";
my $dbh = DBI->connect("dbi:ODBC:$CONNECT", "myidsid", "passwordThatsNotUsed");

使用ODBC文件看起来像:

[ODBC]
DRIVER=SQL Server Native Client 10.0
UID=myidsid
Address=servername,3180
Network=DBMSSOCN
APP=Microsoft® Windows® Operating System
Trusted_Connection=Yes
SERVER=servername
PWD=someTextInPlaceOfPasswordAsItsNotUsed