无法通过包“DB_CONNECT”找到对象方法“prepare”

时间:2013-11-05 07:05:58

标签: perl sql-server-2008

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

#!/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”

2 个答案:

答案 0 :(得分: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有很好的文档。

答案 1 :(得分:0)

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