首页 文章

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

提问于
浏览
1

问题: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的error.log中的msg

[Tue Nov 23 13:27:57 2010] [错误] [客户端127.0.0.1] DBI连接('SQLSVR206','管理员',...)失败:[Microsoft] [ODBC驱动程序管理器]未找到数据源名称并且在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 Nov 24 01:38:48 2010] [错误] [客户端127.0.0.1] DBI connect('SQLSVR206-32','',.. . )失败:[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]用户'MYDOMAIN \ GARY $'登录失败 . (SQL-28000)在C:/CGI/test.pl第15行

我以MYDOMAIN \ administrator身份登录并启动了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 回答

  • 1

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

    如果我的帖子没有't make sense, I'm进行编辑,以便添加有关用户与系统DSN之间差异的信息的链接:http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm

  • 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
    

相关问题