perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 19
Click for quality!




11.02.2012 / 23:28

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragProgrammabbruch bei fehlender Verbindung vermeiden
Seitenanfang
Liebe Gemeinde,

für folgende Problemstellung suche ich Hilfe:

Ein Messprogramm (Perl) ruft die Messdaten einer Karte ab und sendet die Werte an eine Mysql Datenbak auf einem zentralen Server.
Leider ist der Messrechner nur über eine W-Lan Verbindung mit dem Internet verbunden, wodurch gelegentlich Verbindungsabbrüche auftreten. Ausserdem trennt die Telekom alle 24 h die Verbindung.
Daruas ergibt sich das Problem, das das Programm mit einer Fehlermeldung beendet wird und keine Datenerfassung mehr stattfinden kann.

Der kritische Code-Teil lautet:

my $dbh = DBI->connect($driver,$user,$pass) or print "Datenbankverbindung nicht erfolgreich\n";

my $statement = "Update Tabellenname SET aktID ='$MessreiheNr' WHERE ID ='Labor_09'";

my $sth = $dbh->prepare($statement) or print "Messreihennummer konnte nicht in DB geschrieben werden\n";

$sth->execute() or print "Messreihennummer konnte nicht in DB geschrieben werden (execute)\n";

$dbh->disconnect;

Die Fehler ergeben sich dann meist durch so etwas wie:

DBI connect('*:*','*',...) failed: Lost connection to MySQL server during query at ****.pl line 348
Datenbankverbindung nicht erfolgreich
Can't call method "prepare" on an undefined value at mp1.pl line 359.

Hat jemand eine Idee, wie ich dieses Problem abfangen kann?

Herzlichen Dank.

Thomas

Datum: 08.08.2007-14:09

Beitragre: Programmabbruch bei fehlender Verbindung vermeiden
Seitenanfang
Hallo!

Das Problem ist, dass die connect-Methode bei einem Fehler kein gültiges Objekt zurückgibt, sondern undef. Der Fehler tritt dann bei $dbh->prepare auf, warum sagt dir die letzte Fehlermeldung.

Du musst also verhindern, dass der folgende Code ausgeführt wird, wenn die Datenbankverbindung fehlgeschlagen ist. Entweder mit einer Schleife, die solange immer wieder connect ausführt, bis diese erfolgreich ist; oder mit einer if-Verzweigung, die nur ausgeführt wird, wenn $dbh definiert ist.

Bei der Schleife besteht das Problem, dass das Skript in dieser Zeit nur mit Gewalt zu beenden ist, bei der if-Anweisung gehen die Messdaten wohl verloren, wenn er nach dem Speicherversuch die nächsten aufnimmt.

Grüße, Skrilax

Datum: 08.08.2007-15:33

Beitragre: Programmabbruch bei fehlender Verbindung vermeiden
Seitenanfang
Herzlichen Dank für die schnelle Hilfe.

kannst du mir bitte noch sagen wie die if -Abfrage aussehen könnte?

etwa so in der Art ?


my $dbh = DBI->connect($driver,$user,$pass) or print "Datenbankverbindung nicht erfolgreich\n";

my $statement = "Update Tabelle SET aktID ='$MessreiheNr' WHERE ID ='Labor_09'";

my $sth = $dbh->prepare($statement) or print "Messreihennummer konnte nicht in DB geschrieben werden\n";

#************************************************
if length($dbh) > 0 {
$sth->execute() or print "Messreihennummer konnte nicht in DB geschrieben werden (execute)\n";
} #if
#************************************************

$dbh->disconnect;

Danke schon mal.

Thomas

Datum: 08.08.2007-15:51

Beitragre: Programmabbruch bei fehlender Verbindung vermeiden
Seitenanfang
Nein. Das Problem ist, dass bei einem fehlgeschlagenen connect _sämtliche_ weitere Operationen mit $dbh als Objekt fehlschlagen, eben weil $dbh dann kein Objekt ist.
D.h. es muss direkt nach dem connect geprüft werden, ob $dbh definiert ist, wenn nicht, kann kein $dbh->prepare ausgeführt werden:


if(my $dbh = DBI->connect(...)) {
# usw. usf.
}
else {
print "keine Datenbankverbindung\n"
}

Grüße, Skrilax

Datum: 08.08.2007-16:21

Beitragre: Programmabbruch bei fehlender Verbindung vermeiden
Seitenanfang
Herzlichen Dank,

tolles Forum hier, sofort kompetente Antwort, Klasse.

Thomas

Datum: 08.08.2007-16:27

-






-
-