问题: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使用的默认帐户
答案 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