That has nothing to do with you disconnect.  You are not using finish()
properly, which in your case should not be used at all.  You are actually
disallocating the handle which you prepared and on the second while() run,
there is nothing to execute.

See documentation on finish().

Ilya

-----Original Message-----
From: RICHARD A. NAKROSHIS (Contractor)
To: DBI User's Mailing List
Sent: 7/12/01 2:23 PM
Subject: Error on ->disconnect?

I'm new to DBI programming, and get an error on exiting my program,
which does query the database and return values.  The problem seems to
be with the line $rc = $dbh->disconnect, which does not appear to be
executed.  Can anyone point out what I'm doing wrong? 

Rick

(begin error messages)

(in cleanup) Uncaught exception from user code:
Can't call method "FETCH" on an undefined value at
C:/Perl/site/lib/Win32/TieRegistry.pm line 1486, <> line 4 during global
destruction.
Win32::TieRegistry::DESTROY('Win32::TieRegistry=HASH(0x22292a0)') called
at ora-test.pl line 0
eval {...} called at ora-test.pl line 0

(end error messages)


(begin program listing)

#!/usr/bin/perl -w
use diagnostics;
use strict;
use DBI;
use Term::ReadKey;

my ($rc, $user, $passwd) = '';
print "Username: ";
chomp ($user = <>);

print "Password, please: ";

if ($^O eq 'MSWin32') { 
        ReadMode 'noecho'; 
} else { 
        system ("stty -echo"); 
}

chomp ($passwd = <>);

if ($^O eq 'MSWin32') {
        ReadMode 'normal';
} else {
        system ("stty echo");
}

my $dbh = DBI->connect("dbi:Oracle:DSDB", lc($user), $passwd)
        or die "Couldn't connect to database: " . DBI->errstr;

my $sth = $dbh->prepare('SELECT * FROM prsn WHERE pr_surname_nm = ?')
        or die "Couldn't prepare statement: " . $dbh->errstr;

print "\n\nEnter name> ";
while (my $queryname = <>) {                                    # Read
input from user
        chomp $queryname;
        if ($queryname eq '') { exit };
        my @data;
        $sth->execute(uc($queryname))                           #
Execute the query
                or die "Couldn't execute statement: " . $sth->errstr;
                
        # Read the matching records and print them out
        while (@data = $sth->fetchrow_array()) {
                my $pn_id = $data[0];
                my $last_name = $data[1];
                my $first_name = $data[2];
                my $middle_name = $data[3];
                print "\t$pn_id: $first_name $middle_name $last_name\n";
        }
        
        if ($sth->rows == 0) { print "No names matched
'$queryname'.\n\n"; }
        
        $sth->finish;
        print "\nEnter name> ";
}

$rc = $dbh->disconnect;
print "Return code was $rc\n";

(end program listing)
-- 
Rick Nakroshis
Applications Interface Manager
SEIT Contract Team

Defense Security Service
Ft. Meade, Maryland

(301) 677-5015
 DSN  923-5015

Reply via email to