为啥回滚方法不能用于 DBI 句柄?

Posted

技术标签:

【中文标题】为啥回滚方法不能用于 DBI 句柄?【英文标题】:Why would the rollback method not be available for a DBI handle?为什么回滚方法不能用于 DBI 句柄? 【发布时间】:2010-09-17 00:03:17 【问题描述】:

由于某种原因,我在使用 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;

【问题讨论】:

你改变了连接调用吗? 【参考方案1】:

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

基本上,您要么需要 Foo 正确地将 DBI 子类化(同样,您需要阅读文档),要么需要声明一个连接函数以正确委托给 DBI::connect 方法。不过,为 OO 代码编写生产包装器时要小心。以这种方式维持状态变得非常困难。

【讨论】:

【参考方案2】:

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

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

而不是 Foo->connect();

【讨论】:

【参考方案3】:

来自perlfunc:

做'stat.pl'; 就像 评估`cat stat.pl`;

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

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

【讨论】:

是的,这就是错误。我想要一个静态方法,我假装 Foo 是一个类,但它不是,它是一个包。谢谢!

以上是关于为啥回滚方法不能用于 DBI 句柄?的主要内容,如果未能解决你的问题,请参考以下文章

systemverilog 为啥要用$cast类型转换函数

Perl DBI 语句句柄和错误处理

为啥我用delphi编程获取窗口句柄不成功?

在值类型上定义的扩展方法不能用于创建委托 - 为啥不呢?

为啥这个回滚功能不能按预期工作

oracle 提交事务后为啥不能撤销或回滚,不是有撤销段吗