Perl et DBI Sybase

Perl et DBI Sybase - Perl - Programmation

Marsh Posté le 02-08-2005 à 16:46:00    

J'ai un soucis avec l'utilisation de l'instruction $sth->finish() et du coup je voudrais connaitre l'exacte action de cette derniere.
 
Pour moi quand je fais un finish de ma variable $sth, je libere la variable et je peux l'utiliser pour preparer une nouvelle requête. Malheureusement dans mon programe voila se qui se passe:
 
DEBUG1:Sybase Client-Library/12.0/P/hpux/HP-UX 11.00/1/OPT/Mon Oct  4 12:45:27 1999
Panic: Can't have multiple statement handles on a single database handle when AutoCommit is OFF at /appli/arbaop1/arbor91/tools/perl-5.8.3/lib/site_perl/5.8.3/9000/800-hpux/DBD/Sybase.pm line 133.
 
Je peux resoudre le problème en utilisant l'autocommit mais je voudrai que cela fonctionne dans tout les cas.
 
Quelqu'un peut il m'eclairer sur mon problème?
 
Merci d'avance.
 
Je suis sous:
perl v5.8.3  
DBI 1.05
DBD 1.48
 
Adaptive Server Enterprise/12.0.0.8/P/EBF 12448 ESD4/HP9000-879/HP-UX 11.0/2079/64bit/FBO/
 
 
 
Voici un programme simplifier qui resume mon problème:
 
 
#!/usr/bin/env perl  
 
use DBI;
use DBD::Sybase;
 
 
$p_login    = "toto";
$p_password = "tutu";
 
$p_server   = "myserv";
$p_database = "mydatabase";
 
$dbh1 = DBI->connect("dbi:Sybase:server=$p_server;database=$p_database;charset=iso_1", $p_login, $p_password, { AutoCommit => 0 });
 
if ( !$dbh1 )  
{
  printf "ERROR: pb de connection a la base 1: $p_server,$p_database,$p_login,$p_password\n";
  exit(1);
}  
 
print "DEBUG1:$dbh1->{syb_oc_version}\n";
 
$query1      = "SELECT * FROM my_table";
 
$sth1 = $dbh1->prepare($query1);
 
if (!$sth1)
{
        print "prepare statement error 1:".$dbh->errstr."\n";
        $dbh1->disconnect();
        exit(1);
}
 
$sth1->finish();
 
$sth1 = $dbh1->prepare($query1);
 
if (!$sth1)
{
        print "prepare statement error 1:".$dbh->errstr."\n";
        $dbh1->disconnect();
        exit(1);
}
 
if (!$sth1->execute())
{
        print "execute statement error 1".$dbh->errstr."\n";
        $dbh1->disconnect();
        exit(1);
}
 
$sth1->finish();
 
$dbh1->disconnect();

Reply

Marsh Posté le 02-08-2005 à 16:46:00   

Reply

Marsh Posté le 02-08-2005 à 23:40:33    

la method finish n'est normalement pas utile: elle n'as d'utiliser que pour abandonner une requete non terminée (par exemple si il reste des rows).

Reply

Marsh Posté le 03-08-2005 à 12:24:16    

Donc comment annulé un prepare d'une requete sans fermer la connexion.

Reply

Marsh Posté le 03-08-2005 à 12:55:05    

comment ca annuler un prepare?
Tu veut dire que tu n'a plus besoin du $sth?
Et bien tu peux le réassigner ou le rendre egal à undef, et il sera detruit automatiquement (garbage collection).

Reply

Marsh Posté le 03-08-2005 à 14:14:47    

ben je le pensai aussi mais apparement il y a eu des changement raissement car le code que je mis au dessus marchait avant et ne marche plus avec la derniere version Sybase 12 et DBI 1.05

Reply

Marsh Posté le 03-08-2005 à 15:26:00    

dans le release note ils disent:

Citation :

BEHAVIOR CHANGE - $dbh->{LongReadLen} must now be called
 before $dbh->prepare(). Previously you could call this after
 the $dbh->prepare() but before the $sth->execute().


 
ca pourrait avoir un rapport avec ton probleme?
 
je ne connais pas du tout cette base la, donc si c'est pas un probleme generic de DBI je pourrais pas t'aider

Reply

Marsh Posté le 03-08-2005 à 15:26:58    

dans tous les cas si ca marchait avec une ancienne version retrouve le numero de cette version et regarde ce qui aurait pu changer: http://search.cpan.org/src/MEWP/DB [...] 05/CHANGES

Reply

Marsh Posté le 03-08-2005 à 16:32:14    

Merci pour l'info. Mais moi je n'ai jamais utiliser l'insturction: $dbh->{LongReadLen}

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed