4

出于某种原因,我在使用 DBI 句柄时遇到了麻烦。基本上发生的事情是我在 perl 模块中创建了一个特殊的连接函数并从执行以下操作切换:

do 'foo.pl'

use Foo;

然后我做

$dbh = Foo->connect;

现在由于某种原因,我不断收到错误消息:

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

所以奇怪的是 $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

We need to see the actual code in Foo to be able to answer this. You probably want to read Subclassing the DBI from the documentation to see how to do this properly.

Basically, you either need Foo to subclass DBI properly (again, you'll need to read the docs), or you need to declare a connect function to properly delegate to the DBI::connect method. Be careful about writing a producedural wrapper for OO code, though. It gets awfully hard to maintain state that way.

于 2008-10-14T11:08:55.527 回答
4

perlfunc

        做'stat.pl';

    就像

        评估`cat stat.pl`;

因此,当您 时do 'foo.pl',您在当前上下文中执行代码。因为我不知道foo.plor中发生了什么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 回答