4

何らかの理由で、DBI ハンドルに問題があります。基本的に何が起こったのかというと、perl モジュールで特別な接続関数を作成し、次のように切り替えることでした。

do 'foo.pl'

use Foo;

そして、私はします

$dbh = Foo->connect;

そして今、何らかの理由でエラーが発生し続けます:

../Foo.pm 行 171 で、パッケージ「Foo」を介してオブジェクト メソッド「rollback」が見つかりません。

したがって、奇妙なことは、$dbh は絶対に Foo ではなく、単に foo で定義されているということです。とにかく、今までそれで困ったことはありません。どうしたの?

編集:@Axeman:connectオリジナルには存在しませんでした。次のように使用する文字列を作成する前に、次のようにします。

do 'foo.pl';
$dbh = DBI->connect($DBConnectString);

このようconnectなものもあります

sub connect {
    my $dbh = DBI->connect('blah');
    return $dbh;
}
4

3 に答える 3

7

これに答えるには、Foo の実際のコードを確認する必要があります。これを正しく行う方法については、ドキュメントの DBI のサブクラス化をお読みになることをお勧めします。

基本的に、DBI を適切にサブクラス化するには Foo が必要です (これもドキュメントを読む必要があります)、または DBI::connect メソッドに適切にデリゲートするために接続関数を宣言する必要があります。ただし、オブジェクト指向コードのプロデュース ラッパーを作成する場合は注意が必要です。その状態を維持するのは非常に困難です。

于 2008-10-14T11:08:55.527 に答える
4

perlfuncから:

        do 'stat.pl';

    のようです

        eval `cat stat.pl`;

そのdo 'foo.pl'ため、現在のコンテキストでコードを実行します。foo.plやで何が起こっているのかわからないので、何がFoo.pm変わったのかはわかりません。ただし、常に現在のコンテキストで実行され、現在はFoo::名前空間で実行されていると言えます。

これを呼び出す方法は'Foo'、最初のパラメーターとして に渡すFoo::connectか、または返されたサブルーチンからFoo->can('connect')です。どういうわけか、それがデータベース ハンドルであると考えるコードに渡され、そのオブジェクトを に伝えているようrollbackです。

于 2008-10-14T00:55:17.933 に答える
3

アックスマンに同意。おそらく、次を使用して関数を呼び出す必要があります

use Foo;
...
$dbh = Foo::connect();

Foo->connect(); の代わりに

于 2008-10-14T04:30:57.077 に答える