问题: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 回答
也许ODBC数据源列在“用户DSN”下,而不是“系统DSN” . 我认为您的Web服务器运行的标识只能访问系统DSN .
如果我的帖子没有't make sense, I'm进行编辑,以便添加有关用户与系统DSN之间差异的信息的链接:http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm
Windows 7 ODBC连接有些问题,我也想不通 . 我已经设置了ODBC,它会测试得很好但是会出现类似的错误 . 即使将MS SQL Server Mgmt Studio连接到某些SQL服务器,我也必须明确地添加额外的连接设置 . 由于我在某些SQL服务器(我不拥有)上只有问题,我认为这是服务器端问题 . 在PERL上,我终于放弃并刚刚创建了带有所述额外连接设置的DSN文件并直接指向它 . 请注意服务器名称是如何存在两次的 .
使用ODBC文件看起来像: