代码之家  ›  专栏  ›  技术社区  ›  Evan Carroll

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

  •  4
  • Evan Carroll  · 技术社区  · 16 年前

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

    do 'foo.pl'
    

    use Foo;
    

    然后我这样做

    $dbh = Foo->connect;
    

    现在,出于某种原因,我不断得到错误:

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

    奇怪的是$dbh绝对不是foo,它只是在foo中定义的。不管怎样,我到现在为止还没有遇到过什么麻烦。有什么主意吗?

    编辑 @ Axman: connect 原始文件中不存在。在我们得到一个这样的字符串之前:

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

    如此 连接 像这样吗

    sub connect {
        my $dbh = DBI->connect('blah');
        return $dbh;
    }
    
    3 回复  |  直到 16 年前
        1
  •  4
  •   community wiki 3 revs Axeman    16 年前

    perlfunc :

            do 'stat.pl';
    
        is just like
    
            eval `cat stat.pl`;
    

    所以当你 do 'foo.pl' 在当前上下文中执行代码。因为我不知道里面发生了什么 foo.pl Foo.pm 我不能告诉你发生了什么变化。但是,我可以告诉您,它总是在当前上下文中执行,现在在 Foo:: 命名空间。

    你这么说,你是路过 'Foo' 作为第一个参数 Foo::connect 或从 Foo->can('connect') . 似乎不知何故,它被传递给了一些认为它是数据库句柄的代码,并告诉该对象 rollback .

        2
  •  7
  •   Ovid    16 年前

    我们需要看到foo中的实际代码才能回答这个问题。你可能想读 Subclassing the DBI 从文档中查看如何正确执行此操作。

    基本上,您要么需要foo正确地对dbi进行子类化(同样,您需要读取文档),要么需要声明一个connect函数来正确地委托给dbi::connect方法。不过,要小心为OO代码编写producedural包装器。这样的状态很难维持。

        3
  •  3
  •   Frentos    16 年前

    我同意阿克塞曼的观点。您可能应该使用

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

    而不是foo->connect();