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 :

Object reference not set to an instance of an object [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 262
    Par défaut Object reference not set to an instance of an object
    bonjour,

    soit la classe suivante :
    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
    class connectionsql
         {
           SqlConnection con;
           public SqlDataReader rdr ;
           SqlCommand  cmd;
           public string req;
           string strcon = ConfigurationManager.ConnectionStrings["connection"].ConnectionString; 
     
     
           public connectionsql()
            {
               con=new SqlConnection(strcon);
               con.Open();
               cmd = new SqlCommand();
            }
     
           public void CreateReq()
           {
               cmd.CommandText = req;
               cmd.Connection = con;
           }
     
           public void AddParametre(string parametre, SqlDbType sqlDbType, object value)
           {
               cmd.Parameters.Add(parametre, sqlDbType);
               cmd.Parameters[parametre].Value = value;
           }
     
           public void ExecuteNonQuery()
           {
               cmd.ExecuteNonQuery();
           }
     
           public void ExecuteReader()
            {
              rdr=cmd.ExecuteReader();
            }
     
           public SqlCommand returnCmd()
           {
               return cmd;
           }
     
           public void Deconnection()
           {
               cmd.Dispose();
               rdr.Dispose();
               con.Close();
               con.Dispose();
           }
        //strcon contient la chaîne de connection
         }
    et bout de code suivant :
    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
     
    private void button1_Click(object sender, EventArgs e)
    {try
    {
    connectionsql insert = new connectionsql();
                            req = "Insert into tab_montant_bp (Code_A,Code_SC,montant,Exercice_BP,etat) values (@Code_A,@Code_SC,@montant,@Exercice_BP,@etat)";
                            insert.req = req;
                            insert.CreateReq();
                            insert.AddParametre("@Code_A", SqlDbType.Int, Convert.ToInt32(comboArticleBS.SelectedItem.ToString()));
                            insert.AddParametre("@Code_SC", SqlDbType.Int, Convert.ToInt32(comboSCBS.SelectedItem.ToString()));
                            insert.AddParametre("@montant", SqlDbType.Decimal, 0);
                            insert.AddParametre("@Exercice_BP", SqlDbType.Int, Convert.ToInt32(txtCurrentExercice.Text));
                            insert.AddParametre("@etat", SqlDbType.Bit, true);
                            insert.ExecuteNonQuery();
                            insert.Deconnection();
     
    }
    catch(Exception err)
    {
    MessageBox.show(err.Message);
    ]
    }
    en executant ce bout de code en cliquant sur le bouton, ça me génère un exception du gene :
    Object reference not set to an instance of an object
    cette exception est généré au niveau de la ligne de la classe : connectionsql.

    quelqu'un saurait il d'ou peux venir le problème, et comment le résoudre ??

    Merci.

  2. #2
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Bonjour,

    rien de plus normal...

    Avec le code que tu montres, ton SqlDataReader vaut null.
    Or, tu appelles sa méthode Close() dans ta méthode Deconnection().

    Tu ne peux pas faire appel à une méthode d'un objet "qui n'existe pas". Il faut que celui-ci ait été instancié (crée) pour pouvoir utiliser les propriétés/méthodes/fonctions d'un objet.

    En l'occurrence, tu n'utilises pas de SqlDataReader dans ton traitement, ta méthode Deconnection ne doit donc pas essayer de le fermer.

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 262
    Par défaut
    bonsoir calagan99 , et merci pour ta réponse rapise et efficace.

    en effet, tu as raison, je viens de supprimer la ligne de la classe; maintenant je fait directement un un dispose sur l'objet "rdr" comme suit : et ça marche nikel.

    Merci encore.

  4. #4
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    L'idéal étant de faire les choses au bon endroit. inutile de faire du code qui va agir "à 3km de l'endroit où tu en as besoin".
    D'une part ta classe connectionsql n'est pas vraiment utile vu ce qu'elle propose, de plus appeler ce genre de code dans le code behind n'est pas une bonne idée.
    Je t'invite à te pencher sur l'architecture n-tiers (qui consiste à créer des couches ayant des responsabilités séparées). Au passage, inutile de créer plusieurs dll séparées s'il n'y a pas de réutilisation du code dans d'autres projets. Souvent le code est fortement imbriqué avec la fonctionnalité du projet. Si tu développes un framework, avec un excellent niveau d'abstraction, et que ton code peux être utilisé dans tous les projets, avec tous les sgdb, alors là dll à part !!!
    En complément, je t'invite à te renseigner plus particulièrement sur la conception d'une Data Access Layer (je pense que tu trouveras des exemples sur le net) pour voir se qui se fait usuellement.

    Après relecture, je nuance sur l'utilité de ta classe. C'est une sorte de "wrapper" (le mot n'est pas très bien choisi). Je t'invite à ne pas faire Open() dans le constructeur, mais d'y inclure au moins l'utilisation du constructeur de sqlcommand utilisant la connexion. Mieux, tu passe ta requête en paramètre du constructeur de ta classe. Utilise une propriété pour ta commande, comme ça tu utilises directement les méthodes du FW .Net...

    Au final, ton exception est due à une erreur de conception fréquente chez les débutants.

    bon courage pour la refactorisation.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/04/2008, 18h36
  2. new : Object reference not set to an instance of an object
    Par zulad dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/06/2007, 20h35
  3. Object reference not set to an instance of an object
    Par DjRusty dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/03/2007, 07h26
  4. Réponses: 1
    Dernier message: 28/12/2006, 11h05
  5. Réponses: 1
    Dernier message: 20/04/2006, 12h09

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