Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité régulier
    Homme Profil pro Thomas
    Développeur Web
    Inscrit en
    février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas
    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 : 6
    Points
    6

    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 :
    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
    Membre Expert
    Avatar de dragonjoker59
    Homme Profil pro Sylvain DOREMUS
    Développeur informatique
    Inscrit en
    juin 2005
    Messages
    785
    Détails du profil
    Informations personnelles :
    Nom : Homme Sylvain DOREMUS
    Âge : 32
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2005
    Messages : 785
    Points : 1 965
    Points
    1 965

    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...

    Chef de projet (et unique exécutant pour l'instant) pour Castor 3D

  3. #3
    Invité régulier
    Homme Profil pro Thomas
    Développeur Web
    Inscrit en
    février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas
    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 : 6
    Points
    6

    Par défaut

    Ok, j'ai situé le problème il vient de ma ligne :

    Code :
    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 :
    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
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    1 907
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 1 907
    Points : 4 535
    Points
    4 535

    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.

  5. #5
    Expert Confirmé Sénior

    Homme Profil pro Emmanuel Deloget
    Développeur informatique
    Inscrit en
    septembre 2007
    Messages
    1 891
    Détails du profil
    Informations personnelles :
    Nom : Homme Emmanuel Deloget
    Âge : 37
    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 891
    Points : 4 124
    Points
    4 124

    Par défaut

    Citation Envoyé par Adraesh Voir le message
    Ok, j'ai situé le problème il vient de ma ligne :

    Code :
    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 :
    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
    Invité régulier
    Homme Profil pro Thomas
    Développeur Web
    Inscrit en
    février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas
    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 : 6
    Points
    6

    Par défaut

    Oui j'ai bien lu cette page, seulement je n'arrive pas à saisir comment passer mon paramètre.

  7. #7
    Invité régulier
    Homme Profil pro Thomas
    Développeur Web
    Inscrit en
    février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas
    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 : 6
    Points
    6

    Par défaut

    Pour le moment j'avais simplement crée une classe :

    Code :
    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 :
    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é Sénior

    Homme Profil pro Emmanuel Deloget
    Développeur informatique
    Inscrit en
    septembre 2007
    Messages
    1 891
    Détails du profil
    Informations personnelles :
    Nom : Homme Emmanuel Deloget
    Âge : 37
    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 891
    Points : 4 124
    Points
    4 124

    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
    Invité régulier
    Homme Profil pro Thomas
    Développeur Web
    Inscrit en
    février 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas
    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 : 6
    Points
    6

    Par défaut

    Ok je te remercie, je vais revoir tout ça.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •