2010-11-23 71 views
1

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

+0

这将是非常有用的,如果你能在问题发布脚本,或者至少相关部分。 – 2010-11-23 22:44:52

+0

感谢您的评论。我只是添加了源代码。 – 2010-11-23 23:57:18

回答

1

也许ODBC数据源列在'用户DSN'下,而不是'系统DSN'。我认为您的Web服务器运行的身份只能访问系统DSN。 http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm

+0

谢谢Regex,这里是发生了什么 - 1.当我“Perl test.pl”看来Perl只在USER DSN而不是SYSTEM DSN中查找。 2.我添加了系统DSN,并且CGI仍然像以前一样失败,并显示相同的错误消息。 – 2010-11-23 23:58:31

0

东西了与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 
相关问题