2008-10-13 115 views
4

出於某種原因,我遇到了DBI句柄的麻煩。基本上發生的事情是,我一個Perl模塊做了一個特殊的連接功能,並從做切換:爲什麼回滾方法不適用於DBI句柄?

do 'foo.pl' 

use Foo; 

,然後我做

$dbh = Foo->connect; 

而現在一些我不斷收到錯誤的原因:

Can't locate object method "rollback" via package "Foo" at ../Foo.pm line 171.

所以奇怪的是,$ dbh絕對不是Foo,它只是在foo中定義的。無論如何,直到現在我還沒有遇到任何麻煩。任何想法是怎麼回事?

編輯:@Axeman:connect原來並不存在。之前我們剛剛我們使用這樣的字符串:

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

connect是這樣

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

您是否更改過連接呼叫? – Axeman 2008-10-14 00:39:31

回答

4

perlfunc

 
     do 'stat.pl'; 

    is just like 

     eval `cat stat.pl`; 

所以,當你do 'foo.pl',你執行當前上下文中的代碼。因爲我不知道foo.plFoo.pm發生了什麼,我不能告訴你發生了什麼變化。但是,我可以告訴你,它始終在當前上下文中執行,現在在Foo::名稱空間中執行。

您調用此方法的方式是將'Foo'作爲第一個參數傳遞給Foo::connect或從Foo->can('connect')返回的子。它似乎不知何故被傳遞給一些認爲它是數據庫句柄的代碼,並且將該對象告知rollback

+0

是的,那是錯誤。我想要一個靜態方法,我假裝Foo是一個類,而不是,它是一個包。謝謝! – 2008-10-14 14:47:48

3

我同意Axeman。你可能應該使用

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

而不是Foo-> connect();

7

我們需要看到Foo中的實際代碼能夠回答這個問題。您可能想從文檔中閱讀Subclassing the DBI以瞭解如何正確執行此操作。

基本上,您需要Foo正確地繼承DBI的子類(再次,您需要閱讀文檔),或者您需要聲明一個連接函數以正確委派給DBI :: connect方法。不過,請注意爲OO代碼編寫產品封裝。這樣很難保持狀態。

相關問題