Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I wrote a class for basic Database access functionallity:
package MyDB_DB; use DBI; use constant DBI_STRING => 'dbi:mysqlPP:plant;merlin','uname','passwor +d'; my $dbh; sub DB_connect { $dbh = DBI->connect( DBI_STRING ) || die "Cannot connect: $DBI::errstr\n"; #return $dbh; } sub DB_prepare { my $statement = pop; #print 'PlantDB_DB: '.$statement."\n"; my $sth = $dbh->prepare($statement) || die "Cannot prepare statement: $DBI::errstr\n"; return $sth; } sub DB_execute { my $sth = pop; $sth->execute || die "Cannot execute statement: $DBI::errstr\n"; } sub DB_finish { $dbh->disconnect; } sub new { my $self = {}; bless $self; return $self; } return 1;
in my main program i make an instance of that class and call the functions. when the program ends, i get the following message: (in cleanup) Can't call method "close" on an undefined value at ..../mysqlPP.pm line 274 during global destruction. maybe this is a problem related to oo-programming, maybe not. but i dont know how to deal with that message. Can you help? Regards, misu

Replies are listed 'Best First'.
Re: DBI Can't call method "close" during global destruction
by nite_man (Deacon) on Mar 24, 2003 at 12:39 UTC
    You should store a database handler into your object property:
    sub DB_connect { my $self = shift; $self->{dbh} = DBI->connect( DBI_STRING ) || die "Cannot connect: $DBI::errstr\n"; } sub DB_finish { my $self = shift; $self->{dbh}->disconnect; }

    For understanding Perl OO, please see Tutorials::Object Oriented Perl.
    If you need to have a superstructure over DBI, it's enough to make it as module not necessary to create a class.
    --------> SV* sv_bless(SV* sv, HV* stash);
      I also suggest:
      sub DB_finish { my $self = shift; if (defined($self->{dbh})) { $self->{dbh}->disconnect; } }
      because if the database connect fails or is not called the dbh variable will be undefined and the same error will occur again.

      Regards,
      Marcel