0

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

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

4

2 回答 2

1

看起来你想分派preparedb->{'_dbh'}. 您可以通过显式调用它来做到这一点 like $db->{'_dbh'}->prepare($sql),或者使用 autoload 像:

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 来完成你想要做的任何事情可能会更好。在 CPAN 上有很好的文档。

于 2013-11-05T15:07:43.290 回答
0

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

于 2013-11-05T09:57:59.767 回答