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

Python Discussion :

Acces en Base avec problème d'insertion


Sujet :

Python

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Acces en Base avec problème d'insertion
    bonjour

    j'ai un problème avec le processus d'insertion des donnée d'une zone de texte contenant une ou plusieurs apostrophes.


    lancerv1.py
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    # coding: utf-8  
    '''
    Created on 11 déc. 2017
     
     @author: eric
    '''
    import string
    import sys
    import datetime
    import csv
    import os
     
     
     
    from Tables import *
    from Explorateur import *
    from base import *
     
     
    if __name__ == '__main__':
        nom_fichier_path_in = explorateur_window (".//") # Recherche via explorateur
        if os.path.isfile(nom_fichier_path_in):
     
            # Ouverture du fichier destination
            nom_fichier_in = os.path.basename(nom_fichier_path_in) # Retourne le nom du fichier
            nom_fichier_path = os.path.dirname(nom_fichier_path_in) # Retourne le répertoire complet
            list_nf = os.path.split(nom_fichier_path_in) # Fractionne le chemin d'acc�s. Retourne un 
            projet = Creation_table()  # Base de données
            projet.nomrepertoire= nom_fichier_path
            projet.creer_table()
            print(projet.dbNAME)      
     
     
            fic = exercice()
            fic.libelle ="regarde l'endive"
            fic.numero =2
            fic.montant = 26.2
            print(fic)
            fic.db_insertion(projet)
     
            fic.libelle ="L'homme est vivant "
            fic.numero =3
            fic.montant = 8.25
            print(fic)
            fic.db_insertion(projet)
     
            fic.libelle ="D'or de d'argent"
            fic.numero = 4
            fic.montant = 9879.15
            print(fic)
            fic.db_insertion(projet)
     
            fic.libelle ="4 millions d'euros"
            fic.numero = 5
            fic.montant = 56
            print(fic)
            fic.db_insertion(projet)
            fic.db_insertion(projet)
    Tables.py

    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
    35
    36
    37
    38
    39
    40
    41
    42
     
    # coding: utf-8  
    import sqlite3
    import os
     
     
    class Creation_table(object):
     
        """ Structure des tables  """
     
        def __init__(self):
            self.dbNAME ='DB_primer.sq3'  
            self.nomrepertoire =None
            self.Base =None
     
        def creer_table(self):
          # Supression du fichire des la base et reconception
     
            self.dbNAME =self.nomrepertoire+'/'  +self.dbNAME
     
             # print("Lancer de la base SQLite:"+self.dbNAME )
            if(os.path.isfile(self.dbNAME)== True): #Cette méthode retourne true si le chemin spécifié 
                os.remove(self.dbNAME) # pour supprimer un fichier 
     
     
            self.Base =sqlite3.connect(self.dbNAME)  # ouverture DB
     
            curseur = self.Base.cursor() # appel au curseur
     
            table ="""CREATE TABLE Produit_0110 (
            numero INETGER,
            libelle nvarchar(150),
            montant  real);"""
     
            if(table!=""):
                try:
                    curseur.execute(table)
                    self.Base.commit()
                except:
                    print("Problème table")  
     
            self.Base.close()
    base.py

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    # coding: utf-8  
    from Tables import *
    '''
    Created on 11 déc. 2017
     
    @author: eric
    '''
    from builtins import str
     
    class exercice(object):
        '''
        classdocs
        '''
     
        def __init__(self):
            '''
               CREATE TABLE exercice (
                numero INTEGER,
                libelle nvarchar(100),
                montant real);
     
            '''
            self.numero= None
            self.libelle =None
            self.montant = None
     
        def __str__(self):
            resultat = 'numero :' + str(self.numero) +'\n'
            resultat += 'libelle : ' + self.libelle +'\n'
            resultat += 'montant : '+str(self.montant)
            return resultat
     
     
        def db_insertion(self,nombase):
     
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(" + str( self.numero) + ","
            rq += "'" + self.libelle + "',"
            rq += str( self.montant) + ")"
            print(rq)
            try:
                #print(nombase.dbNAME)
     
                nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
                try:
                    curseur = nombase.cursor() # appel au curseur
                    try:
                        curseur.execute(rq)
                    except:
                        print("Insertion hs Produit_0110")
                    nombase.commit()
                except:
                    print("problème de curseur")
                nombase.close()   
            except:
                print("acces Base impossible")

    le problème des insert est le suivant

    voici le résultat du print(rq)

    numero :2
    libelle : regarde l'endive
    montant : 26.2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Produit_0110 (numero, libelle, montant)  VALUES(2,'regarde l'endive',26.2)
    Insertion hs Produit_0110




    j'ai cherché une autre solution

    base.py
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    # coding: utf-8  
    from Tables import *
    '''
    Created on 11 déc. 2017
     
    @author: eric
    '''
    from builtins import str
     
    class exercice(object):
        '''
        classdocs
        '''
     
        def __init__(self):
            '''
               CREATE TABLE exercice (
                numero INTEGER,
                libelle nvarchar(100),
                montant real);
     
            '''
            self.numero= None
            self.libelle =None
            self.montant = None
     
        def __str__(self):
            resultat = 'numero :' + str(self.numero) +'\n'
            resultat += 'libelle : ' + self.libelle +'\n'
            resultat += 'montant : '+str(self.montant)
            return resultat
     
        def __csv_donnee__(self):
            resulta = [self.numero, self.libelle,self.montant]
            return resulta
        pass
     
        def db_insertion(self,nombase):
     
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq += "  VALUES(?,?,?)"
     
            try:
                #print(nombase.dbNAME)
     
                nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
                try:
                    curseur = nombase.cursor() # appel au curseur
                    try:
                        curseur.execute(rq ,  __csv_donnee__()) 
                    except:
                        print("Insertion hs Produit_0110")
                    nombase.commit()
                except:
                    print("problème de curseur")
                nombase.close()   
            except:
                print("acces Base impossible")
    malheureusement


    numero :2
    libelle : regarde l'endive
    montant : 26.2
    Insertion hs Produit_0110
    numero :3
    libelle : L'homme est vivant
    montant : 8.25
    Insertion hs Produit_0110
    numero :4
    libelle : D'or de d'argent
    montant : 9879.15
    Insertion hs Produit_0110
    numero :5
    libelle : 4 millions d'euros
    montant : 56
    Insertion hs Produit_0110
    Insertion hs Produit_0110

    base.py (version3) et cette version marche sans prolème mais si vous avez des idees d'amélioration

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    # coding: utf-8  
    from Tables import *
    '''
    Created on 11 déc. 2017
     
    @author: eric
    '''
    from builtins import str
     
    class exercice(object):
        '''
        classdocs
        '''
     
        def __init__(self):
            '''
               CREATE TABLE exercice (
                numero INTEGER,
                libelle nvarchar(100),
                montant real);
     
            '''
            self.numero= None
            self.libelle =None
            self.montant = None
     
        def __str__(self):
            resultat = 'numero :' + str(self.numero) +'\n'
            resultat += 'libelle : ' + self.libelle +'\n'
            resultat += 'montant : '+str(self.montant)
            return resultat
     
        def __csv_donnee__(self):
            resulta = [self.numero, self.libelle,self.montant]
            return resulta
        pass
     
        def liste_donnee(self):
            resulta = (self.numero, self.libelle,self.montant)
            return resulta
        pass
     
        pass
     
     
        def db_insertion(self,nombase):
     
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(?,?,?)"
     
            try:
                #print(nombase.dbNAME)
     
                nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
                try:
                    curseur = nombase.cursor() # appel au curseur
                    try:
                        curseur.execute(rq ,  self.liste_donnee()) 
                    except:
                        print("Insertion hs Produit_0110")
                    nombase.commit()
                except:
                    print("problème de curseur")
                nombase.close()   
            except:
                print("acces Base impossible")

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Je n'ai pas lu tout le code, mais si ta chaine de caractère contient des apostrophes, il ne faut pas utiliser l'apostrophe aussi pour la délimiter !

    Donc quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rq += "'" + self.libelle + "',"
    Si self.libelle contient une apostrophe ca se passe mal c'est sûr !
    Ecrit plutôt comme ceci, pour délimiter ta chaine avec des guillements et non des apostrophes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rq += '"' + self.libelle + '",'
    Voire même avec des délimiteurs apostrophes triplés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rq += '''"%s"'''%self.libelle
    qui permettent de gérer aussi bien les chaines qui contiennent des apostrophes et celles qui contiennent des guillemets.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Le problème n'est pas tant du côté des apostrophe que dans celui de l'utilisation de l'API.
    En effet, écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(" + str( self.numero) + ","
            rq += "'" + self.libelle + "',"
            rq += str( self.montant) + ")"
            curseur.execute(rq)
    c'est assembler la chaîne de caractère soi même. Une opération qui est fortement déconseillée (pour des questions de sécurité) dans les premiers paragraphes de la documentation.
    Il est recommandé d'utiliser la substitution de paramètre (avec '?' pour sqlite3) comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            rq = "INSERT INTO Produit_0110 (numero, libelle, montant) VALUES(?,?,?)"
            curseur.execute(rq, (self.numero,  self.libelle, self.montant))
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Le problème n'est pas tant du côté des apostrophe que dans celui de l'utilisation de l'API.
    En effet, écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(" + str( self.numero) + ","
            rq += "'" + self.libelle + "',"
            rq += str( self.montant) + ")"
            curseur.execute(rq)
    c'est assembler la chaîne de caractère soi même. Une opération qui est fortement déconseillée (pour des questions de sécurité) dans les premiers paragraphes de la documentation.
    Il est recommandé d'utiliser la substitution de paramètre (avec '?' pour sqlite3) comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            rq = "INSERT INTO Produit_0110 (numero, libelle, montant) VALUES(?,?,?)"
            curseur.execute(rq, (self.numero,  self.libelle, self.montant))
    - W

    effectivement voila pourquoi je suis partie sur ce concepte dans la derniere version de base.py

  5. #5
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut problème
    J'ai visiblement des anomalies


    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
    def db_insertion(self,nombase):
     
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(?,?,?)"
     
            try:
                #print(nombase.dbNAME)
     
                nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
                try:
                    curseur = nombase.cursor() # appel au curseur
                    try:
                        curseur.execute(rq ,  self.liste_donnee()) 
                    except:
                        print("Insertion hs Produit_0110")
                    nombase.commit()
                except:
                    print("problème de curseur")
                nombase.close()   
            except:
                print("acces Base impossible")
    J'ai dans certain cas ce retour "Insertion hs Produit_0110"
    A priori dans l'interprétation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     curseur.execute(rq ,  self.liste_donnee())
    mais comment puis-je voir ce qui cause problème.

    Comment remonter l'erreur ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    Bonjour

    Tu pourrais déjà soit retirer ton try/except soit lever l'exception à nouveau pour avoir un message plus clair

    Sinon, as tu vérifié ce que retourne self.liste_donnee() et quel est son type ?
    Le savoir est une arme alors soyons armés

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Comment remonter l'erreur ?
    Pour utiliser correctement try...except, il faut apprendre à s'en servir et les tuto. sont là où se trouvent ces informations.
    Ceci dit la documentation du module sqlite3 (que je vous ai déjà indiqué) contient aussi des exemples de gestion des erreurs. Vous y trouveriez aussi une façon efficace pour gérer les transactions avec un context manager...
    A vous de voir...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par DonKnacki Voir le message
    Bonjour

    Tu pourrais déjà soit retirer ton try/except soit lever l'exception à nouveau pour avoir un message plus clair

    Sinon, as tu vérifié ce que retourne self.liste_donnee() et quel est son type ?

    J'ai creer un autre cas

    une table fait de 21 champ de type nvarchar(5).
    et la donnée que retourne self.liste_donnee()
    soit
    ['0140', 'R', 'TETS', '08180', '', '', 'OPLU', '45556', 'TEI', 'L5499', '', '1900-01-01', 'None', 'S', 'zz', '', '', '', '1', '15', '']
    soit
    ['0140', 'R', 'TETS', '08180', '', '', 'OPLU', '45556', 'TEI', 'L5499', '', '1900-01-01', None, 'S', 'zz', '', '', '', '1', '15', '']

    avec


    avec un insert et values (?, ,?) 21 ? autant que de champ nvarchar

  9. #9
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    exemple

    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
         CREATE TABLE L140 (
                z1 nvarchar(4),
                z2 nvarchar(1),
                z3  nvarchar(10),
                z4 nvarchar(10),
                z5 nvarchar(10),
                z6 nvarchar(10),
                z7 nvarchar(10),
                z8 nvarchar(10),
                z9 nvarchar(10),
                z10 nvarchar(5),
                z11  nvarchar(5),
                Date_debut_Effet nvarchar(10),
                Date_Fin_Effet  nvarchar(10),
                z14 nvarchar(5),
                z15 nvarchar(5),
                z16 nvarchar(5),
                z17 nvarchar(5),
                z18 nvarchar(5),
                z19 nvarchar(1),
                z20 nvarchar(3),
                z21 nvarchar(5));
     
    CREATE INDEX [IFK_LM] ON [L140] 
            (z1, z2, z3, z5,z7,z8);

    la zone nombase.dbNAME est lie a une base de donnée sqllite3 même si cela n'est pas clairement noté dans cette exemple


    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
     
     rq = """INSERT INTO L140   
            (z1, z2, z3, z4, z5,z6  
            , z7, z8, z8, z10, z11,   
            Date_debut_Effet, Date_Fin_Effet, z14, z15,  
             z16, z17, z18, z19, z20, z21)  
            VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); """
     
     resulta = ['0140', 'R', 'ABSAN9987a', '00110', '', '', 're', '88997', 'LolTE', 'Li899', '', '1900-01-01', "None", 'S', 'zB', '', '', '', '1', '10', '']
     
     nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
     curseur = nombase.cursor() # appel au curseur
     curseur.execute(rq,resulta)
     nombase.commit()
     nombase.close()

    curseur.execute(rq,resulta)
    sqlite3.OperationalError: near "(": syntax error

    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resulta = ('0140', 'R', 'ABSAN9987a', '00110', '', '', 're', '88997', 'LolTE', 'Li899', '', '1900-01-01', "None", 'S', 'zB', '', '', '', '1', '10', '')
    même résultat

    curseur.execute(rq,resulta)
    sqlite3.OperationalError: near "(": syntax error

  10. #10
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut --
    J'ai fait d'autre essai avec d'autre base qui fonctionne et pour celle-ci problème ...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    Sans grande conviction mais resulta ne devrait pas être une liste de tuples ?
    Le savoir est une arme alors soyons armés

  12. #12
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par DonKnacki Voir le message
    Sans grande conviction mais resulta ne devrait pas être une liste de tuples ?
    Une liste de tuples ...
    Mais n'est-ce pas le cas?

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Les constructions qui fonctionnent sont en nombre fini.
    A l'opposé la créativité des débutants est infinie et attraper toutes les erreurs possibles et sortir une erreur qui renseigne sur sa cause est impossible.
    C'est pour cela qu'il ne faut pas négliger le temps passé à apprendre à bien construire.

    Relisez votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rq = """INSERT INTO L140   
            (z1, z2, z3, z4, z5,z6  
            , z7, z8, z8, z10, z11,   
            Date_debut_Effet, Date_Fin_Effet, z14, z15,  
             z16, z17, z18, z19, z20, z21)  
            VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); """
    supprimez le ";" qui arrive en dernier.
    Méditez sur les motivations obscures qui vous ont poussé à l’insérer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Les constructions qui fonctionnent sont en nombre fini.
    A l'opposé la créativité des débutants est infinie et attraper toutes les erreurs possibles et sortir une erreur qui renseigne sur sa cause est impossible.
    C'est pour cela qu'il ne faut pas négliger le temps passé à apprendre à bien construire.

    Relisez votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rq = """INSERT INTO L140   
            (z1, z2, z3, z4, z5,z6  
            , z7, z8, z8, z10, z11,   
            Date_debut_Effet, Date_Fin_Effet, z14, z15,  
             z16, z17, z18, z19, z20, z21)  
            VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); """
    supprimez le ";" qui arrive en dernier.
    Méditez sur les motivations obscures qui vous ont poussé à l’insérer.

    - W
    une habitude de fin de code sql.

    pour autant j'ai repris chacun de les cas 10 de a -z . j'ai garde le ";" en fin de ligne .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    rq = """rq = insert into MaTable  (C1,C2,...,Cn) VALUES(?, ?,..., ?); """
    resulta = [self.C1,self.C2,... , str(self.Cx),... ,self.Cn]
     
    nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
    curseur = nombase.cursor() # appel au curseur
    curseur.execute(rq,resulta)
    nombase.commit()
    nombase.close()
    str(self.Cx) : ceci parceque les données sont de type datetime.

    J'ai le requêtage d'insertion avec tuple contenant les données
    plutot que la reconstruction harsardeuse de la requête

    est a priorie plus de problème sur mon cas de TEst.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Une liste de tuples ...
    Mais n'est-ce pas le cas?
    Pas dans le code que tu proposes en tout cas

    Citation Envoyé par dedalios Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resulta = ['0140', 'R', 'ABSAN9987a', '00110', '', '', 're', '88997', 'LolTE', 'Li899', '', '1900-01-01', "None", 'S', 'zB', '', '', '', '1', '10', '']
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resulta = ('0140', 'R', 'ABSAN9987a', '00110', '', '', 're', '88997', 'LolTE', 'Li899', '', '1900-01-01', "None", 'S', 'zB', '', '', '', '1', '10', '')
    Le premier est une liste et le second est un tuple
    La doc montre un exemple avec une liste de tuple donc
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    resulta = [('0140', 'R', 'ABSAN9987a', '00110', '', '', 're', '88997', 'LolTE', 'Li899', '', '1900-01-01', "None", 'S', 'zB', '', '', '', '1', '10', '')]

    Mais ce n'est surement pas le problème sinon j'imagine que l'erreur serait plus explicite
    Le savoir est une arme alors soyons armés

  16. #16
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Solution
    Bonjour

    VOICi non pas le code finale mais l'esprit de ce code


    Le lanceur
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    # coding: utf-8  
    from Tables import *
    from Explorateur import *
    import sqlite3
    import csv
    from random import uniform
    '''
    Created on 11 déc. 2017
     
    @author:  
    '''
    from builtins import str
     
    class exercice(object):
        '''
        classdocs
        '''
     
        def __init__(self):
            self.numero= None
            self.libelle =None
            self.montant = None
     
        def __str__(self):
            resultat = 'numero :' + str(self.numero) +'\n'
            resultat += 'libelle : ' + self.libelle +'\n'
            resultat += 'montant : '+str(self.montant)
            return resultat
     
        def __csv_donnee__(self):
            resulta =[self.numero,self.libelle ,self.montant]
            return resulta
     
        def __csv_entete__(self):
            resulta =["numero","libelle" ,"montant"]
            return resulta 
     
        def db_insertion(self,nombase):
     
            rq = """INSERT INTO exercice 
                    (numero, libelle, montant) 
                     VALUES(?, ?, ?) """
     
            nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
            curseur = nombase.cursor() # appel au curseur
            curseur.execute(rq,self.__csv_donnee__())
            nombase.commit()
            nombase.close()    
     
        def csv_donnee(self, nomfichier):
            """  Ecriture du fichier format csv -donnee"""
            ecrire_csv = csv.writer(nomfichier, delimiter = ';') # Codage du fichier csv délimiter de champ
            ecrire_csv.writerow(self.__csv_donnee__())  # donnée  
     
        def csv_entete(self,nomfichier):
            """  Ecriture du fichier format csv -entete"""
            ecrire_csv = csv.writer(nomfichier, delimiter = ';') # Codage du fichier csv délimiter de champ
            ecrire_csv.writerow(self.__csv_entete__())  # donnée 
     
     
     
    # Base Application
    if __name__ == '__main__':
     
        open_ok =False    
        nom_fichier_path_in = explorateur_window (".//") # Recherche via explorateur
        if os.path.isfile(nom_fichier_path_in):
              # Ouverture du fichier destination
            nom_fichier_in = os.path.basename(nom_fichier_path_in) # Retourne le nom du fichier
            nom_fichier_path = os.path.dirname(nom_fichier_path_in) # Retourne le répertoire complet
            list_nf = os.path.split(nom_fichier_path_in) # Fractionne le chemin d'acc�s. Retourne un tuple
     
     
             # creation de la Base de données
            projet = Creation_table()  # creation de la Base de données
            projet.nomrepertoire= nom_fichier_path
            projet.creer_table()
            print(projet.dbNAME)   
             # creation de la Base de données
     
            # creation ddu fichier scv
            nom_fichier_out = nom_fichier_path +'//'+"resulta.csv" 
            fichier_out = open(nom_fichier_out, 'w', newline='')    
            nom_fichier_produit_entete = False 
     
            # conception  de l'objet conetnant les données
            cas =exercice()
     
            # génération de l'entête ( dans cette version cela n'a pas grand interret )
            # Mais si cette opération est réalise dans une boucle 
     
            for i in range(0,10000):
                if (nom_fichier_produit_entete == False ):
                    cas.csv_entete(fichier_out) 
                    nom_fichier_produit_entete = True  
     
                cas.numero = i
                cas.libelle= "Element N° : " +str(i)
                cas.montant = uniform(2,i *1000) 
     
                cas.csv_donnee(fichier_out) #fichier csv
     
                cas.db_insertion(projet) #base
    La partie construction de la base

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    # coding: utf-8  
    import sqlite3
    import os
     
     
    class Creation_table(object):
     
        """ Structure des tables  """
     
        def __init__(self):
            self.dbNAME ='DBtribox-1.sq3'  
            self.nomrepertoire =None
            self.Base =None
     
        def creer_table(self):
          # Supression du fichire des la base et reconception
     
            self.dbNAME =self.nomrepertoire+'/'  +self.dbNAME
     
             # print("Lancer de la base SQLite:"+self.dbNAME )
            if(os.path.isfile(self.dbNAME)== True): #Cette méthode retourne true si le chemin spécifié 
                os.remove(self.dbNAME) # pour supprimer un fichier 
     
     
            self.Base =sqlite3.connect(self.dbNAME)  # ouverture DB
     
            curseur = self.Base.cursor() # appel au curseur
     
     
            table_t110 = """ CREATE TABLE exercice (
                numero INTEGER,
                libelle nvarchar(100),
                montant real)"""
     
            if(table_t110!=""):
                try:
                    curseur.execute(table_t110)
                    self.Base.commit()
                except:
                    print("Problème table_t110")  
     
     
            self.Base.close()
    L'outil d'appel pour créer le fichier de départ (utiliser dans le processus final pour accéder au fichier qui devra en finalité être utiliser pou charge en base de donnée)

    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
    # coding: utf-8  
     
    import tkinter 
    from tkinter.filedialog import askopenfilename
     
    '''Created on 21 aout 2017 
    @author: EricS 
    '''
    def explorateur_window(repertoireinit):
        """ Explorateur Windows    """
        #root = tkinter.Tk()
     
        filename = tkinter.filedialog.askopenfilename(
            initialdir=repertoireinit,
            title="Choisir votre fichier",
            filetypes=(
                ("Fichier .txt", "*.txt"),
                ("Tous type de fichier","*.*")
            )
        )
        return filename
    pass
    Ce code fonctionne sans problème particulier

    Et il lui faut moins d'1 minute avec 100 enregistrements pour charge base et csv.
    Nous sommes il est vrai sur un faible volume.

    par contre 10.000 enregistrements il a fallu prés d1h. je comment a comprendre que SQLlite n'est pas la solution (bon la puissance machine joue aussi et ce pc a quelque année I3 d'ancienne génération avec 8g0)


    Dans mon processus finalisé , j'ai 10 tables. donc 10 fichiers csv
    LE fichier de départ fait 1.5 go.
    Sans le process de chargement en base de données le création de fichier csv a mis 15mn.
    Si j'ajoute le chargement en base cela a tourne plus de 8h sans arrivé au bout du processus.

    LA seule différence entre les modalité de chargement de la base en le fichiers csv ,
    est que chaque enregistrement en base est commit alors que l'écriture du fichier est constituer par le close.

    serait il plus pertinent de comiter la base tous les 10 enregistrement s avec un facteur de risque plus important ?
    si j'importe les fichier csv en base avec dbeaver le processus est bien plus rapide....

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par dedalios Voir le message
    serait il plus pertinent de comiter la base tous les 10 enregistrement s avec un facteur de risque plus important ?
    Ce serait encore mieux d'utiliser executemany.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  18. #18
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ce serait encore mieux d'utiliser executemany.

    - W
    Si je comprends bien la commande de l'exemple sité

    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
    import sqlite3
    import string
     
    def char_generator():
        for c in string.ascii_lowercase:
            yield (c,)
     
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur.execute("create table characters(c)")
     
    cur.executemany("insert into characters(c) values (?)", char_generator())
     
    cur.execute("select c from characters")
    print(cur.fetchall())
    cela suppose d'avoir non pas un enregistrement + un commit mais il faut charger donnée en mémoire dans une table en enfin écrire en base en un one shot

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par dedalios Voir le message
    cela suppose d'avoir non pas un enregistrement + un commit mais il faut charger donnée en mémoire dans une table en enfin écrire en base en un one shot
    Voilà: vous pouvez écrire par paquets de 10, 100, 1000,....
    A priori au plus il y a de lignes à écrire au mieux c'est (mais il faut quand même tester)... après il faut arbitrer avec les autres contraintes de l'application.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  20. #20
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut voici la resultat
    Voici un exemple d'utilisation de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     curseur.executemany(rq,donnee)
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
     
    # coding: utf-8  
    from Tables import *
    from Explorateur import *
    import sqlite3
    import csv
    from random import uniform
    '''
    Created on 11 déc. 2017
     
    @author: eric
    '''
    from builtins import str
     
    class exercice(object):
        '''
        classdocs
        '''
     
        def __init__(self):
            self.numero= None
            self.libelle =None
            self.montant = None
     
        def __str__(self):
            resultat = 'numero :' + str(self.numero) +'\n'
            resultat += 'libelle : ' + self.libelle +'\n'
            resultat += 'montant : '+str(self.montant)
            return resultat
     
        def __csv_donnee__(self):
            resulta =[self.numero,self.libelle ,self.montant]
            return resulta
     
        def __csv_entete__(self):
            resulta =["numero","libelle" ,"montant"]
            return resulta 
     
        def db_insertion(self,nombase):
     
            rq = """INSERT INTO exercice 
                    (numero, libelle, montant) 
                     VALUES(?, ?, ?) """
     
            nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
            curseur = nombase.cursor() # appel au curseur
            curseur.execute(rq,self.__csv_donnee__())
            nombase.commit()
            nombase.close()    
     
        def csv_donnee(self, nomfichier):
            """  Ecriture du fichier format csv -donnee"""
            ecrire_csv = csv.writer(nomfichier, delimiter = ';') # Codage du fichier csv délimiter de champ
            ecrire_csv.writerow(self.__csv_donnee__())  # donnée  
     
        def csv_entete(self,nomfichier):
            """  Ecriture du fichier format csv -entete"""
            ecrire_csv = csv.writer(nomfichier, delimiter = ';') # Codage du fichier csv délimiter de champ
            ecrire_csv.writerow(self.__csv_entete__())  # donnée 
     
     
     
     
        def db_insertion_v2(self,nombase,donnee):
            print("test")
            rq = """INSERT INTO exercice 
                    (numero, libelle, montant) 
                     VALUES(?, ?, ?) """
     
            nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
            curseur = nombase.cursor() # appel au curseur
            curseur.executemany(rq,donnee)
            nombase.commit()
            nombase.close()    
            print("testfin")
     
     
    # Base Application
    if __name__ == '__main__':
     
        open_ok =False    
        nom_fichier_path_in = explorateur_window (".//") # Recherche via explorateur
        if os.path.isfile(nom_fichier_path_in):
              # Ouverture du fichier destination
            nom_fichier_in = os.path.basename(nom_fichier_path_in) # Retourne le nom du fichier
            nom_fichier_path = os.path.dirname(nom_fichier_path_in) # Retourne le répertoire complet
            list_nf = os.path.split(nom_fichier_path_in) # Fractionne le chemin d'acc�s. Retourne un tuple
     
     
             # creation de la Base de données
            projet = Creation_table()  # creation de la Base de données
            projet.nomrepertoire= nom_fichier_path
            projet.creer_table()
            print(projet.dbNAME)   
             # creation de la Base de données
     
            # creation ddu fichier scv
            nom_fichier_out = nom_fichier_path +'//'+"resulta.csv" 
            fichier_out = open(nom_fichier_out, 'w', newline='')    
            nom_fichier_produit_entete = False 
     
            # conception  de l'objet conetnant les données
            cas =exercice()
     
            # génération de l'entête ( dans cette version cela n'a pas grand interret )
            # Mais si cette opération est réalise dans une boucle 
            indx =1
            bloc=[]
            for i in range(0,10000):
                if (nom_fichier_produit_entete == False ):
                    cas.csv_entete(fichier_out) 
                    nom_fichier_produit_entete = True  
     
                cas.numero = i
                cas.libelle= "Element N° : " +str(i)
                cas.montant = uniform(2,i *1000) 
     
                cas.csv_donnee(fichier_out)
                bloc.append(cas.__csv_donnee__())
                indx +=1
                if(indx == 250):
                    cas.db_insertion_v2(projet,bloc)
                    indx =1
                    bloc=[]
     
                #cas.db_insertion(projet) #base
     
            cas.db_insertion_v2(projet,bloc) # fin de boucle
    jai bien 10000 donnée dans la table

    Je me suis demande s'il ne serait pas plus pertinent de créer une class spécifique pour traiter le processus de chargement la base.


    pour cette partie du code car avec un projet de 10 bases il me faudrait 20 identifiants spécifiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     bloc.append(cas.__csv_donnee__())
                indx +=1
                if(indx == 250):
                    cas.db_insertion_v2(projet,bloc)
                    indx =1
                    bloc=[]
     
                #cas.db_insertion(projet) #base
     
            cas.db_insertion_v2(projet,bloc) # fin de boucle

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/03/2015, 16h30
  2. Réponses: 11
    Dernier message: 21/05/2012, 12h42
  3. [MySQL] problème d'insertion de données à une base avec le php
    Par bibaa dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 19/08/2010, 01h11
  4. Accès à la base avec le N° personnel
    Par maxeur dans le forum Sécurité
    Réponses: 8
    Dernier message: 17/02/2007, 00h37

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