为什么回滚方法不适用于DBI句柄?

时间:2008-10-13 23:54:13

标签: perl module dbi rollback

出于某种原因,我遇到了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;
}

3 个答案:

答案 0 :(得分:7)

我们需要看到Foo中的实际代码能够回答这个问题。您可能希望阅读文档中的Subclassing the DBI以了解如何正确执行此操作。

基本上,你要么需要Foo来正确地继承DBI(再次,你需要阅读文档),或者你需要声明一个connect函数来正确委托给DBI :: connect方法。但要注意为OO代码编写一个产品包装器。以这种方式维持状态变得非常困难。

答案 1 :(得分: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

答案 2 :(得分:3)

我同意Axeman。您可能应该使用

调用您的函数
use Foo;
...
$dbh = Foo::connect();

而不是Foo-> connect();