Du musst DBI nur da einbinden wo das Datenbankhandle $dbh erzeugt wird. In den Klassen wo Du das Handle nur verwendest, ist das nicht noetig. Wenn Du dich verschreibst kratzt schlimmstenfalls das Skript ab mit der Meldung
Can't locate object method "Foo" via package "DBI" at deinskript.pl line 1234.
Du rufst also wie gewohnt prepare und die anderen Funktionen auf, nur das Du nicht $dbh->prepare() schreibst sondern eben $self->{'dbh'}->prepare()
Noch ein Tip bzgl. OO - Du solltest Dir eine Klasse schreiben, die alle Datenbankzugriffe erledigt. An die Klassen die Daten aus der DB brauchen uebergibst Du dann dieses Datenbank-Interface-Objekt. Darueber werden dann Accessor-Methoden aufgerufen, die Referenzen auf die Daten an die aufrufenden Klassen zurueckgiben.
Das koennte dann z.B. so aussehen:
my $dbwrap = new dbWrapper();
if ($dbwrap->connectToDb()) {
$classTwo->setDbWrapper($dbwrap);
}
$dbwrap->disconnect();
$classTwo->setDbWrapper(undef);# In classTwo
sub setDbWrapper {
my $self = shift;
$self->{'dbwrap'} = shift;
}
sub foo {
my $self = shift;
return unless defined $self->{'dbwrap'};
$res = $self->{'dbwrap'}->getSomeDataFromDb();
return unless defined $res;
#mach was mit $res
}
# In dbWrapper
sub getSomeDataFromDb {
my $self = shift;
my $sth = $self->{'dbh'}->prepare($SQL);
return unless defined $sth;
my $res = $sth->execute();
return unless defined $res;
return $sth->fetchall_arrayref();
}
So musst Du, wenn sich an der DB was aendert oder Du das DB-Interface umschreiben willst nur eine Datei (dbWrapper.pm) aendern und nicht alle deine Klassen, die Daten aus der DB verarbeiten, da sich das fuer die anderen Klassen von dbWrapper bereitgestellte Interface wahrscheinlich nicht aendern wird.
Datum: 14.09.2005-23:25
