Perl脚本作品在命令提示符下确定,但ODBC失败的CGI脚本
问题:Perl脚本作品在命令提示符处罚款,但对ODBC失败的CGI脚本Perl脚本作品在命令提示符下确定,但ODBC失败的CGI脚本
设置: 赢XP专业版64位版本2003 SP2 的Apache 2.2.17的Win32 活动的Perl 5.12.2(不Perl64) 是SQL Server创建ODBC DSN
详细信息:从命令提示符,运行Phone.pl OK - 它得到查询结果如预期 - 这意味着DBI工作正常
作为CGI脚本,Ph one.pl在ODBC初始化代码之前按预期打印HTML。 (Apache的设置工作,对于非ODBC脚本确定。)
这里是在Apache中的error.log中
[星期二11月23日13时27分57秒2010] [错误] [客户端127.0.0.1] DBI味精连接('SQLSVR206','管理员',...)失败:[Microsoft] [ODBC驱动程序管理器]数据源名称未找到并且没有指定默认驱动程序(SQL-IM002)在C:/CGI/Phone.pl行32
任何想法为什么它的行为不同?
#!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>";
=========================================== =============== UPDATE:问题的一部分是32位和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','',...)failed:[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使用的默认帐户
也许ODBC数据源列在'用户DSN'下,而不是'系统DSN'。我认为您的Web服务器运行的身份只能访问系统DSN。 http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm
谢谢Regex,这里是发生了什么 - 1.当我“Perl test.pl”看来Perl只在USER DSN而不是SYSTEM DSN中查找。 2.我添加了系统DSN,并且CGI仍然像以前一样失败,并显示相同的错误消息。 – 2010-11-23 23:58:31
东西了与Windows 7 ODBC连接:
如果我的文章没有任何意义,我以一个链接到相关信息与系统DSN的用户之间的差异进行编辑我无法弄清楚。我会设置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-23 22:44:52
感谢您的评论。我只是添加了源代码。 – 2010-11-23 23:57:18