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

ASP.NET Discussion :

Problème de porté de variable et StackOverflow


Sujet :

ASP.NET

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut Problème de porté de variable et StackOverflow
    Bonjour,

    Je développe actuellement une classe pour un moteur de recherche dans une application ASP.net en VB.net. La classe utilise "SqlConnection" pour se connecter à la BD.

    Classe Recherche.vb
    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
     
    Imports System.Data.SqlClient
    Public Class Recherche
     
    #Region " Implémentation privée "
        'Input
        Private _Connection As New SqlConnection()
    [...]
        'Output
        Private _Resultats As New DataSet()
    #End Region
     
    #Region " Constructeurs "
        Sub New()
     
        End Sub
        Sub New(ByVal value As String)
            Me.New()
            Me.ConnectionString = value
        End Sub
    #End Region
     
    #Region " Propriétés publiques "
        WriteOnly Property ConnectionString() As String
            Set(ByVal value As String)
                _Connection.ConnectionString = value
            End Set
        End Property
    [...]
        ReadOnly Property Resultats() As DataSet
            Get
                Return _Resultats
            End Get
        End Property
    #End Region
     
    #Region " Procédures publiques "
        Public Sub Connecter()
            _Connection.Open()
        End Sub
        Public Sub Deconnecter()
            If ConnectionState.Open Then
                _Connection.Close()
            End If
        End Sub
        Public Sub Rechercher()
            Dim da As New SqlDataAdapter()
            Dim query As New SqlCommand()
            With query
                .Connection = _Connection
                .CommandType = CommandType.Text
                .CommandText = [...]
            End With
            _Resultats.Clear()
            da.SelectCommand = query
            da.Fill(_Resultats)
        End Sub
    #End Region
     
    #Region " Desctructeur "
        Protected Overrides Sub Finalize()
            Me.Deconnecter()
            MyBase.Finalize()
        End Sub
    #End Region
    End Class
    Cependant, je reçoit toujours une erreur StackOverflow si j'essaie de déclarer mon objet en private dans le haut de la partie code de ma page recherche.aspx (donc dans recherche.aspx.vb)

    Erreur : Une exception non gérée du type 'System.StackOverflowException' s'est produite dans MonProjet.DLL
    Tout ça à la contruction de ma classe recherche (dans le New())

    Recherche.aspx.vb
    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
     
    Imports MonProjet.Recherche
     
    Partial Public Class Recherche
        Inherits System.Web.UI.Page
     
        Private Recherche As New Recherche()
     
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Me.IsPostBack Then
                Recherche.ConnectionString = Application.Get("Connection")
                Recherche.Connecter()
            End If
        End Sub
     
        Private Sub btnRechercher_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRechercher.Click
            Recherche.Rechercher()
        End Sub
    End Class
    Sinon, en admettons que je réussirais (ici pour pallier, je le redéclare pour chaque fonction, je reçoit une autre erreur)

    Erreur : La propriété ConnectionString n'a pas été initialisée
    (Recherche.vb: Rechercher(): da.Fill(_Resultats))

    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
     
    Imports MonProjet.Recherche
     
    Partial Public Class Recherche
        Inherits System.Web.UI.Page
     
        'Private Recherche As New Recherche()
     
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Me.IsPostBack Then
                Dim Recherche As New Recherche()
                Recherche.ConnectionString = Application.Get("Connection")
                Recherche.Connecter()
            End If
        End Sub
     
        Private Sub btnRechercher_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRechercher.Click
            Dim Recherche As New Recherche()
            Recherche.ConnectionString = Application.Get("Connection")
            Recherche.Connecter()
            Recherche.Rechercher()
        End Sub
    End Class
    Pouvez-vous m'aidez, merci beaucoup!

  2. #2
    Membre confirmé

    Inscrit en
    Novembre 2003
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 168
    Par défaut
    Déjà tu ne peux pas faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Partial Public Class Recherche
        Inherits System.Web.UI.Page
     
        Private Recherche As New Recherche()
    Parce que chaque objet de la classe Recherche que tu crées va créer un autre objet recherche et l'opération se répète infiniment d'où le StackOverFlow.

    De tout façon, ton implémentation semble erronné à la base, car t'as une page ASPX qui s'appele Recherche.aspx et une classe qui n'est pas sa classe de code behind qui s'appelle aussi Recherche, normalement c'est une erreur de compilation que tu devais obtenir, je en comprends pas.

    Pour la deuxième partie de ta question, à ta place je commencerais par mettre un point d'arrêt sur cette instruction et je regarderais ce qu'elle retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Recherche.ConnectionString = Application.Get("Connection")

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut
    Effectivement, une fois que je le réalise, la classe ne devrait pas porter le même nom. Je vais le changer.

    Deuxièmement, si je ne déclare pas mon nouvel objet à cet endroit, est-ce possible de le faire dans le page Load et d'y accéder via les autres fonctions, exemple pour mon bouton rechercher.

    Je ne peux pas tester pour le moment car la carte vidéo de mon ordinateur portable vient de rendre l'âme, je vais faire 2 heures de route ce soir pour faire honorer ma garantie. Je vais aussi me monter un ordinateur temporaire pour développer.

    Je vous redonne donc les réponses à vos questions fort probablement demain dès que ma station de travail est de nouveau opérationnel...

    Merci

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2003
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 168
    Par défaut
    2h de route c'est que probablement tu viendras ici à Québec ville, alors bienvenue

    Si tu fais le renommage nécessaire, normalement tu peux créer ton objet là où tu le fais maintenant (c à d au moment de la déclaration). Exemple :

    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
    Imports MonProjet.Recherche
     
    Partial Public Class PageRecherche
        Inherits System.Web.UI.Page
     
        Private objRecherche As New Recherche()
     
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Me.IsPostBack Then
                objRecherche.ConnectionString = Application.Get("Connection")
                objRecherche.Connecter()
            End If
        End Sub
     
        Private Sub btnRechercher_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRechercher.Click
            objRecherche.Rechercher()
        End Sub
    End Class
    Par contre, oui tu peux le créer dans le Page_Load et l'utiliser ou tu veux :

    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
    Partial Public Class PageRecherche
        Inherits System.Web.UI.Page
     
        Private objRecherche As Recherche 'Pas de New icitte ;)
     
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            objRecherche =  New Recherche()
            If Me.IsPostBack Then
                objRecherche.ConnectionString = Application.Get("Connection")
                objRecherche.Connecter()
            End If
        End Sub
     
        Private Sub btnRechercher_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRechercher.Click
            objRecherche.Rechercher()
        End Sub
    End Class

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut
    Oui, effectivement, je suis allez à Québec...

    Bon, j'ai essayé ce que tu m'as dit et effectivement, cela fonctionne bien mieux. J'ai dût retirer la déconnection dans le destructeur et là ça fonctionne. Aussi, mon Application.Get("Connection") était totalement erroné. Je ne sais pas où j'ai été cherché cela mais en fait c'était My.Settings.Connection qu'il fallait utiliser.

    Merci beaucoup de ton aide, je me sens un peu plus à l'aise avec l'ASP.Net (C'est mon premier projet...)

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

Discussions similaires

  1. Problème de portée de variables (VBS)
    Par befast dans le forum Windows
    Réponses: 0
    Dernier message: 18/09/2007, 09h40
  2. [Mail] problème de portée de variables
    Par xclam dans le forum Langage
    Réponses: 2
    Dernier message: 12/04/2007, 09h35
  3. Problème de Portée de Variable
    Par Julien_C++ dans le forum C++
    Réponses: 7
    Dernier message: 18/09/2006, 10h13
  4. [VBA-E] Problème de portée de variable [débutant]
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/03/2006, 18h28
  5. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34

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