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 :

Ajout / Suppression LinQ to SQL - DB temporaire?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Par défaut Ajout / Suppression LinQ to SQL - DB temporaire?
    Bonjour à tous,

    Je dois présenter un projet en C# pour ma seconde session et je me retrouve avec un petit soucis.

    Le contexte:

    Réalisation d'un jeu, ici une bataille terrestre, réalisée entre autre en C# / C++ pour l'IA. La base de données est en SQL CE et nous devons utiliser du LinQ to SQL.

    La base de données:

    3 tables: le joueur, la partie et la participation. Pour l'instant ce qui nous intéresse est la table Joueur qui est composé d'un Pseudo, d'un password, de l'argent en poche, et du nombre de canon que l'utilisateur possède.

    explication du problème:


    J'ai testé trois possibilités:
    1°) Ajout d'un nouvel utilisateur, d'aprés les différents messages la connexion est fonctionnelle, et en effet je lance l'ajout de l'utilisateur et je vais pour me connecter par la suite aucun problème il me connecte et me met pas de messages d'erreurs (alors que si l'utilisateur est inexistant il me met un message d'erreur et une fois co je peux aller dans les statistiques ou j'ai les infos corrects)

    2°) Ajouter a la main dans la base de données un utilisateur et tenter de me connecter avec. La encore la connexion ne passe sans problèmes et les infos sorties dans le profil sont les bonnes. Donc niveau lecture aucun problème.

    3°) Suppression du compte via l'interface créée, la encore il me note que le compte est supprimé et quand je veux me reco avec il fait comme s'il n'existait plus. Mais si je regarde dans la base de données après avoir fermé le projet le compte est toujours existant.

    Pour les points 1 et 3 donc si je relance le programme c'est comme si je n'avais rien fait le compte ajouté n'existe plus et le compte supprimé est toujours présent. Un peu comme s'il écrivait via une base de données temporaire qui était basée sur l'existante mais qui est supprimée à la fin de chaque test du projet.

    Niveau code:

    Inscription.cs:

    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
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Linq;
     
    namespace Prototype2Screens
    {
    	/// <summary>
    	/// Logique d'interaction pour Inscription.xaml
    	/// </summary>
    	public partial class Inscription : UserControl
    	{
            private String erreur;
     
    		public Inscription()
    		{
    			this.InitializeComponent();
    		}
     
            //Annulation de l'inscription
            private void BtnRetourPgConnexion_Click(object sender, RoutedEventArgs e)
            {
                //Test pour voir si l'on a rien entré avant
                NavigationWindow.GetWindow(this).Content = (new Connexion());
            }
     
            //Inscription d'un nouvel user
            private void btnValiderInscription_Click(object sender, RoutedEventArgs e)
            {
     
                if (this.verifChamps())
                {
     
     
                    Joueur joueur = new Joueur();
                    joueur.Pseudo = txtBoxPseudo.Text;
                    joueur.Password = pwdBoxPwd.Password.ToString();
                    joueur.NbCanon = 1;
                    joueur.ArgentEnPoche = 1000;
     
                    try
                    {
     
                        (new DataAccess()).ajouterJoueur(joueur);
                        DataManager.setJoueur(joueur);
                        NavigationWindow.GetWindow(this).Content = (new Connexion());
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Alerte");
                    }
     
                }
                else
                {
                    MessageBox.Show("Joueur déjà existant", "Erreur Inscription", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
     
            //Vérifie si les champs sont correctement complétés
            public Boolean verifChamps()
            {
                Boolean isOK = true;
                erreur = "Veuillez corriger la(les) erreur(s) suivante(s) : ";
     
                if (String.IsNullOrEmpty(this.txtBoxPseudo.Text.ToString()) == true)//Le pseudo est vide
                {
                    erreur += "\n - Le champ du pseudo ne peut être vide";
                    isOK = false;
                }
     
                if (String.IsNullOrEmpty(this.pwdBoxPwd.Password.ToString()) == true )//Mot de passe vide
                {
                    erreur += "\n - Le champ du mot de passe ne peut être vide";
                    isOK = false;
                }
     
                if (String.IsNullOrEmpty(this.pwdBoxConfirmPwd.Password.ToString()) == true)//Mot de passe de confirmation est vide
                {
                    erreur += "\n - Le champ de confirmation du mot de passe ne peut être vide";
                    isOK = false;
                }
     
                if (this.pwdBoxPwd.Password.ToString().CompareTo(this.pwdBoxConfirmPwd.Password.ToString()) != 0)//les mots de passe sont différents
                {
                    erreur += "\n - Les deux mots de passe ne peuvent être différent";
                    isOK = false;
                }
     
                if (!isOK)//On affiche une popup avec les messages d'erreurs
                {
                    MessageBox.Show(erreur, "Erreur", MessageBoxButton.OK, MessageBoxImage.Error);
                }
     
                return isOK;
            }
    	}
    }
    DataAccess.cs
    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
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
     
    namespace Prototype2Screens
    {
        class DataAccess
        {
            private DBJEUCsharpDataContext db;
            public DataAccess()
            {
                try
                {
                    //open DB connexion
                    string conString = "Data Source=|DataDirectory|\\DBJEUCsharp.sdf";
                    db = new DBJEUCsharpDataContext(conString);
                    System.Console.WriteLine("Connexion OK");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
     
            // ajoute un joueur dans la DB
            public void ajouterJoueur(Joueur joueur)
            {
                try
                {
     
                    db.Joueur.InsertOnSubmit(joueur);
                    db.SubmitChanges();
     
     
     
                }
                catch (Exception e)
                {
     
                    MessageBox.Show(e.Message, "Alerte");
                }
     
            }
     
            // récuperer le joueur dans la DB
            public Joueur getJoueur(Joueur j)
            {
                List<Joueur> joueurs = new List<Joueur>();
     
                try
                {
                    var result = from p in db.Joueur where p.Pseudo == j.Pseudo && p.Password == j.Password select p;
                    joueurs.AddRange(result);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
     
                foreach (Joueur joueur in joueurs)
                {
                    j.Pseudo = joueur.Pseudo;
                    j.Password = joueur.Password;
                    j.NbCanon = joueur.NbCanon;
                    j.ArgentEnPoche = joueur.ArgentEnPoche;
                }
     
                return j;
     
            }
     
            //Verifier l'existance du joueur
            public Boolean checkJoueur(String pseudo)
            {
                Boolean b;
                List<Joueur> joueurs = new List<Joueur>();
     
                try
                {
                    var result = from j in db.Joueur where j.Pseudo == pseudo select j;
     
                    joueurs.AddRange(result);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
     
                int i = 0;
     
                foreach (Joueur j in joueurs)
                { i++; }
     
                if (i == 0)
                    b = false;
                else
                    b = true;
     
                return b;
            }
     
     
            // modification du mot de passe du joueur
            public void modifierMDP(Joueur j, String mdp)
            {
                try
                {
     
                    Joueur joueur = (from x in db.Joueur where x.Pseudo == j.Pseudo select x).Single();
     
                    joueur.Password = mdp;
     
                    db.SubmitChanges();
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
     
     
     
     
            //suppression d'un joueur
            public void deleteJoueur(Joueur joueur)
            {
     
                try
                {
     
                    Joueur j = (from x in db.Joueur where x.Pseudo == joueur.Pseudo select x).Single();
     
                    db.Joueur.DeleteOnSubmit(j);
                    db.SubmitChanges();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
     
     
            // ajouter un canon au joueur.
            public void ajouterCanon(Joueur j)
            {
                try
                {
     
                    Joueur joueur = (from x in db.Joueur where x.Pseudo == j.Pseudo select x).Single();
                    joueur.NbCanon = (joueur.NbCanon) + 1;
                    joueur.ArgentEnPoche = (joueur.ArgentEnPoche) - 100000;
                    db.SubmitChanges();
     
                    j.ArgentEnPoche = joueur.ArgentEnPoche;
                    j.NbCanon = joueur.NbCanon;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
     
            //vérifier si assez d'argent pour acheter un canon
     
            public Boolean checkArgent(String pseudo)
            {
                Boolean b = false;
                Joueur joueur;
                try
                {
     
                    joueur = (from j in db.Joueur where j.Pseudo == pseudo select j).Single();
     
                    if (joueur.ArgentEnPoche >= 100000)
                        b = true;
                    else
                        b = false;
     
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
     
                return b;
            }
     
     
     
     
     
        }
    }

    DataManager.cs
    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace Prototype2Screens
    {
        class DataManager
        {
            private static Joueur joueur;
     
            public static void setJoueur(Joueur j)
            {
                joueur = (new DataAccess()).getJoueur(j);
            }
     
            public static Joueur getJoueur()
            {
                return joueur;
            }
     
     
     
        }
    }

    Auriez vous une idée d'où ça peut venir ? Comment je peux corriger ça?

    En vous remerciant d'avance !

    Evenae

    Edit: s'il vous manque des informations n'hésitez pas a demander.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Ou se situe ta base de données ?

    Car j'ai déjà vu des postes sur le forum où des personnes avaient un problème similaire et apparemment, une copie de leur base de données était faites à chaque compilation ou run (je ne sais plus lequel des deux).

    Essaye de mettre ta base de données en dehors de ta solution si elle en fait partie et modifie ta ConnectioString.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Par défaut
    Un immense merci ça fonctionne !

    Elle était en effet dans ma solution !

    Mais du coup j'ai une autre question ^^ J'avais fait une string de connexion générique: "Data Source=|DataDirectory|\\DBJEUCsharp.sdf" et la vu que j'ai mis la base de données en dehors de la solution comment trouver la string de connexion générique ? (vu que par la suite ca devra tourner sur d'autres pc)

    Pas l'impression d'être très clair moi...

    pour faire simple la j'ai: "Data Source=C:\Users\Evenae\Desktop\DBJEUCsharp.sdf" ou j'aimerai un truc qui permettra de fonctionner partout en fait.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Le mieux serait de passer par du paramétrage de ta ConnectionString :

    Je m'expliques, tu peux utiliser un fichier settings (Dans Visual Studio -> Répertoire Properties de ta solution -> fichier Settings.settings) qui contiendra une propriété DB par exemple dans lequel tu n'auras plus qu'à fixer le chemin vers la base de données.
    Cette propriété sera également modifiable après le déploiement soit en modifiant directement le fichier config, soit par programmation.


    Voici un exemple pour la création de ton DataContext :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LinqToCACDataContext mylinq = new LinqToCACDataContext("Data Source=" + Properties.Settings.Default.ServeurSQL + ";Initial Catalog=" + Properties.Settings.Default.DB + ";Integrated Security=True;Asynchronous Processing=True");
    Ici c'est une base de données SQL Server, mais ça reste le même principe pour SQL CE.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string conString = "Data Source="+Properties.Settings.Default.DB;
    db = new DBJEUCsharpDataContext(conString);

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 50
    Par défaut
    Donc si j'ai bien suivi, en faisant comme ça, si on utilise un setup pour l'installation ça ne fonctionnera pas juste en le déployant sur une autre machine? Il faut obligatoirement changer "à la main" avant l'utilisation ?

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Non, tu peux ajouter dans ton install une étape ou tu spécifie le chemin vers la db.
    Pour ce faire, dans la partie User Interface du Setup, il faut rajouter une boite de dialogue de textbox dans la partie Install->Start.

    Une fois cela fait, tu as accès aux propriétés :

    Edit1Label -> le texte afficher dans la boite de dialogue
    Edit1Property -> donne un nom à ta propriété, qui permettra d'en récupérer la valeur dans ton fichier InstallerConfig (Attention, c'est toujours EDIT + le nom de la propriété que tu souhaites)
    Edit1Value -> la valeur associée à ta propriété
    Edit1Visible -> Indique si tu souhaites afficher ce textbox dans la boite de dialogue

    +d'autres edit disponibles (Edit2, Edit3 ...)

    Voir pièce jointe pour exemple

    Ensuite de là, tu peux modifier ton fichier config à l'installation.

    Petit exemple dans le fichier InstallerConfig :

    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
     
     public override void Install(System.Collections.IDictionary stateSaver)
            {
                base.Install(stateSaver);
     
                try
                {
                    string serveur = Context.Parameters["Serveur"];
                    string bd = Context.Parameters["BD"];
                    string RepertoireInstallation = Context.Parameters["RepertoireInstallation"];
                    string assemblypath = Context.Parameters["assemblypath"];
                    string appConfigPath = assemblypath + ".config";
     
                    XmlDocument doc = new XmlDocument();
                    doc.Load(appConfigPath);
     
                    XmlNode configuration = null;
                    foreach (XmlNode node in doc.ChildNodes)
                        if (node.Name == "configuration")
                            configuration = node;
     
                    if (configuration != null)
                    {
                        XmlNode settingNode = null;
                        XmlNode ApplicationsettingNode = null;
                        XmlNode connectionStringsNode = null;
                        foreach (XmlNode node in configuration.ChildNodes)
                        {
                            if (node.Name == "userSettings")
                                settingNode = node;
                            else if (node.Name == "applicationSettings")
                                ApplicationsettingNode = node;
                            else if (node.Name == "connectionStrings")
                                connectionStringsNode = node;
                        }
     
                        if (settingNode != null)
                        {
                            XmlNode CACPropertiesNode = null;
                            CACPropertiesNode = settingNode.ChildNodes.Item(0);
     
                            if (CACPropertiesNode != null)
                            {
     
                                foreach (XmlNode node in CACPropertiesNode.ChildNodes)
                                {
                                    if (node.Name == "setting")
                                    {
                                        if (node.Attributes["name"].Value == "ServeurSQL")
                                        {
                                            XmlNode ServeurSQLNode = node.FirstChild;
                                            XmlNode ServeurSQLValue = ServeurSQLNode.FirstChild;
                                            ServeurSQLValue.Value = serveur;
                                        }
                                        if (node.Attributes["name"].Value == "BD")
                                        {
                                            XmlNode BDNode = node.FirstChild;
                                            XmlNode BDValue = BDNode.FirstChild;
                                            BDValue.Value = bd;
                                        }
                                    }
     
                                }
                            }
                        }
     
                        if (ApplicationsettingNode != null)
                        {
                            XmlNode CACPropertiesNode = null;
                            CACPropertiesNode = ApplicationsettingNode.ChildNodes.Item(0);
     
                            if (CACPropertiesNode != null)
                            {
                                foreach (XmlNode node in CACPropertiesNode.ChildNodes)
                                {
                                    if (node.Name == "setting")
                                    {
                                         if (node.Attributes["name"].Value == "RepertoireLicence")
                                        {
                                            XmlNode RepertoireLicenceNode = node.FirstChild;
                                            XmlNode RepertoireLicenceValue = RepertoireLicenceNode.FirstChild;
                                            if (RepertoireInstallation.StartsWith("\\"))
                                                RepertoireInstallation.Remove(0, 2);
                                            RepertoireLicenceValue.Value = RepertoireInstallation;
                                        }
                                    }
                                }
                            }
                        }
     
                        if (connectionStringsNode != null)
                        {
                            XmlNode ConnectNode = null;
                            ConnectNode = connectionStringsNode.ChildNodes.Item(0);
                            if (ConnectNode.Name == "add")
                            {
                                ConnectNode.Attributes["connectionString"].Value = "Data Source=" + serveur + ";Initial Catalog=" + bd + ";Integrated Security=True";
     
                            }
                        }
                        doc.Save(appConfigPath);
                    }
                }
                catch
                {
     
                }
            }
    Comme tu peux le remarquer, j'utilise donc mes 2 propriétés de ma fenêtre de dialogue.
    Je modifies aussi un paramètre de chemin, que je fixes au répertoire d'installation choisi par l'utilisateur lors de l'installation.

    D'ailleurs j'en profites pour demander, si quelqu'un sait comment on peut ajouter une boite de dialogue personnalisée (pour utiliser un FolderBrowserDialog par exemple ca m’intéresserait beaucoup )

    Voilà j'espère avoir été clair, si tu as une question, n'hésites pas.
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. LINQ to SQL] Ajouter un élément dans une IQueryable
    Par annalady dans le forum Accès aux données
    Réponses: 3
    Dernier message: 08/07/2008, 10h49
  2. [C#][Linq to Sql] Ajout de données ?
    Par dinbougre dans le forum Accès aux données
    Réponses: 8
    Dernier message: 10/03/2008, 13h48
  3. [C#][Linq to Sql] Ajout de données ?
    Par dinbougre dans le forum Linq
    Réponses: 8
    Dernier message: 10/03/2008, 13h48
  4. [Linq to SQL] Ajouter des methodes aux entity
    Par anthyme dans le forum Accès aux données
    Réponses: 2
    Dernier message: 22/02/2008, 20h34
  5. Requête SQL d'ajout, suppression du message de confirmation ?
    Par Jeff77 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/07/2006, 22h52

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