2

私のコードは次のとおりです。

sub new {
    my $class = shift;
    my $self = bless {}, $class;

    $self->initialize();

    return $self;
}

sub initialize
{
    my $self = shift;

    $self->connect();

    $self->{'dbh'}
        ->do("CREATE TABLE IF NOT EXISTS 'settings' (Id INTEGER PRIMARY KEY, Option TEXT, Value TEXT)");
}

sub connect
{
    my $self = shift;

    $self->{'dbh'} = DBI->connect($self->DSN, "", "", {
        RaiseError => 1,
        AutoCommit => 1
    });

    die "Can't connect" unless($self->{'dbh'});
}

sub no_options
{
    my$self = shift;

    $self->{'dbh'}->prepare("SELECT COUNT(*) as Total FROM settings");
    # Here is the problem i get the error here:
    # Can't locate object method "execute" via package "DBI::db"
    $self->{'dbh'}->execute();
    my %row = $self->{'dbh'}->fetchhash_array;

    return $row{'Total'};
}

他の場所で私は私のパッケージを呼び出します

my $test = Lib::PackageName->new;

print $test->no_options;
4

2 に答える 2

5

このprepareメソッドはステートメントオブジェクトを返します。executeメソッドを持つのはこのオブジェクトです。

my $statement = $self->{'dbh'}->prepare("SELECT COUNT(*) as Total FROM settings");
$statement->execute();

fetchhash_arrayで指定されたメソッドはありませんDBI。ステートメントオブジェクトで使用可能なフェッチメソッドは次のとおりです。

于 2012-08-09T15:22:54.740 に答える
1

$self->{'dbh'}->prepare(...)後で使用するために保持する必要があるステートメントハンドルを返します。

my $sth = $self->{'dbh'}->prepare("SELECT COUNT(*) as Total FROM settings");
$sth->execute;
my %row = $sth->fetchhash_array;
于 2012-08-09T15:26:10.717 に答える