|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Programmabbruch 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

|
re: 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

|
re: 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

|
re: 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

|
re: Programmabbruch bei fehlender Verbindung vermeiden
|
Seitenanfang |
| Herzlichen Dank, tolles Forum hier, sofort kompetente Antwort, Klasse. Thomas
Datum: 08.08.2007-16:27

|
|

|

|

|
 |

|

|
|