Hi,

I have a problem that my program crashes, since I added a second connect in
a loop. I know that the code isn't good yet (I should use placeholders), but
it shouldn't crash anyway? The trace(2) is attached, and this is the main
part of the code:


$db2dbh = DBI->connect("dbi:ODBC:DB2I21", "tefide", "genf23", { RaiseError
=> 0, PrintError => 1, AutoCommit => 1} ) or do {print LOG
"!!!!!!!!!!!!!!!!!!!!!!!!!!$now $DBI::errstr\n" ; $seconds=300 ; next
MAINLOOP};

$msdbh = DBI->connect("dbi:ODBC:BTETRANSFER", "LOtest", "LOtest", {
RaiseError => 0, PrintError => 1, AutoCommit => 1 } ) or do {print LOG
"!!!!!!!!!!!!!!!!!!!!!!!!!!$now $DBI::errstr\n" ; $seconds=300 ; next
MAINLOOP};

$db2sth = $db2dbh->prepare("SELECT * FROM db2bt0xd.bt02th8");
if ($db2sth->execute) {
        while ( @row = $db2sth->fetchrow_array ) {
        
($alfdnr,$anr,$lsdat,$bestnr,$lnr,$kurzname,$oe,$notiz,$aname) = @row;
                # Wenn Eintrag bei Notiz, Anforderer überschreiben mit Notiz
                $dupe=0;
                $keepnotiz=$notiz;
                if ($notiz =~ /\S/) {
                        $anforderer=$notiz;
                }
                else {
                        $anforderer="$oe $aname";
                }
                # Insert into MSSQL
                # Datum in passendes Format wandeln
                @datum= split /-/ ,$lsdat;
                $lsdat="$datum[2]."."$datum[1]."."$datum[0]";           
                # timestamp in Unix-History
                $timestamp=time();
                # Kürzen auf 20 Zeichen
                $anforderer=substr($anforderer, 0, 20);
                
                # Prüfung ob Barcode bereits in MSSQL
                $mssth = $msdbh->prepare("SELECT Barcode FROM BTEDATEN");
                $mssth->execute;
                while (@barcodes=$msdbh->fetchrow_array) {
                        ($barcode) = @barcodes;
                        if ($barcode eq $alfdnr) {
                                $dupe=1;
                        }
                }
                if ($dupe==1) {
                        $mssth = $msdbh->prepare("UPDATE BTEDATEN SET
Firma='$kurzname', LSNR='$anr', LSDAT='$lsdat', ANABT='$anforderer',
AKNR='$bestnr', BTENOTIZ='$keepnotiz' WHERE Barcode='$alfdnr'");
                        print LOG "Doppelter Barcode: $alfdnr wird
updated!\n";
                        if ($mssth->execute) {
                                push @todelete, $alfdnr;
                        }
                }
                else {
                        $mssth = $msdbh->prepare("INSERT INTO BTEDATEN
(Barcode,Firma,LSNR,LSDAT,ANABT,AKNR,TKNR,VONABT,BESTELLNR,SONSTIGES,TIMESTA
MP,BTENOTIZ) VALUES ('$alfdnr', '$kurzname', '$anr', '$lsdat',
'$anforderer', '$bestnr','','','','','$timestamp','$keepnotiz')") ;
                        print LOG "Unique Barcode: $alfdnr wird inserted\n";
                        # geschriebene Daten merken zum Löschen
                        if ($mssth->execute) {
                                push @todelete,$alfdnr;
                        }
                }
        }
        $c_todelete=@todelete;
        print LOG "###################### $c_todelete Entries to delete from
BTE: @todelete\n";
        # Daten aus DB2 löschen
        foreach $raus (@todelete) {
                $db2sth = $db2dbh->prepare("DELETE FROM db2bt0xd.bt02th8
WHERE A_LFDNR=$raus");
                $db2sth->execute;
        }
}

note: background of the first $msdbh select is that I want to prevent
inserting rows where $alfdnr already exists. I tried a "INSERT INTO ...
WHERE IS NOT (SELECT Barcode FROM BTEDATEN)..." but it seems i may not
combine a INSERT with a WHERE...
DBI is 1.30
ODBC is 0.43
ActiveState Perl 5.6


regards, Lars

Attachment: trace.log
Description: Binary data

Reply via email to