coulis
Messages postés121Date d'inscriptionlundi 20 octobre 2003StatutMembreDernière intervention24 juin 2010
-
30 sept. 2005 à 22:43
coulis
Messages postés121Date d'inscriptionlundi 20 octobre 2003StatutMembreDernière intervention24 juin 2010
-
3 oct. 2005 à 13:42
Bonjour à tous,
Voilà le problème
J'ai une class du genre:
Imports System.Web
Imports System.Data.SqlClient
Namespace NamesStatistique
Public
Class Stats1
Private
Shared
Sub Stats(toto
)
Sub1(toto)
Sub2()
End
Sub
Cette class appel des procédures "Sub1, 2..."
Pour ces procédures j'ai besoin d'un tableau dont je ne connais pas la longueur exacte.
J'ai donc ceci (en rouge les commentaires)
Shared id_StatPage()
As
Integer (mon tableau : le Dim ne fonctionne pas avec un procédure Shared)
Shared j
As
Integer = 0
Shared m
As
Integer
Public
Shared
Sub Sub1() (obligé de mettre une procédure shared sinon pas reconnu lors de l'appel de ma class)
Dim dr
As SqlDataReader
Dim requete
As
Stringrequete "SELECT StatPage.* FROM StatPage WHERE (id_StatSite " & id_StatSite & ")"
dr = LibData.AccesBD.GetReader(requete)
Do
Until
Not dr.Read
id_StatPage(j) = dr("id_StatPage") (ici ça plante car mon tableau est déclaré en shared )
PageAnnee(j) = dr("PageAnnee")
PageMois(j) = dr("PageMois")
PageSemaine(j) = dr("PageSemaine")
j += 1
Loop
End Sub
J'appelle cette procédure depuis mon global.asax.vb
Imports LibStats.NamesStatistique
....
stats1.Stats(toto)
....
(Si je supprime les shared dans ma class) j'ai l'erreur suivante lors de l'appel de ma class :
"Une référence à un membre non partagé requiert une référence d'objet."
Pouvez vous m'éclairer et m'indiquer une solution ?
Thierry
cs_Nurgle
Messages postés1642Date d'inscriptionsamedi 6 novembre 2004StatutMembreDernière intervention28 avril 20114 1 oct. 2005 à 09:54
Salut,
Une petite question :
Quand tu dis "ici ça plante car mon tableau est déclaré en Shared", quel est le message d'erreur envoyé
Et puis il y a un truc pas normal :
Je ne te vois nullepart dimensionner ton tableau (tu le déclare et tu y
ajoute tout de suite des valeurs : normalement ce genre de choses
déclenche une erreur ).
tu devrais, juste avant le Do Until Not dr.Read, faire un :
Redim id_StatPage(un_nombre)
En mettant à la place de "un_nombre" le nombre d'enregistrements dans
ton SqlDataReader. Honte à moi, je ne me souviens plus quelle est la
propriété du SqlDataReader qui renvoi le nombre d'enregistrements...
tikrimi
Messages postés192Date d'inscriptiondimanche 5 janvier 2003StatutMembreDernière intervention 9 mars 20071 1 oct. 2005 à 11:04
J'arrête de regarder le code en détail, la logique même de ta classe me pose problème.
Je ne comprends pas pourquoi tu tiens absolument à déclarer tes membres
de classe comme statique (id_StatPage(), PageAnnee(), PageMois(),
PageSemaine(),j,m) alors que tu passes ton temps à les modifier et
qu'ils ne sont en fait jamais partagés.
Dans ta classe telle qu'elle est actuellement, tu peux supprimer les
shared de partout (et pense à réinitialiser tes tableau à chaque
passage dans ta methode), logiquement ça doit marcher.
Par contre, l'utilisation de membres statique peut être envisagé, mais
pas comme tu le fais là. Commence par charger tes tableaux au démarrage
de l'application, et ensuite ajoute les informations supplémentaires au
démarrage de la nouvelle session (je dis bien ajoute et non écrase
tout).
Par contre ton idée m'intéresse, et je vais surement faire quelque chose dessus ce soir, donc si tu peux patienter un peu
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 1 oct. 2005 à 13:18
Ca ne m'etonne pas que ca plante !!! J'aime pas les méthodes statiques,
mais en essayant d'aller recuperer ton tableau, ca ne m'etonnerais pas
qu'il aille t'en chercher un nouveau tout les jours !
Pourquoi veux tu faire tout ca en shared ? moi je ferais une classe
toute simple, et si tu veux pas instancier la classe dans le code (car
c'est chiant d'ecrire une ligne de plus ;)) tu fais un singleton et
puis voila :)
public class stats
public sub truc()
end sub
public sub toto()
end sub
public shared function getInstance() as stats
return new stats()
end function
end class
dans le code
stats.getInstance().toto()
et comme le dit Nurgle, faut faire un redim sur ton tableau sinon ca va
pas aimer. A ta place je mettrais un ArrayList c'est plus simple pour
ajouer des objets dedans (ou alors un List(of Integer) si tu es en
.net2)
coulis
Messages postés121Date d'inscriptionlundi 20 octobre 2003StatutMembreDernière intervention24 juin 2010 3 oct. 2005 à 13:42
merci à tous pour vos réponses. (j'étais absent ce WE) j'ai bien
étudier vos solutions mais j'ai tjs un problème que je ne m'explique
pas.
Lors de l'appel de ma class Stats1 ( depuis mon global.asax.vb j'ai l'erreur suivante (en rouge dans le global asax ci-dessous )
Si je déclare les procédures de ma class en "shared" je n'ai plus d'erreur ???
Pouvez vous m'expliquer pourquoi je ne peux instancier ma class que si elle se trouve en shared ?
Cyril je n'ai pas tout compris tes remarques et ton singleton. J'ai
modifier ma classe comme tu le suggères et écrit "
stats.getInstance().toto()" dans mon global.asax.vb
Il ne reconnait pas GetInstance() ?
Nurgle, merci pour ta remarque les modifs sont faites mais pas encore testé car l'erreur actuelle m'empèche de le faire.
TiK, J'ai regardé ton code source, ta class et bien en shared.
Ma class
Imports System.Web
Imports System.Data.SqlClient
Namespace NamesStatistique
Public Class Stats1
'ACCES UNIQUE PAR SESSION
Public Sub Stats(ByVal
RefConc As String, ByVal NomStat As String, ByVal infocookie As Int16,
ByVal CodeLang As String, ByVal navigt As String)
'Public Sub Stats()
'RecupDecalHor(RefConc)
'IdClient(RefConc, NomStat)
'Majdate()
'Pays(CodeLang)
'Semaine()
'StatPage()
''StatPays()
'TableStats()
'STATSModif(infocookie, navigt)
End Sub
Mon global asax.vb
Imports System.Web
Imports System.Web.SessionState
Imports System.Data.SqlClient
Imports LibStats.NamesStatistique
Public Class Global
Inherits System.Web.HttpApplication
.....
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Se déclenche lorsque l'application est démarrée
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)