2011-09-15 17 views
2

のWindows-7-x64ではDBIはPerlとMySQLを使用して:

のMySQL 5.5 のActivePerl v5.14.1 のWindows 7 64ビット

次のスクリプトは、未定義の$ 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は

コ例えば、MySQLサービスを停止 - - nnectionエラーが返され、予想通り、スクリプトを実行すると、以下の出力が与えられます。

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でのスニペットと

として:予想通り正しいSQLが動作し

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 

。私はこれがWindows 7の64ビットのバグだと思いますか? - しかし、私は明確に/どのように解決するか、報告するための正確な場所を見つける/紛失している。

これまでのところ...読んでいただきありがとうございました!

+0

'DBI'と' DBD :: mysql'のどのバージョンですか? – mob

答えて

1

デフォルトでPrintErrorがオンになっており、何かが失敗した場合にDBIが警告を発するので、警告を追加してください。また、2番目の$ DBI :: errstrを$ sth-> errstrに変更してみてください。それが動作しない場合、私は実行が失敗のリターンを返すが、DBD :: mysqlはset_errを内部的に呼び出さなかったという疑いがある。

+0

フィードバックbohicaありがとう。警告は-wフラグを使用してオンになっていましたが、「警告を使用」を追加しました。同じ結果です。 $ str-> errstrを試してみました。同じ結果が未定義の文字列です。だから、Windows-7-x64用のDBD :: mysqlのバグのように思えます。 – tadhgmaccarthy

+0

自己完結型の小さなテストケースを作成し、rt.cpan.orgに報告するか、dbi-users(http://dbi.perl.org)にメールしてください。私はバグだとは言いませんが、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)[状態42S02は現在42000] ステートメントを準備できませんでした。 (SQL-42000)を-e行1に追加してください。 – bohica

+0

もう一度お付き合いありがとうございます。彼らが下のonyaの仲間の下で言うように。 – tadhgmaccarthy