2010-11-23 13 views
1

Issue: Perl-Skript in Eingabeaufforderung funktioniert gut, aber nicht auf ODBC als CGI-SkriptPerl-Skript arbeitet in Eingabeaufforderung OK, aber nicht auf ODBC als CGI-Skript

Einstellungen: Win XP Pro 64-Bit-Version 2003 SP2 Apache 2.2.17 Win32 Aktive Perl 5.12.2 (nicht Perl64) eine ODBC-DSN für SQL Server erstellt wird

Details: von Eingabeaufforderung läuft Phone.pl OK - es Abfrageergebnisse wird wie erwartet - was bedeutet, DBI funktioniert gut

als ein CGI-Skript, Ph one.pl gibt HTML wie erwartet vor dem ODBC-Initialisierungscode aus. (Apache-Einstellungen funktioniert OK für Nicht-ODBC-Skript.)

hier ist die msg in error.log von Apache

[Di 23. November 2010 13.27.57] [Fehler] [client 127.0.0.1] DBI connect ('SQLSVR206', 'Administrator', ...) fehlgeschlagen: [Microsoft] [ODBC-Treiber-Manager] Datenquellenname nicht gefunden und kein Standardtreiber angegeben (SQL-IM002) unter C: /CGI/Phone.pl Zeile 32

Irgendeine Idee, warum es sich anders verhält?

#!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: ein Teil des Problems ist die 32-Bit-VS 64-Bit-ODBC-Ausgabe http://support.microsoft.com/kb/942976

JEDOCH sehen, nachdem ich ODBC einrichten, habe ich noch habe folgenden Fehler in Apache Log [Wed Nov 24 01:38:48 2010] [Fehler] [Client 127.0.0.1] DBI Verbindung ('SQLSVR206-32', '', ...) fehlgeschlagen: [Microsoft] [ODBC SQL Server-Treiber] [SQL Server] Anmeldung fehlgeschlagen für Benutzer 'MYDOMAIN \ GARY $'. (SQL-28000) bei C: /CGI/test.pl Zeile 15

Ich habe mich als MYDOMAIN \ Administrator angemeldet und Apache gestartet. ODBC wurde eingerichtet, um "Mit Windows NT-Authentifizierung mit der Netzwerk-Login-ID verwenden" Woher kommt diese "MYDOMAIN \ GARY $"? Vielen Dank!

============================================== ============ FINAL UPDATE: Apache Dienste läuft mit "Local System account", und das ist, wo die "MYDOMAIN \ GARY $" herkommt. Die Sache ist, GARY ist nicht mit der Firma und seine ID wurde von SQL Server gelöscht, aber ODBC-Code in CGI geerbt GARY von Apache, was zu Fehler 28000. So war das Problem eine Faltung von 1) 32/64 Bit ODBC DSN und 2) von Apache verwendetes Standardkonto

+0

Es wäre sehr nützlich sein, wenn Sie das Skript in Frage posten könnten, oder die relevanten Teile zumindest. –

+0

Danke für den Kommentar. Ich habe gerade den Quellcode hinzugefügt. –

Antwort

1

Möglicherweise ist die ODBC-Datenquelle unter 'Benutzer-DSN' und nicht 'System-DSN' aufgeführt. Ich denke, dass die Identität, die Ihr Webserver ausführt, nur Zugriff auf System-DSN hat.

Bei meinem Beitrag keinen Sinn macht, ich bin die Bearbeitung, um einen Link zu Informationen über den Unterschied zwischen User vs. System-DSN hinzuzufügen: http://www.truthsolutions.com/sql/odbc/creating_a_new_odbc_dsn.htm

+0

Danke Regex, hier ist, was passiert - 1. wenn ich "Perl test.pl" scheint es Perl nur in USER DSN, nicht System DSN aussieht. 2. Ich habe System-DSN hinzugefügt und CGI schlägt immer noch mit der gleichen Fehlermeldung fehl. –

+0

Ist es möglich, dass Sie eine 32-Bit-Version von Perl über die Befehlszeile verwenden, der Webserver jedoch eine 64-Bit-Version verwendet? Laut anderen Foren, die ich gelesen habe, würden sie separate ODBC-Treiber benötigen. – regex

+0

Ich habe dasselbe Perl für Befehlszeile & CGI ausgeführt. Das Problem wurde gelöst und ich habe den ursprünglichen Post aktualisiert. Danke für Ihre Hilfe! –

0

Etwas ist mit Windows 7 ODBC-Verbindungen auf das kann ich auch nicht herausfinden. Ich würde die ODBC einrichten und es würde gut testen, aber einen ähnlichen Fehler bekommen, wie Sie zeigen. Selbst wenn MS SQL Server Mgmt Studio mit einigen SQL Servern verbunden wird, muss ich extra Verbindungseinstellungen vornehmen. Da ich das Problem nur auf einigen SQL-Servern habe (die ich nicht besitze), denke ich, dass es ein serverseitiges Problem ist. Auf PERL gab ich schließlich auf und erstellte gerade die DSN-Datei mit den zusätzlichen Verbindungseinstellungen und zeigte direkt darauf. Beachten Sie, dass der Servername zweimal vorhanden ist.

use DBI; 
use SQL::Abstract; 
my $CONNECT = "FILEDSN=thefile.dsn"; 
my $dbh = DBI->connect("dbi:ODBC:$CONNECT", "myidsid", "passwordThatsNotUsed"); 

mit der ODBC-Datei sucht so etwas wie:

[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 
+0

Wenn Sie sagen "und es würde gut testen", haben Sie beide ODBC-Befehle getestet? Weil 64-Bit-Fenster zwei Odbcad32.exe, eine unter \ Windows \ SysWoW64, die andere unter \ Windows \ System32. Und diese beiden Exes zeigen einige gemeinsame Konfigurationen. Siehe den Microsoft Link. –