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 中的消息

[Tue Nov 23 13:27:57 2010] [error] [client 127.0.0.1] DBI connect('SQLSVR206','administrator',...) failed: [Microsoft] [ODBC Driver Manager] Data source name not found并且在 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] [error] [client 127.0.0.1] DBI connect('SQLSVR206-32','',.. .) 失败:[Microsoft][ODBC SQL Server Driver][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 使用的默认账户

4

2 回答 2

1

也许 ODBC 数据源列在“用户 DSN”而不是“系统 DSN”下。我认为您的网络服务器运行的身份只能访问系统 DSN。

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

于 2010-11-23T22:24:13.280 回答
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
于 2010-11-24T09:36:53.700 回答