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 :

[Sqlite]Un simple SELECT


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 29
    Points
    29
    Par défaut [Sqlite]Un simple SELECT
    Salut à tous !

    J'essaie de faire un simple SELECT ensuite tester le retour pour savoir si il a trouvé si oui je fais quelque chose sinon je fais autre chose, mais je n'y arrive pas. Si quelqu'un aurait une idée, merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Connexion database
    db = new SDManagerDataBase("E:/FSX/Modules/SDManagerDatabase.sqlite");
    vector<vector<string> > result = db->query("SELECT * FROM SDMDB_presets WHERE title_appareil = @ppayload->TITLE");
    Ensuite avec mon result j'ai essayé de faire :

    ou encore

    Sans succès.

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Sans succès.
    Que veux-tu dire par là ?
    result.data() va te renvoyer un pointeur sur les données de ton result, soit un vector<string> *.
    result.empty() va te dire si oui ou non le result est vide, ce qui est un premier pas et je pense devrait faire ton affaire.
    Que se passe-t-il qui ne te convient pas ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Ok, j'ai situé le problème il vient de ma ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<vector<string> > result = db->query("SELECT * FROM SDMDB_presets WHERE title_appareil = '@ppayload->TITLE'");
    Et plus précisément de mon objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '@ppayload->TITLE'
    C'est surement un problème de syntaxe, mais je ne sais pas du tout comment passer une variable directement dans la syntaxe du SELECT.

    Et de plus sqlite me génère aucune erreur.

    J'en ai conclu que ça vient bien du '@ppayload->TITLE' car j'ai testé en tapant directement dans le code WHERE title_appareil = 'toto' et mis en base toto et là ça fonctionne.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    quel est le problème ?
    L'utilisation de SQLite ?
    La concaténation de chaînes ?
    SQLite ne propose pas de syntaxe pour passer des paramètres à des requêtes ?

    As-tu lu la documentation de SQLite ?
    As-tu vu cette page (1° lien Google pour la recherche C++ SQLite) ? http://www.sqlite.org/cintro.html
    In SQLite, wherever it is valid to include a string literal, one can use a parameter in one of the following forms:

    ?
    ?NNN
    :AAA
    $AAA
    @AAA
    In the examples above, NNN is an integer value and AAA is an identifier. A parameter initially has a value of NULL. Prior to calling sqlite3_step() for the first time or immediately after sqlite3_reset(), the application can invoke one of the sqlite3_bind() interfaces to attach values to the parameters. Each call to sqlite3_bind() overrides prior bindings on the same parameter.
    Donc oui SQLite propose une interface pour binder des paramètres à ses requêtes. Et c'est sans doute le moyen le plus simple de créer la-dite requête correctement.
    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.

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Adraesh Voir le message
    Ok, j'ai situé le problème il vient de ma ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<vector<string> > result = db->query("SELECT * FROM SDMDB_presets WHERE title_appareil = '@ppayload->TITLE'");
    Et plus précisément de mon objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '@ppayload->TITLE'
    C'est surement un problème de syntaxe, mais je ne sais pas du tout comment passer une variable directement dans la syntaxe du SELECT.

    Et de plus sqlite me génère aucune erreur.

    J'en ai conclu que ça vient bien du '@ppayload->TITLE' car j'ai testé en tapant directement dans le code WHERE title_appareil = 'toto' et mis en base toto et là ça fonctionne.
    Il faut utiliser un autre mécanisme pour créer la requête - notamment en utilisant les "statement SQLite" (http://www.sqlite.org/c3ref/stmt.html).

    Je suppose que tu utilises un wrapper C++ à sqlite. Savoir lequel aiderait certainement à te donner plus de précisions
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Oui j'ai bien lu cette page, seulement je n'arrive pas à saisir comment passer mon paramètre.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Pour le moment j'avais simplement crée une classe :

    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
     
    #pragma once
    #include <string>
    #include <vector>
    #include "sqlite3.h"
     
    using namespace std;
     
    class SDManagerDataBase
    {
    public:
    	SDManagerDataBase(char* filename);
    	~SDManagerDataBase(void);
     
    	bool open(char* filename);
    	vector<vector<string> > query(char* query);
    	void close();
     
    private:
    	sqlite3 *database;
    };
    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
     
    #include "SDManagerDataBase.h"
    #include <iostream>
    #include <string>
    #include <fstream>
     
     
    SDManagerDataBase::SDManagerDataBase(char* filename)
    {
    	database = NULL;
    	open(filename);
    }
     
    SDManagerDataBase::~SDManagerDataBase()
    {
    }
     
    bool SDManagerDataBase::open(char* filename)
    {
    	if(sqlite3_open(filename, &database) == SQLITE_OK)
    		return true;
     
    	return false;   
    }
     
    vector<vector<string> > SDManagerDataBase::query(char* query)
    {
    	sqlite3_stmt *statement;
    	vector<vector<string> > results;
     
    	if(sqlite3_prepare_v2(database, query, -1, &statement, 0) == SQLITE_OK)
    	{
    		int cols = sqlite3_column_count(statement);
    		int result = 0;
    		while(true)
    		{
    			result = sqlite3_step(statement);
     
    			if(result == SQLITE_ROW)
    			{
    				vector<string> values;
    				for(int col = 0; col < cols; col++)
    				{
    					values.push_back((char*)sqlite3_column_text(statement, col));
    				}
    				results.push_back(values);
    			}
    			else
    			{
    				break;   
    			}
    		}
     
    		sqlite3_finalize(statement);
    	}
     
    	string error = sqlite3_errmsg(database);
    	if(error != "not an error")
    	{
    		ofstream fichier("E:/FSX/Modules/SDManager/SDManager_log.txt", ios::out | ios::trunc);  // ouverture en écriture avec effacement du fichier ouvert
     
            if(fichier)
            {
                    fichier << query << " " << error << endl;
     
                    fichier.close();
            }
    	}
     
    	return results;  
    }
     
    void SDManagerDataBase::close()
    {
    	sqlite3_close(database);   
    }
    Dois-je rajouter dans ma classe les méthodes pour utiliser les statements ?

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    L'idée, une fois que tu as préparé ton statement, c'est quand même de lui préciser la valeur de la variable que tu lui passe - sinon, il a peu de chances de faire ce que tu veux

    Pour cela, il faut qu'à un moment ou à un autre (avant le _step() ; en fait, avant le _column_count() même) tu utilises l'une des fonctions de bind (cf. http://www.sqlite.org/c3ref/bind_blob.html).

    D'ailleurs, je ne suis pas sûr que tu puisses avoir la valeur correcte de _column_count() avant le premier appel à _step(). Logiquement, il faut que le statement ait été appliqué au moins une fois avant d'obtenir le nombre de colonnes.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Ok je te remercie, je vais revoir tout ça.

Discussions similaires

  1. [C#] Comment faire un simple SELECT à SQL Server ?
    Par Rodie dans le forum Accès aux données
    Réponses: 15
    Dernier message: 30/10/2006, 18h04
  2. [C#] Comment réussir un simple select ?
    Par berceker united dans le forum Accès aux données
    Réponses: 11
    Dernier message: 24/07/2006, 17h57
  3. simple select avec date, mais ne fonctionne pas
    Par ralcoc dans le forum Oracle
    Réponses: 5
    Dernier message: 03/07/2006, 22h59
  4. Optimisation d'un simple select
    Par outlawz dans le forum Requêtes
    Réponses: 6
    Dernier message: 08/04/2006, 21h50
  5. Réponses: 7
    Dernier message: 04/11/2004, 12h20

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