Неопределенный $ DBI :: errstr с использованием DBI Perl и MySql в Windows-7-x64 - PullRequest
2 голосов
/ 15 сентября 2011

Использование:

MySQL 5.5 ActivePerl v5.14.1 Windows 7 64bit

Следующий скрипт имеет неопределенный $ DBI :: errstr в случае сбоя вызова execute:

#!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";

Вывод при запуске скрипта:

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

Запуск SQL через HeidiSQL обеспечивает ожидаемую ошибку внешнего ключа: (Я не могу вставить изображение, так как я новый пользователь)

Тот же сценарий, запущенный в 32-разрядной Windows XP, обеспечивает ожидаемую ошибку:

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`))

Примечание:

Проблема возникает независимо от SQL, например, синтаксическая ошибка SQL также приведет к неопределенному $ DBI :: errstr

Интересно, что возвращается ошибка соединения - например, остановите службу MySQL - запустите сценарий и получите следующий вывод, как и ожидалось:

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)

Установка уровня трассировки не дает полезной информации (для меня):

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

с фрагментом trace.txt с некоторым переформатированием:

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

Корректный SQL работает как положено. Я предполагаю, что это ошибка для Windows 7 64bit? - но мне неясно / потеряно, как решить или найти правильное место, чтобы сообщить / выяснить окончательно.

Если вы зашли так далеко ... спасибо за чтение!

1 Ответ

1 голос
/ 15 сентября 2011

Добавьте предупреждения об использовании, так как PrintError включен по умолчанию, и это заставляет DBI выдавать предупреждение в случае сбоя. Также попробуйте изменить второй $ DBI :: errstr на $ sth-> errstr. Если это не сработает, то я подозреваю, что execute возвращает ошибку возврата, но DBD :: mysql не вызвал set_err для внутреннего использования.

...