IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SGBD Perl Discussion :

Comment récupérer les réponses des requêtes qui ne sont pas de type 'SELECT'


Sujet :

SGBD Perl

  1. #1
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Novembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Novembre 2007
    Messages : 101
    Points : 52
    Points
    52
    Par défaut Comment récupérer les réponses des requêtes qui ne sont pas de type 'SELECT'
    Bonjour,

    J'utilise le module DBI pour accéder à une base de donnée MySQL.
    Après avoir lu le cours "Perl et les bases de données (DBI)" je suis parvenu sans problème à exécuter des requêtes et à récupérer les lignes réponses.

    Cependant, il me semble que toutes les requêtes ne renvoient pas un tableau de plusieurs lignes, caractéristique des requêtes de type 'SELECT'.

    Par exemple, lorsque l'on exécute une requête du type 'CREATE TABLE', il n'y a pas production d'un tableau de lignes, et lorsque l'on exécute ce type de commande avec la console MySQL Command Line Client, la réponse renvoyée pour signaler que l'opération s'est bien passée est :

    'Query OK, 0 rows affected (0.05 sec)'

    Pour les commandes comme 'CREATE TABLE', 'CREATE VIEW', 'DROP TABLE', 'DROP VIEW'..., comment peut on récupérer cette information ?

    Pour plus de précision, voilà la méthode utilisée pour les requêtes 'SELECT', qui ne fonctionne pas dans le cas mentionné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #1) Connexion à la base de données
     
    my %attr = ( PrintError => 1, RaiseError => 0 );
    my $BaseDeDonnees = 'test';
    my $NomHote = 'localhost';
    my $MotDePasse = '';
     
    my $dbh = DBI->connect( "dbi:mysql:dbname=$BaseDeDonnees;host=$NomHote;",$login, $MotDePasse, \%attr )
    			 or die "Connection impossible à la base de donnees $BaseDeDonnees!";
     
    #2) Contenu de la requête
     
    my $requete = CREATE TABLE test(
    	nom VARCHAR(25),
    	prenom VARCHAR(15),
    	date_naiss DATE,
    	adresse VARCHAR(30),
    	ville VARCHAR(15),
    	code_postal VARCHAR(5),
    	PRIMARY KEY (nom,prenom)
    )ENGINE MyISAM;
     
    #3) Préparation de l'exécution
     
    my @lignes_reponse_SQL;
     
     
    my $prep = $dbh->prepare($requete);
    $prep->execute() or die "Echec requete\n";
    while ( my @une_ligne = $prep->fetchrow_array ) {                
      push( @lignes_reponse_SQL, \@une_ligne);  # On stocke une référence du tableau contenant une ligne
    }        
    $prep->finish();
    Merci d'avance à tous ceux qui pourront m'aider.

    Krys006

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Points : 712
    Points
    712
    Par défaut
    Il y a des exemples dans le perldoc de DBI de comment on traite les réponses. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");
    Le nombre de ligne est renvoyé. Il est dit aussi que dans certains cas, il renvoie une valeur booléenne. Je suppose que ça pourrait faire l'affaire, non ?

  3. #3
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Novembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Novembre 2007
    Messages : 101
    Points : 52
    Points
    52
    Par défaut
    Merci thierry.chich

    J'ai fait un test avec ce que tu proposais, c'est-à-dire que j'ai remplacé le duo prepare-execute par un do :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $rows_affected = $dbh->do($Requete_SQL);
    print "resultat=".$rows_affected."\n";
    Le print donne :

    resultat=0E0

    Je ne comprends pas la signification.

    Je suis alors allé voir un peu plus en détail la doc du module et j'ai trouvé une info intéressante :

    Executed

    Type: boolean

    The Executed attribute is true if the handle object has been "executed". Currently only the $dbh do() method and the $sth execute(), execute_array(), and execute_for_fetch() methods set the Executed attribute.

    When it's set on a handle it is also set on the parent handle at the same time. So calling execute() on a $sth also sets the Executed attribute on the parent $dbh.

    The Executed attribute for a database handle is cleared by the commit() and rollback() methods (even if they fail). The Executed attribute of a statement handle is not cleared by the DBI under any circumstances and so acts as a permanent record of whether the statement handle was ever used.

    The Executed attribute was added in DBI 1.41.
    Alors j'ai exécuté le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $prep = $dbh->prepare($Requete_SQL);
    $prep->execute() or die "Echec requete\n";
    if($prep->{Executed} == 1) { print "Query OK. ".$prep->rows." rows affected.\n"; }
    $prep->finish();
    Et cette fois ça fonctionne.
    En revanche, la même chose avec un do ne marche pas, et là je ne vois pas pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $sth = $dbh->do($Requete_SQL);
    print "sth=".$sth."\n";
    if($sth->{Executed} == 1) { print "Query OK. ".$sth->rows." rows affected.\n"; }
    Pourtant la doc dit bien que la méthode do utilise aussi l'attribut Executed.
    Peut-être que quelqu'un pourra expliquer ce point obscur ?

    Merci encore.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/12/2006, 13h38
  2. Réponses: 1
    Dernier message: 09/10/2006, 22h31
  3. Comment récupérer les icones des URL?
    Par Blo0d4x3 dans le forum Windows
    Réponses: 3
    Dernier message: 26/05/2006, 16h29
  4. ShellListView : comment récupérer les noms des fichiers?
    Par Lolo1988 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 12/12/2005, 00h19
  5. Réponses: 27
    Dernier message: 07/10/2005, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo