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

4

出现了一些问题,我无法使用DBI句柄。基本上发生的事情是,我在一个Perl模块中制作了一个特殊的连接函数,并从以下操作进行了切换:

do 'foo.pl'

为了

use Foo;

然后我执行

$dbh = Foo->connect;

现在我一直出现错误:

无法通过包“Foo”在../Foo.pm的第171行找到对象方法“rollback”。

奇怪的是,$dbh绝对不是Foo,它只是在foo中定义。 总之,直到现在我都没有遇到任何问题。 有什么想法吗?

编辑: @Axeman:connect在原始版本中不存在。 以前我们只使用了一个字符串:

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

因此,connect 大致是这样的:

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

你改变了连接调用吗? - Axeman
3个回答

7
我们需要查看Foo中的实际代码才能回答这个问题。您可能想阅读文档中的Subclassing the DBI,以了解如何正确地执行此操作。
基本上,您需要让Foo正确地子类化DBI(再次阅读文档),或者您需要声明一个连接函数来正确地委托给DBI::connect方法。但是要小心编写OO代码的过程式包装器,因为那样会变得非常难以维护状态。

4

来自perlfunc:

        do 'stat.pl';
就像
eval `cat stat.pl`;

因此,当您执行do 'foo.pl'时,会在当前上下文中执行代码。由于我不知道foo.plFoo.pm中发生了什么,所以无法告诉您发生了什么变化。但是,我可以告诉您它始终在当前上下文中执行,并且现在在Foo::命名空间中执行。

您调用它的方式是将'Foo'作为第一个参数传递给Foo::connect或从Foo->can('connect')返回的子例程。看起来某种方式将其传递给了一些认为它是数据库句柄的代码,并告诉该对象进行rollback


是的,那就是错误所在。我想要一个静态方法,但我假装Foo是一个类,实际上它是一个包。谢谢! - Frew Schmidt

3

我同意Axeman的观点。你应该使用以下方式调用函数:

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

替换为Foo->connect();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接