Ecrire dans une base de données - multi-tables

Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 - 5 oct. 2010 à 12:38
shyrachtz Messages postés 50 Date d'inscription mercredi 10 décembre 2008 Statut Membre Dernière intervention 1 juillet 2011 - 14 oct. 2010 à 07:41
Bonjour à tous,
je m'essaye à la gestion des bases de données avec SQLite en C# et je buggue sur un truc:

j'ai un fichier texte qui contient toutes les notes de tous les élèves formé comme ceci:
nom prénom -> matière -> note -> mention
donc j'ai plusieurs lignes pour un même élève (puisque plusieurs matières).

j'aimerai écrire ça dans une base de données. je crée donc une base de données avec 3 tables:
élèves -> id, nom, prénom
matières -> id, matière
note -> id, élève, id_matière, note, mention

la création de la base et l'écriture ne posent pas de souci, c'est plus un coup de pousse pour écrire la requête SQL à la lecture de chaque ligne que je demande.

si vous avez des exemples, je suis preneur.

merci pour votre aide

11 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 oct. 2010 à 13:16
Tu cherche quoi ? Quelque chose de ce genre ?

SELECT nom,prénom,matière,note,mention 
FROM note
INNER JOIN matières ON note.id_matière=matières.id
INNER JOIN élèves ON note.id_élève=élèves.id
ORDER BY nom,prénom,matière



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 2
5 oct. 2010 à 14:12
non, je cherche à écrire pas à lire ce qu'il y a dans la base de données.
ce que je cherche c'est en gros comment faire pour écrire dans la base en écrivnt une seule fois le nom et prénom de l'élève et en faisant des jointure entre les tables en utilisant les id...
je ne sais pas si je suis assez claire :(
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 oct. 2010 à 17:25
Ok, je peux pas tester, mais je pense qu'une requete de ce style doit marcher :

UPDATE note SET note=18.5,mention="VERY GOOD" FROM note
INNER JOIN matières ON note.id_matière=matières.id
INNER JOIN élèves ON note.id_élève=élèves.id
WHERE matière="Français" AND nom="DUPOND" AND prénom="JEAN-DANIEL"



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 2
5 oct. 2010 à 18:01
merci Casy pour tes réponses, mais ce n'est toujours pas ce que je cherche à faire :(. en fait, ton code sert à mettre à jour une base déja remplie en modifiant la note sur chaque table. ce que je veux c'est lire le fichier ligne par ligne, écrire dans la table élève le nom et prénom de l’élève, la matière, la note, la mention..., lire la deuxième ligne, prendre le nom et prénom vérifier qu'il n'existent pas dans la table élève, si c'est le cas, rajouter un enregistrement avec le même id sinon créer un nouvel enregistrement avec le nom prénom dans la table élève (nouvel id donc) et ainsi de suite.
si tu as une idée, je suis preneur :), on va y arriver ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 oct. 2010 à 18:15
En une seule requete, ce n'est pas possible. Il va te falloir faire une série de requêtes avec du code entre pour les différents tests.

Donc pour chaque ligne de ton fichier :
[list]
[*] Faire une requete SELECT (table élèves) pour rechercher l'élève à partir de son nom et prénom et en récupérer son ID
[*] Si ID retourné, on passe à la suite, sinon faire une requete INSERT pour créer l'élève en récupérant l'ID créé
[*] Faire une requete SELECT (table matières) pour rechercher la matière à partir de son nom et en récupérer son ID
[*] Si ID retourné, on passe à la suite, sinon faire une requete INSERT pour créer la matière en récupérant l'ID créé
[*] Faire une requete INSERT (table note) pour ajouter la ligne de la note avec les id élèves et matières récupérés précédemment
/list


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 2
6 oct. 2010 à 10:21
merci pour ta réponse.

je me dis que cela fonctionnera quand tu as une table avec une centaine d'enregistrement mais pas quand tu en as des milliers parce que pour chaque éléve, il est obligé de parcourir toute la base avant de savoir qu'il existe ou pas... je me demande s'il n'y a pas une solution plus rapide ?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 oct. 2010 à 11:33
Comme ça, là, je vois pas !


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 2
10 oct. 2010 à 11:11
Rebonjour,
j'essaye de faire la chose suivante:
j'ai une liste d'élèves et une table contenant id -> élèves, j'aimerai que pour chaque élève que j'ai dans ma liste, je regarde s'il est dans ma table, s'il n'y est pas je le rajoute. sauf que j'ai un peu de mal à réussir ma démarche :(
voici mon code:
public void AddStudent(string path, List<string> ListStudent)
        {
            string dir = Path.GetDirectoryName(path);
            
            SQLiteConnectionStringBuilder sqlString = new SQLiteConnectionStringBuilder();
            
            sqlString.DataSource = dir + @"\data.gkc.db";
            sqlString.FailIfMissing = false;

            string pramas = sqlString.ToString();

            SQLiteConnection myConnection = new SQLiteConnection(pramas);
            SQLiteCommand cmd = myConnection.CreateCommand();

            myConnection.Open();

            for (int i=0; i<ListStudent.Count;i++)
            {
                cmd.CommandText "SELECT id FROM Students where Student "+ListStudent[i]+";";

                if ((cmd.ExecuteNonQuery()) > 0)
                    continue;
                else
                {
                    cmd.CommandText = "INSERT INTO Students (Student) VALUES ('" + ListStudent[i] + "');";
                    cmd.ExecuteNonQuery();
                }
            }
            myConnection.Close();

            MessageBox.Show("Data Base Uploaded");
        }


j'ai une syntahx error sur mon if (cmd.ExecuteNonQuery()).

avez vous une idée?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
10 oct. 2010 à 13:40
JE pense que ExecuteNonQuery ne peut pas être utilisé avec une requete SELECT

Essaye peut-être comme ceci :
cmd.CommandText "SELECT id FROM Students where Student "+ListStudent[i]+";";

if (cmd.ExecuteScalar != DBNull.Value)
   continue;
else




[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Karibot Messages postés 89 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 21 juin 2016 2
10 oct. 2010 à 13:51
Oui c'était ça le problème. j'ai réussi à faire ce que je voulais en utilisant:
SQLiteDataReader Reader = cmd.ExecuteReader();
   if (Reader.Read())
      {.....
      }
0
shyrachtz Messages postés 50 Date d'inscription mercredi 10 décembre 2008 Statut Membre Dernière intervention 1 juillet 2011
14 oct. 2010 à 07:41
Bonjour,
Pourquoi vous n'utilise pas une List<string[]> temporaire, d'une manière:

Les informations de chaque ligne sont ajoute dans la liste, tant qu'ils sont pour le même élève.

Quand le nom, ou prenons d'élève change, donc
1- cherchez l'id d'élève.
2- si non ajouter le et prenez son id, si oui utilisez son id.
3- insérer ses informations, (vous pouvez les faire d'un seul coup).
4- vider la liste.
5- recommencement de nouveaux.

Remarque: n'oublier pas les informations pour le dernière élève.

Il est plus rapide car le nombre des requêtes sont réduits.
Amusez vous
Du courage.
0
Rejoignez-nous