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

Accès aux données Discussion :

SQLITE - Problème de donnée


Sujet :

Accès aux données

  1. #1
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut SQLITE - Problème de donnée
    Bonjour tous le monde,

    JE viens vers vous car j'ai un problème à m'arracher les cheveux de la tete :p

    Voici mon code:
    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
    SQLiteConnection.CreateFile("BDD.sqlite");
     
                    SQLiteConnection m_dbConnection = new SQLiteConnection("Data Source=BDD.sqlite;Version=3;");
                    m_dbConnection.Open();
     
                    String SQL = "CREATE TABLE Levels (Level_Number INTEGER PRIMARY KEY AUTOINCREMENT, Level_HP INTEGER, Level_MP INTEGER, Level_Strength INTEGER, Level_Magic INTEGER, Level_Agility INTEGER, Level_Defense INTEGER, Level_Experience BIGINT)";
                    SQLiteCommand command = new SQLiteCommand(SQL, m_dbConnection);
                    command.ExecuteNonQuery();
     
                    int Level = 1;
                    int HP = 100;
                    int MP = 10;
                    int Strength = 10;
                    int Magic = 10;
                    int Agility = 10;
                    int Defense = 10;
     
                    SQL = "INSERT INTO Levels (Level_HP, Level_MP, Level_Strength, Level_Magic, Level_Agility, Level_Defense) VALUES (" + HP + ", " + MP + ", " + Strength + ", " + Magic + ", " + Agility + ", " + Defense + ")";
                    command = new SQLiteCommand(SQL, m_dbConnection);
                    command.ExecuteNonQuery();
     
                    while (Level < 1000)
                    {
                        HP = HP + 20;
                        MP = MP + 2;
                        Strength = Strength + 2;
                        Magic = Magic + 2;
                        Agility = Agility + 2;
                        Defense = Defense + 2;
                        SQL = "INSERT INTO Levels (Level_HP, Level_MP, Level_Strength, Level_Magic, Level_Agility, Level_Defense) VALUES (" + HP + ", " + MP + ", " + Strength + ", " + Magic + ", " + Agility + ", " + Defense + ")";
                        command = new SQLiteCommand(SQL, m_dbConnection);
                        command.ExecuteNonQuery();
                        Level++;
                    }
    Le problème est que quand je fais un SELECT * From Level mon programme m'indique que aucune donnée n'est retournée...

    Je suis perdu je ne comprends vraiment pas. Merci de votre aide

    Cordialement,

  2. #2
    Expert confirmé Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Points : 5 522
    Points
    5 522
    Par défaut
    Bonjour,

    A priori ton code m'a l'air correct bien qu'il existe des points d'amélioration.

    La première chose à faire est de vérifier que ta table est bien remplie car si les INSERT ne se font pas alors les SELECT ne renverront rien.

    Ensuite, montre-nous le code qui fait le SELECT pour voir s'il n'y a pas un bug quelque part...

  3. #3
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Voici le code du SELECT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQLiteConnection m_dbConnection = new SQLiteConnection("Data Source=BDD.sqlite;Version=3;");
                m_dbConnection.Open();
     
                String SQL = "SELECT * FROM Levels";
                SQLiteCommand command = new SQLiteCommand(SQL, m_dbConnection);
     
                SQLiteDataReader reader = command.ExecuteReader();
     
                while (reader.HasRows)
                {
                    DGV_Levels.Rows.Add(reader.GetInt32(0), reader.GetInt32(1), reader.GetInt32(2), reader.GetInt32(3), reader.GetInt32(4), reader.GetInt32(5), reader.GetInt32(6));
                }
                m_dbConnection.Close();
    Voici le message d'erreur:
    Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans System.Data.SQLite.dll

    Informations supplémentaires : No current row

    P.S: Lors du remplissage de la base de donnée avec WHILE (Opéréation qui dure 25 seconde) je vois que le fichier BDD.sqlite augmente de ko en ko jusqu'à atteindre 30ko pour une seule table et ses données, donc à moins que cela le remplisse de vide...

    le DGV_Levels est le nom de mon DataGridView

    Edit: Je viens de me rendre compte que j'a'avais oublié un champ dans le INSERT à savoir Level_Experience... La honte

  4. #4
    Expert confirmé Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Points : 5 522
    Points
    5 522
    Par défaut
    Bon, tu insères 6 champs plus la clé primaire dans ta table, et tu en récupères 7 dans le SELECT ce qui semble normal même si tu en as oublié un. Et le message d'erreur indique un problème au niveau du nombre de lignes et pas du nombre de colonnes.

    Ceci dit, il faut dans tous les cas éviter les SELECT *, que ce soit avec SQLite ou n'importe quelle autre base car les performances s'en ressentent, il est bien préférable d'énumérer les champs dont tu as besoin, et en plus c'est plus facilement lisible.

    1) Regarde ce qu'il y a dans ta table, le fait que le fichier grossisse ne te dit pas ce qu'il y a dedans ! Il existe un tas d'outils gratuits pour cela, moi je prends Spatialite_gui car j'utilise SQLite avec l'extension spatiale, mais il y en a d'autres ici : http://www.sqlite.org/cvstrac/wiki?p=ManagementTools

    2) Essaye de faire des SELECT avec 1 champ, puis 2, etc. jusqu'au moment où ça ne marchera plus.

  5. #5
    Membre régulier Avatar de Caranille
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2013
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Merci de ton aide. Si j'utilise SELECT * c'est que je récupère vraiment tous les champs de cette table, sinon bien entendu que j'utiliserai le nom des champs.

    Sinon tu parlais d’optimisation dans ton premier message, peut tu aller au bout de ta pensée car je suis ouvert à toute critique, mon but est de progresser

    Cordialement,

    P.S: moi j'utilise SQLITEBrowser
    http://sqlitebrowser.org/

  6. #6
    Expert confirmé Avatar de ed73170
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2009
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2009
    Messages : 765
    Points : 5 522
    Points
    5 522
    Par défaut
    Ce que je voyais comme amélioration dans ton premier code c'est au niveau de l'allocation de SQLiteCommand que tu fais 1000 fois. Moi j'aurais tendance à utiliser le même objet et à affecter SQLiteCommand.commandText avant chaque requête. Ça permet d'éviter 1000 allocations et peut-être de gagner du temps car on ne sait pas trop ce que fait le constructeur, et aussi d'éviter de trop fragmenter la mémoire par de nombreuses allocations de petits objets, et bien sûr de simplifier le travail du Garbage Collector.

    Tu pourrais aussi utiliser les requêtes paramétrées à l'aide de SQLiteCommand.Parameters, cela sécurise les données et évite aussi la concaténation des 1000 chaînes SQL, ce qui là encore fragmente la mémoire car à chaque fois que tu concatènes 2 chaînes avec +, un nouvel objet est alloué.

    Si tu ne veux pas des requêtes paramétrées, alors tu peux construire tes chaînes SQL avec un StringBuilder.

    Mais bon, j'ai commencé le développement à une époque où on se chargeait soit-même de la libération de la mémoire allouée et où il fallait faire attention à ce genre de chose, peut-être que maintenant c'est différent

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Salut,

    Je ne suis pas expert de sqlite, mais il manque sans-doute le commit...

Discussions similaires

  1. [Tcl/Tk] Problème accès données
    Par Sébastien Hamel dans le forum Tcl/Tk
    Réponses: 1
    Dernier message: 11/07/2006, 11h39
  2. [MySQL] problème ajout donnée dans BDD via php
    Par Skeud007 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 29/05/2006, 23h41
  3. [SQL] Moteur de recherche problème affichage donnée dans select
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 07/04/2006, 20h27
  4. [débutant] problème affichage données table ds TDBGrid
    Par lidouka dans le forum Composants VCL
    Réponses: 1
    Dernier message: 16/12/2005, 13h50
  5. problème ajout données avec db.execute et access
    Par Dauphind dans le forum Access
    Réponses: 2
    Dernier message: 29/11/2005, 12h03

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