【问题标题】:Can't locate object method "prepare" via package "DB_CONNECT"无法通过包“DB_CONNECT”定位对象方法“prepare”
【发布时间】:2014-04-22 20:42:36
【问题描述】:

我已经创建包来与数据库建立连接,代码如下:

#!/usr/bin/perl
#Class
package DB_CONNECT;
#Constructor
        sub new {
                        my ($class)=@_;
                        my $self={};

                        $self->{_odbc}="dbi:ODBC:SQLSERVER";
                        $self->{_username}="xxx";
                        $self->{_password}="xxx";
                        $self->{_dbh}=my $dbh;
                        bless $self, $class;
                        return $self;
                }

###Method to open the database connection
        sub db_connect
                {
                use DBI;
                my ($self)=@_;
                $self->{_dbh}=DBI->connect($self->{_odbc},$self->{_username},$self->{_password},{PrintError => 1}) || die "Database connection not made: $DBI::errstr";

                return 1;

                }
1;

这里有一组 Perl 代码从数据库中获取数据。

#!/usr/bin/perl
#use strict;

use Data::Dumper;
use Asterisk::AGI;
use DB_CONNECT;
#require("/root/DB_CONNECT.pm");

my $agi = new Asterisk::AGI;
my $db = DB_CONNECT->new();

my $sql = "EXEC usp_sms_ticket '".$status_data."'";
my $sth = $db->prepare($sql);
$sth->execute();

$return = $sth->fetchrow();
$agi->set_variable('result',$return);
print Dumper($return);
$sth->finish;
$db->disconnect;

每当我执行我的 Perl 程序时,我都会收到以下错误:

无法通过包“DB_CONNECT”定位对象方法“prepare”

【问题讨论】:

  • 你没有“准备”方法,是吗?而且您不是从 DBI 对象继承,而是在使用它,因此您不会以这种方式获得一个。为什么不只使用一个返回 DBI 句柄的函数呢?

标签: perl sql-server-2008


【解决方案1】:

您似乎想将prepare 发送到db->{'_dbh'}。您可以通过像$db->{'_dbh'}->prepare($sql) 那样显式调用它来做到这一点,或者使用像这样的自动加载:

use AutoLoader 'AUTOLOAD';
sub AUTOLOAD {
    my $self = shift;

    (my $method = $AUTOLOAD) =~ s/.*:://;
    if($self->{'_dbh'}->can($method)) {
        return $self->{'_dbh'}->$method(@_);
    }

    die "Unknown method '$method'\n";
}

这样就可以调用$db->prepare($sql) 并将方法调用分派到$db->{'_dbh'}

但是,通过继承 DBI 来完成您想要做的任何事情可能会更好。 on CPAN 有很好的文档。

【讨论】:

  • 感谢重播,我收到以下错误 Can't locate auto/DB_CONNECT/autosplit.ix in @INC(@INC 包含:/usr/lib64/perl5/site_perl/5.8.8/x86_64- linux-thread-multi /usr/lib64/perl5/site_perl/5.8.7/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.6/x86_64-linux-thread-multi /usr/lib64/ perl5/site_perl/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8。 6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl
【解决方案2】:

好吧,您在 DB_CONNECT.pm 中自己定义了一个数据库连接器,但是,在该文件中,没有 prepare 命名的方法。你自定义的对象和dbi方法的标准不一样。所以这种方式,你必须自己实现它的方法,或者你可以使用标准的DBI。你需要的就在这里 http://metacpan.org/pod/DBI#prepare

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-05
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多