2011-09-15 63 views
2

使用:

的MySQL 5.5 的activeperl v5.14.1 64位Windows 7

下面的脚本有一个未定义的$ DBI: :在执行调用失败errstr:

#!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: 

通过HeidiSQL的SQL运行提供了预期的外键错误: (我不能插入图像,因为我是一个新用户)

在Windows XP 32位运行相同的脚本提供了预期的错误:

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

有趣的是共同返回nnection错误 - 例如,停止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 64位的错误? - 但我不清楚/失去了如何解决或找到正确的地方报告/找出明确。

如果你有这么远......感谢阅读!

+0

什么版本的'DBI'和'DBD :: mysql'? – mob

回答

1

添加使用警告,因为PrintError在默认情况下处于打开状态,并且会导致DBI在出现问题时发出警告。另外,尝试将第二个$ DBI :: errstr更改为$ sth-> errstr。如果这不起作用,那么我怀疑execute是返回一个失败返回,但DBD :: mysql没有在内部调用set_err。

+0

感谢您的反馈bohica。警告是通过-w标志进行的,但我添加了“使用警告” - 结果相同。我曾试过$ sth-> errstr - 是的同样的结果是一个未定义的字符串。所以它看起来像DBD :: mysql中的一个bug,用于Windows-7-x64 ...关于从哪里来的任何建议? – tadhgmaccarthy

+0

编写一个小型自包含测试用例,并在rt.cpan.org上报告或将其邮寄到http://dbi.perl.org上的dbi用户。我不是说这是一个错误,但我维护DBD :: ODBC的地方,例如,perl -le'使用DBI; $ h = DBI-> connect(“dbi:ODBC:x”,“x”,“x”,{RaiseError => 0,PrintError => 0}); $ s = $ h-> prepare(“select * from does_not_exist“); $ s->执行或死于$ s-> errstr;' 无效的对象名称“does_not_exist”。 (SQL-42S02)[state is 42S02 now 42000] 声明无法准备。 (SQL-42000)在-e行1. – bohica

+0

再次感谢bohica - 我会这样做。正如他们说的那样,在onya的伴侣。 – tadhgmaccarthy