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

C++ Discussion :

Insertion de donn�es avec SQLITE3


Sujet :

C++

  1. #1
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2019
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guin�e

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 9
    Par d�faut Insertion de donn�es avec SQLITE3
    Bonjour,

    Est-ce que c'est possible d'ins�rer des donn�es avec sqlite3 en utilisant des variables plut�t que de passer directement le texte dans la requ�te.
    Si oui, comment ?
    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
    #include <iostream>
    #include <string>
    #include <cstdio>
    #include "../../../../Sqlite/sqlite3.h"
     
    using namespace std;
     
    static int callback(void* data, int argc, char** argv, char** azColName)
    {
        fprintf(stderr, "%s: ", (const char*)data);
     
        for (int i = 0; i < argc; i++) {
            printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
        }
     
        printf("\n");
        return 0;
    }
     
    int main(int argc, char** argv)
    {
        sqlite3* DB;
        char* messaggeError;
        int exit = sqlite3_open("C:/Users/Dell/Desktop/sqlite_project/mabase.db", &DB);
        string query = "SELECT * FROM PERSON;";
     
        cout << "STATE OF TABLE BEFORE INSERT" << endl;
     
        sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
     
        string sql("INSERT INTO PERSON VALUES(1, 'jul', 'GATES', 30, 'PALO ALTO', 1000.0);"
                "INSERT INTO PERSON VALUES(2, 'BILL', 'ALLEN', 20, 'SEATTLE', 300.22);"
                "INSERT INTO PERSON VALUES(3, 'PAUL', 'JOBS', 24, 'SEATTLE', 9900.0);");
     
        exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
        if (exit != SQLITE_OK) {
            cerr << "Error Insert" << endl;
            sqlite3_free(messaggeError);
        }
        else
            cout << "Records created Successfully!" << endl;
     
        cout << "STATE OF TABLE AFTER INSERT" << endl;
     
        sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
     
        sql = "DELETE FROM PERSON WHERE ID = 2;";
        exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messaggeError);
        if (exit != SQLITE_OK) {
            cerr << "Error DELETE" << endl;
            sqlite3_free(messaggeError);
        }
        else
            cout << "Record deleted Successfully!" << endl;
     
        cout << "STATE OF TABLE AFTER DELETE OF ELEMENT" << endl;
        sqlite3_exec(DB, query.c_str(), callback, NULL, NULL);
     
        sqlite3_close(DB);
        return (0);
    }

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Les appels prennent des string. Si tu veux int�grer des variables, �a s'appelle formater sa cha�ne de caract�res au pr�alable.
    Les lib sql proposent g�n�ralement un syst�me de prepared statement qui permet de faire �a de fa�on s�curis�e.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Bien sur que c'est possible. Autrement, ce ne serait vraiment pas pratique

    Mais, pour cela, il va sans doute falloir ruser un peu

    La premi�re chose, ce sera sans doute de cr�er une structure repr�sentant un enregistrement dans la base de donn�e, car ce sera plus facile. De toutes mani�res, il y a fort � parier qu'une telle structure te sera particuli�rement utile pour le reste de ton programme.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    struct Person{
        int id;
        std::string firstname;
        std::string lastname;
        int age;
        std::string town;
        double amount;
    }
    la deuxi�me chose de se connectrer � une base de donn�e, car tout d�pendra de cette connection
    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
    /* Il nous faut le nom de la base de données */
    std::string dbname{"MyDb"};
    /* Il faut un "handler" sur la base de donnée */
    sqlite3 * db= nullptr;
    /* On peut maintenant créer le handler */
    {
        auto result = sqlite3_open(dbname.data(), &db);
        /* et comme on a un code de vérification, autant l'utiliser */
        if(result != SQLITE_OK){
            /* créons un message d'erreur explicite */
            std::string error{"unable to connect to database "};
            error.append(dbName)
                 .append(sqlite3_errmsg(db));
            /* il faut fermer la base de donnée malgré tout */
            sqlite3_close(db);
            /* on peut lancer une exception maintenant */
            throw std::runtime_error(error);
        }
    }
    Tu remarquera que j'ai plac� tout le code entre une paire d'accolades. C'est fait expres de mani�re � ce que la variable result n'existe r�ellement qu'entre ces deux accolades, afin de pouvoir la r�utiliser par la suite (en la d�clarant � chaque fois que n�cessaire)

    La troisi�me chose sera de pr�parer l'instruction. Nous allons avoir besoin de deux �l�ments:
    • Une chaine de caract�res qui repr�sente l'instruction (sans les valeurs) et
    • un (pointeur sur une donn�e de type) sqlite3_stmt repr�sentant l'instruction qui sera effectivement effectu�e

    Cela devrait prendre une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    /* Il faudra adapter les noms des champs dans dans les première parenthèses, 
     * je me suis basé sur les noms des champs de la structure
     */
    std::string insert{"INSERT INTO Person (id, firstname, lastname, age, touwn, amount) VALUES(?,?,?,?,?,?)"};
    sqlite3_stmt * indsertStmt = nullptr;
    Ensuite, il faudra demander � sqlite d'utiliser notre chaine de carat�res insert pour cr�er l'instruction en attente de binding, sous une forme qui sera proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
        auto result = sqlite3_prepare_v2(db, insert.data(), insert.size(), &insertStmt, nullptr);
        /* Et, comme on a un code de vérification, autant l'utiliser */
        if(result!= SQLITE_OK){
             /* n'oublions pas de fermer la base de données */
            sqlite3_close(db);
            throw std::runtime_error("unable to prepare sqlite INSERT statement");
        }
    }
    Arriv� � ce point, il "n'y a plus" qu'� effectuer le binding des informations de notre structure et � ex�cuter la requ�te:
    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
    /* Considérons que nous avons placé toutes les personnes dans
    un tableau proche de */
    std::vector<Person> tabPersons;
    /* Nous pouvons les parcourir l'une après l'autre sous la forme de
    for(auto const & it : tabPersons){ 
        int result; // il va falloir s'assurere que toutes les données sont bindées */
        result = sqlite3_bind_int(indsertStmt,1, it.id);
        if(result != SQLITE_OK){
           /* il faut libérer la mémoire de insertStmt */
          sqlite3_finalize(insertStmt);
           /* on ferme la db */
            sqlite3_close(db);
           throw std::runtime_error("unable to bind person's id for insertion");
        }
        result = sqlite3_bind_text(indsertStmt,2, it.firstname.data(), it.firstname.size()); 
        if(result != SQLITE_OK){
           /* il faut libérer la mémoire de insertStmt */
          sqlite3_finalize(insertStmt);
           /* on ferme la db */
            sqlite3_close(db);
           throw std::runtime_error("unable to bind person's first name for insertion");
        }
        result = sqlite3_bind_text(indsertStmt,3, it.lastname.data(), it.lastname.size()); 
        if(result != SQLITE_OK){
           /* il faut libérer la mémoire de insertStmt */
          sqlite3_finalize(insertStmt);
           /* on ferme la db */
            sqlite3_close(db);
           throw std::runtime_error("unable to bind person's last name for insertion");
        }
        result = sqlite3_bind_int(indsertStmt,4, it.age);
        if(result != SQLITE_OK){
           /* il faut libérer la mémoire de insertStmt */
          sqlite3_finalize(insertStmt);
           /* on ferme la db */
            sqlite3_close(db);
           throw std::runtime_error("unable to bind person's age for insertion");
        }
        result = sqlite3_bind_text(indsertStmt,5, it.town.data(), it.lastname.size()); 
        if(result != SQLITE_OK){
           /* on ferme la db */
            sqlite3_close(db);
           throw std::runtime_error("unable to bind person's town for insertion");
        }
        result = sqlite3_bind_double(indsertStmt,6, it.amount);
        if(result != SQLITE_OK){
           /* il faut libérer la mémoire de insertStmt */
          sqlite3_finalize(insertStmt);
           /* on ferme la db */
            sqlite3_close(db);
           throw std::runtime_error("unable to bind person's amount for insertion");
        }
        /* Si on arrive jusqu'ici, insertStmt est maintenant près à insérer un nouvel
         * enregistrement
         */
        result = sqlite3_step(insert_stmt);
        if(result != SQLITE_DONE){ // si la requete ne renvoie pas DONE, y a eu un problème
            /* créons un message d'erreur explicite */
            std::string error{"unable to connect to database "};
            error.append(dbName)
                 .append(sqlite3_errmsg(db));
            /* il faut fermer la base de donnée malgré tout */
            sqlite3_close(db);
            /* on peut lancer une exception maintenant */
            throw std::runtime_error(error);
       }
    }
    Bien sur, tout cela repr�sente une approche purement proc�durale.

    Il serait sans doute (surement, m�me) d'utiliser une approche plus "orient�e objet" pour obtenir ce r�sultat.

    Le framework Qt, propose d�j� une telle approche, qui pourrait se limiter (pour reprendre la m�me structure) sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      QSqlQuery query;
        query.prepare("INSERT INTO person (id, firstname, lastname, age, touwn, amount) VALUES(?,?,?,?,?,?)");
        query.bindValue(0, it.id);
        query.bindValue(1, it.firstname);
        query.bindValue(2, it.lastname);
        query.bindValue(3, it.age);
        query.bindValue(4, it.town);
        query.bindValue(5, it.amount);
        query.exec();
    Et nous pourrions tout � fait nous amuser � faire notre propre binding, mais ca, ce sera pour "plus tard" (si il t'int�resse)
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  4. #4
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2019
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guin�e

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 9
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Les appels prennent des string. Si tu veux int�grer des variables, �a s'appelle formater sa cha�ne de caract�res au pr�alable.
    Les lib sql proposent g�n�ralement un syst�me de prepared statement qui permet de faire �a de fa�on s�curis�e.
    Comment pourrais-je le faire ? Je ne trouve pas assez d'informations sur le net.
    Tu peux me guider un peu plus ?

  5. #5
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par Dia390 Voir le message
    Comment pourrais-je le faire ? Je ne trouve pas assez d'informations sur le net.
    Tu peux me guider un peu plus ?
    C'est � se demander pourquoi il se d�carcasse � te faire un long message qui reprend l'ensemble des informations dont tu as besoin, le koala...
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  6. #6
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2019
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guin�e

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 9
    Par d�faut
    J'ai impl�ment� ton algorithme mais �a marche pas. Le probl�me est que je ne suis qu'un d�butant donc essaye de rendre les choses beaucoup plus clairs et limpides.

  7. #7
    Membre Expert Avatar de gabriel21
    Homme Profil pro
    Administrateur syst�mes et r�seaux
    Inscrit en
    F�vrier 2007
    Messages
    548
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activit� : Administrateur syst�mes et r�seaux
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 548
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    C'est � se demander pourquoi il se d�carcasse � te faire un long message qui reprend l'ensemble des informations dont tu as besoin, le koala...
    J'ai appris plusieurs choses. Surtout que c'est une question que je comptais poser d'ici quelques semaines dans le cadre d'un logiciel que je souhaite d�velopper.

  8. #8
    Invit�
    Invit�(e)
    Par d�faut
    Pourquoi ne pas utiliser une lib C++, vu que c'est le forum C++... ?
    Perso, j'ai utilis� sqlpp11 et sqlite_modern_cpp sur diff�rents projets et j'en ai �t� plut�t content mais il en existe plein d'autres : https://github.com/SRombauts/SQLiteC...qlite-wrappers

  9. #9
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2019
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guin�e

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 9
    Par d�faut
    Bonsoir, j'ai pu r�soudre le probl�me. Je met le code en bas au cas ou �a pourrais aider quelqu'un.
    Merci � tous pour votre aide.

    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    #include <iostream>
    #include <string>
    #include "../../../../Sqlite/sqlite3.h"
     
    using namespace std;
     
    sqlite3* db;
     
    int first_row;
     
    typedef struct
    {
    	string nom;
    	string prenom;
    	int numeroTelephone;
    }Repertoire;
     
    static int select_callback(void* data, int argc, char** argv, char** azColName)
    {
    	fprintf(stderr, "%s: ", (const char*)data);
     
    	for (int i = 0; i < argc; i++) {
    		printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    	}
     
    	printf("\n");
    	return 0;
    }
     
    void select_stmt(const char* stmt)
    {
      char *errmsg;
      int   ret;
      int   nrecs = 0;
     
      first_row = 1;
     
      ret = sqlite3_exec(db, stmt, select_callback, &nrecs, &errmsg);
     
      if(ret!=SQLITE_OK) {
        cout << "Error in select statement " << stmt << " .\n" << errmsg;
      } else {
        cout << "\n " << nrecs << " records returned.\n";
      }
    }
     
    void sql_stmt(const char* stmt)
    {
      char *errmsg;
      int ret;
     
      ret = sqlite3_exec(db, stmt, 0, 0, &errmsg);
     
      if(ret != SQLITE_OK) {
        cout << "Error in statement: " << stmt << " .\n" << errmsg;
      }
    }
     
    int main()
    {
    	// Ouverture de la base de données
     
        sqlite3_open("C:/Users/Dell/Desktop/projet/repertoire.db", &db);
     
        // Déclaration des variables
        Repertoire t;
     
        cout << "\nPrenom : ";
        cin >> t.prenom;
        cout << "Nom : ";
        cin >> t.nom;
        cout << "Numero de telephone : ";
        cin >> t.numeroTelephone;
     
        // Tentatvie d'ouverture de la base de données
        if(db == 0) {
            cout << "\nImpossible d'ouvrir la base de donnees." << endl;
            return 1;
        }
     
        sqlite3_stmt *stmt;
     
        // Préparation de la requête
    	if (sqlite3_prepare(
    	    db,
    	    "insert into users values (?,?,?,?)",  // stmt
    	    -1, // 
    	    &stmt,
    	    0  // 
    	   )
    	   != SQLITE_OK) {
    	    printf("\nImpossible de preparer cette requête.");
    	    return 1;
    	}
     
    	cout << "\n" << sqlite3_bind_parameter_count(stmt) << " elements ont ete ajoutes avec succes\n";
     
    	if (sqlite3_bind_text (
    		stmt,
    	    2,  // Index dans la base
    	   	t.prenom.c_str(),
            t.prenom.size(),
            NULL
    	    )
    	    != SQLITE_OK) {
    	    cout << "\nImpossible d'inserer cette partie.\n";
    	}
     
    	if (sqlite3_bind_text (
    	    stmt,
    	    3,  // Index dans la base
    	    t.nom.c_str(),
            t.nom.size(),
            NULL
    	    )
    	    != SQLITE_OK) {
    	    cout << "\nImpossible d'inserer cette partie.\n";
    	}
     
    	if (sqlite3_bind_int(
    	    stmt,
    	    4,  // Index dans la base
                t.numeroTelephone
    	    )
    	  != SQLITE_OK) {
    	cout << "\nImpossible d'inserer cette partie.\n";
    	return 1;
    	}
     
     
    	if (sqlite3_step(stmt) != SQLITE_DONE) {
    		cout << "\nImpossible d'executer cette requete.\n";
    	    return 1;
    	}
     
    	sqlite3_reset(stmt);
     
    	sqlite3_close(db);
    	return 0;
    }

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Insertion de donn�es avec php5
    Par Ludo75 dans le forum Langage
    R�ponses: 3
    Dernier message: 24/08/2010, 15h18
  2. Insertion de donn�e avec apostrophe
    Par jiojioforever dans le forum Langage SQL
    R�ponses: 7
    Dernier message: 03/05/2007, 10h47
  3. [MySQL] Insertion de donn�es avec apostrophes dans ma base
    Par kawther dans le forum PHP & Base de donn�es
    R�ponses: 2
    Dernier message: 01/04/2007, 09h06
  4. Insertion de donn�es avec Posgretsql
    Par djibril dans le forum PostgreSQL
    R�ponses: 3
    Dernier message: 18/05/2004, 11h23
  5. R�ponses: 2
    Dernier message: 14/05/2004, 14h32

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