2 Stimmen

Undefinierte $DBI::errstr bei Verwendung von DBI Perl und MySql auf Windows-7-x64

Verwenden:

MySQL 5.5 ActivePerl v5.14.1 Windows 7 64bit

Das folgende Skript hat ein undefiniertes $DBI::errstr beim Scheitern des execute-Aufrufs:

#!c:/perl/bin/perl.exe -w
use DBI;

my $dbh = DBI->connect('dbi:mysql:cq','root','password') or die "Connection Error: $DBI::errstr\n";

# This SQL should fail because of a foreign key constraint
my $sql = "delete from Player where ID=6462"; 

my $sth = $dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";

Die Ausgabe bei Ausführung des Skripts lautet:

Use of uninitialized value $DBI::errstr in concatenation (.) or string at testmysql2.pl line 10.
SQL Error:

Der SQL-Lauf über HeidiSQL liefert den erwarteten Fremdschlüssel-Fehler: (Ich kann das Bild nicht einfügen, da ich ein neuer Benutzer bin)

Das gleiche Skript, das unter Windows XP 32-Bit ausgeführt wird, liefert den erwarteten Fehler:

DBD::mysql::st execute failed: Cannot delete or update a parent row: a foreign key constraint fails (`cq`.`messageboard`, CONSTRAINT `messageboard_ibfk_1` FOREIGN KEY (`PlayerID`) REFERENCES `player` (`ID`)) at testmysql2.pl line 10.
SQL Error2: Cannot delete or update a parent row: a foreign key constraint fails (`cq`.`messageboard`, CONSTRAINT `messageboard_ibfk_1` FOREIGN KEY (`PlayerID`) REFERENCES `player` (`ID`))

Anmerkung:

Das Problem tritt unabhängig von der SQL auf, zum Beispiel führt ein SQL-Syntaxfehler auch zu einem undefinierten $DBI::errstr

Interessanterweise wird ein Verbindungsfehler zurückgegeben - stoppen Sie zum Beispiel den MySQL-Dienst - führen Sie das Skript aus und die folgende Ausgabe wird wie erwartet ausgegeben:

DBI connect('cq','root',...) failed: Can't connect to MySQL server on 'localhost' (10061) at testmysql2.pl line 4
Connection Error: Can't connect to MySQL server on 'localhost' (10061)

Die Einstellung eines Trace-Levels liefert (für mich) keine nützlichen Informationen:

$sth->trace(5, "trace.txt");
$sth->execute or die "SQL Error: $DBI::errstr\n";

mit einem Ausschnitt aus trace.txt, der wie folgt umformatiert wurde:

dbd_st_free_result_sets
mysql_st_internal_execute MYSQL_VERSION_ID 50147
parse_params statement delete from Player where ID=6462
dbd_st_execute returning imp_sth->row_num 18446744073709551614
execute= ( undef ) [1 items] at testmysql2.pl line 11
DESTROY for DBD::mysql::st (DBI::st=HASH(0x29dc0a8)~INNER) thr#2a97e8

Korrektes SQL funktioniert wie erwartet. Ich vermute, dass dies ein Fehler für Windows 7 64bit ist? - aber ich bin mir nicht sicher, wie ich das Problem beheben oder die richtige Stelle finden kann, um es definitiv zu melden/herauszufinden.

Wenn Sie bis hierher gekommen sind ... danke fürs Lesen!

1voto

bohica Punkte 5804

Hinzufügen von Warnungen, da PrintError standardmäßig aktiviert ist und DBI eine Warnung ausgibt, wenn etwas fehlschlägt. Versuchen Sie auch, das zweite $DBI::errstr in $sth->errstr zu ändern. Wenn das nicht funktioniert, habe ich den Verdacht, dass execute einen Fehler zurückgibt, aber DBD::mysql intern set_err nicht aufgerufen hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X