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

Windows Forms Discussion :

[2.0] Null Reference Exception


Sujet :

Windows Forms

  1. #1
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut [2.0] Null Reference Exception
    Salut,

    Je développe un service Windows actuellement, mais je poste tout de même ici, je pense que la logique est plus ou moins la même pour ce bug.
    Pour accéder à la base de données je m'inspire du cours "Travailler avec un DataSet".
    J'obtiens une null reference exception sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oCommand.CommandText = sSql
    Erreur banale pour vous peut-être mais pas pour moi. Dans le constructeur de la classe, je n'ai que InitializeComponent(). Le coup du InitializeCompoment(), si ça vient de là, est peut-être plus subtile que d'habitude.
    La méthode dans laquelle l'erreur se passe est appelée par un timer cf. une autre discussion à problème.
    Voici donc un bout de code, d'après celui, pourriez-vous me dire ce qui cloche?
    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
    Public Class ServicePlanification
    	Private oConn As New SqlConnection("une chaîne de connexion")
    	Private oCommand As SqlCommand
    	Private oCommandBuilder As SqlCommandBuilder
    	Private oDA As SqlDataAdapter
    	Private oDS As New DataSet()	'-- Attention au New
    	Private oDT As DataTable
    	Private oDV As DataView
    	Private oDR As DataRow
    	Private oDRCollection As DataRowCollection
    	Private sSql As String
     
    	Public Sub New()
    		'-- Cet appel est requis par le Concepteur Windows Form.
    		InitializeComponent()
    	End Sub
     
    	Public Sub selectionnerTache(ByVal stateInfo As Object)
    		Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
    		Dim flag As Boolean = False
    		Dim ATTENTE As DataTable
    		Dim EXECUTION As DataTable
     
    		sSql = "select ID_INTERVALLE from TYPE_INTERVALLE"
    		oCommand.CommandText = sSql
    		oCommand.Connection = oConn
    Merci par avance.

  2. #2
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    J'initialise dans le constructeur et j'ai mal lu le cours...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Par défaut
    A aucun moment tu n'instancies l'objet oCommand,

    Peut être que tu dois faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private oCommand As New SqlCommand
    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private oCommand As SqlCommand

  4. #4
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    En effet, j'ai pas bien lu le cours. J'aimerais qu'on m'explique pourquoi ces différents essais ne fonctionnent pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Class ServicePlanification
    	Private oCommand As SqlCommand = new SqlCommand
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Class ServicePlanification
    	Private oCommand As New SqlCommand
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub New()
    	oCommand = New SqlCommand
    	InitializeComponent()
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub New()
    	InitializeComponent()
    	oCommand = New SqlCommand  '-- je suis censé initialiser ici d'après le concepteur
    End Sub
    Je suis bien obligé de l'instancier dans la méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub selectionnerTache(ByVal stateInfo As Object)
    	Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
    	sSql = "select ID_INTERVALLE from TYPE_INTERVALLE"
    	oCommand = New SqlCommand(sSql)

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub New()
    	InitializeComponent()
    	oCommand = New SqlCommand  '-- je suis censé initialiser ici d'après le concepteur
    End Sub
    ca, ca doit marcher
    m'enfin sinon tu mets un point d'arret là ou l'erreur se trouve et grace à la pile d'appel tu verras d'où tu arrives
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Décidément, il y a des chose que je ne comprends pas.
    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
    Public Class ServicePlanification
    	Private oConn As SqlConnection = New SqlConnection("une chaîne de connexion quelconque")
    	Private oCommand As SqlCommand
    	Private sSql As String
     
    	Public Sub New()
    		InitializeComponent()
    	End Sub
     
    	Public Sub selectionnerTache(ByVal stateInfo As Object)
    		Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
    		sSql = "select * from MATABLE"
    		'oConn = New SqlConnection("une chaîne de connexion quelconque")
    		oCommand = New SqlCommand(sSql, oConn)
    		oConn.Open()
    		'...
    Ce code plante à oConn.Open() avec une null reference exception. Pourtant si je déplace l'instanciation dans la méthode, ça fonctionne!

    Je reste novice, auriez-vous une explication?

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    personnellement, j'en vois aucune ...
    c'est censé fonctionner
    essayez de déplacer l'instanciation dans le new à tout hasard pour voir si c'est mieux
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Et non, c'est comme mon problème avec oCommand plus haut. Ce qui est curieux, c'est que j'ai besoin de cette connexion dans une autre méthode. Or si je l'instancie dans le private ou le constructeur, ça ne fonctionne pas. Je dois absolument l'instancier dans selectionnerTache!

    Je pense que c'est lié au fait que c'est un service et que j'exécute selectionnerTache grâce à un timer immédiatement après le démarrage du service.

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    sinon, une autre solution, qui d'ailleurs peut etre appliquée à plein de cas et permet d'avoir un code plus sûr
    c'est de mettre l'instanciation dans une propriété et d'utiliser celle ci plutot que la variable privée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private _oCommand As SqlCommand
    private readonly property oCommand as SqlCommand
      Get
        if _oCommand isnot nothing then return _oCommand 
        _oCommand = New SqlCommand(sSql, oConn)
        return _oCommand 
      End Get
    end property

    de cette manière et en utilisant oCommand plutot que _oCommand dans le code
    si la variable est pas encore instanciée ou si elle a été mise à nothing, elle est recrée
    et donc aucun bug

    (il y a quelques lignes à rajouter si on veut que le code soit thread-safe)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Null Reference Exception
    Par saxophtrion dans le forum VB.NET
    Réponses: 8
    Dernier message: 16/05/2012, 15h55
  2. Une Null Reference Exception
    Par Vivien57 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/05/2011, 17h29
  3. NuLL Reference Exception
    Par khawlita dans le forum Accès aux données
    Réponses: 11
    Dernier message: 18/04/2009, 16h31
  4. Null reference exception
    Par xavpiaf dans le forum ASP.NET
    Réponses: 5
    Dernier message: 05/05/2008, 09h37
  5. Null Reference Exception
    Par mischa dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/06/2007, 11h59

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