Class partagée

coulis Messages postés 121 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 24 juin 2010 - 30 sept. 2005 à 22:43
coulis Messages postés 121 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 24 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

11 réponses

tikrimi Messages postés 192 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 9 mars 2007 1
30 sept. 2005 à 22:57
Bonsoir,



As tu essayé de déclarer ta fonction statique Stats comme étant publique ?



TiK
http://www.objectif-services.com
http://gadgaill.blogspot.com
0
coulis Messages postés 121 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 24 juin 2010
30 sept. 2005 à 23:06
Oui en fait elle est public (privé c'etait une erreur) et cela ne fonctionne pas non plus ?

Thierry
0
tikrimi Messages postés 192 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 9 mars 2007 1
30 sept. 2005 à 23:10
Dans ce cas, essaye tout simplement de remplacer stats1.Stats(toto)
lorsque tu enlèves les Shared (toto je sais pas bien ce que c
mais bon...) par :



Dim voObj as new stats1()

voObj.Stats(toto)

TiK
http://www.objectif-services.com
http://gadgaill.blogspot.com
0
coulis Messages postés 121 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 24 juin 2010
30 sept. 2005 à 23:29
Ok ça évolue mais j'ai encore une erreur


Dim voObj As New stats1

voObj.Stats(toto) (arguments trops nombreux pour public sub stats()) ?




Thierry
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tikrimi Messages postés 192 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 9 mars 2007 1
1 oct. 2005 à 07:48
Peux-tu nous renvoyer ton code tel qu'il est actuellement (vu l'erreur
c'est surement que ta méthode stats() n'accepte pas de paramètres)

TiK
http://www.objectif-services.com
http://gadgaill.blogspot.com
0
coulis Messages postés 121 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 24 juin 2010
1 oct. 2005 à 08:21
Ok voici le code



le fichier stats1.vb




Imports System.Web

Imports System.Data.SqlClient

Namespace NamesStatistique

Public Class Stats1



Public Shared 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(ByVal RefConc As String)

RecupDecalHor(RefConc)

IdClient(RefConc, NomStat)

Majdate()

Pays(CodeLang)

Semaine()

StatPage()

'StatPays()

'TableStats()

'STATSModif(infocookie, navigt)

End Sub


le sub qui pose un problème



'*** TRAITEMENTS TABLE "StatPage"

'Récupération des données de la semaine passée

Shared id_StatPage(), PageAnnee(), PageMois(), PageSemaine() As Integer

Shared j As Integer = 0

Shared m As Integer

Public Shared Sub StatPage()

Dim dr As SqlDataReader

Dim requete As String


requete "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

dr.Close()

If j <> 0 Then

'TraitementSemaine1()

'TraitementMois1()

'TraitementAnnee1()

Else

End If

End Sub


Le global.asax




Imports System.Web

Imports System.Web.SessionState

Imports System.Data.SqlClient

Imports LibStats.NamesStatistique

Public Class Global

Inherits System.Web.HttpApplication

....

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)

'Récupération du lieux de la concession par le renvois de domaine

'ex : http://www.auto-dole.fr@IDConcession =dole

Session("IDConcession") = Request.Params("IDConcession")

'Response.Write("IDConcession= " & Session("IDConcession"))



'Paramètres statistiques

Session("RefConc") = "a724"

Session("Site") = "auto-besancon.fr"

Session("NomStat") = "auto-besancon"

Session("EmailStat") = "contact@auto-besancon.fr"



Dim CodeLang, navigt As String

CodeLang = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")

navigt = Request.ServerVariables("HTTP_USER_AGENT")



'Récupération du cookie "dernieracces"

Dim infocookie As Int16 = 0

Dim Cook As HttpCookie

Cook = Request.Cookies("dernieracces")

If Not Cook Is Nothing Then 'cookies existe

'Verification du passage dans la journée par la date

If DateValue(Cook.Value) = DateTime.Now Then


'le client est déja passé dans la journée

infocookie = 1

Else

End If

Else

infocookie = 0

End If



'traitement des statistisques Class LibStats.CStats1.Stats

Dim voObj As New stats1

'voObj.Stats(Session("RefConc"))

voObj.Stats(Session("RefConc"), Session("NomStat"), infocookie, CodeLang, navigt)

'stats1.Stats(Session("RefConc"), Session("NomStat"), infocookie, CodeLang, navigt)



'Mise à jour du cookie

Dim MC As New HttpCookie("dernieracces", DateTime.Now)

MC.Expires = DateTime.Now.AddDays(1)

Response.Cookies.Add(MC)

End Sub

.....

Voici donc le code ...



Thierry
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
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...

(je vais chercher...)



A+++

Nurgle
0
tikrimi Messages postés 192 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 9 mars 2007 1
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…


TiK
http://www.objectif-services.com
http://gadgaill.blogspot.com
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
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)



Avec tout ca ca devrait etre bon :)


<hr> Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
tikrimi Messages postés 192 Date d'inscription dimanche 5 janvier 2003 Statut Membre Dernière intervention 9 mars 2007 1
1 oct. 2005 à 22:58
Bonsoir,



J'ai ajouté une source ce soir : http://www.aspfr.com/code.aspx?ID=34045 ça va peut-être pouvoir t'aider un peu.

TiK
http://www.objectif-services.com
http://gadgaill.blogspot.com
0
coulis Messages postés 121 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 24 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)



'Paramètres statistiques

Session("RefConc") = "a724"

Session("Site") = "auto-besancon.fr"

Session("NomStat") = "auto-besancon"

Session("EmailStat") = "contact@auto-besancon.fr"



Dim CodeLang, navigt As String

CodeLang = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")

navigt = Request.ServerVariables("HTTP_USER_AGENT")



'Récupération du cookie "dernieracces"

Dim infocookie As Int16 = 0

Dim Cook As HttpCookie

Cook = Request.Cookies("dernieracces")

If Not Cook Is Nothing Then 'cookies existe

'Verification du passage dans la journée par la date

If DateValue(Cook.Value) = DateTime.Now Then


'le client est déja passé dans la journée

infocookie = 1

Else

End If

Else

infocookie = 0

End If



'traitement des statistisques Class LibStats.CStats1.Stats

Dim voObj As New stats1


voObj.Stats(Session("RefConc"), Session("NomStat"), infocookie,
CodeLang, navigt)

c:\inetpub\wwwroot\auto-besancon\Global.asax.vb(74): Arguments trop nombreux pour 'Public Sub Stats()'.

Si je mets shared à ma procédure cela fonctionne.

'Mise à jour du cookie

Dim MC As New HttpCookie("dernieracces", DateTime.Now)

MC.Expires = DateTime.Now.AddDays(1)

Response.Cookies.Add(MC)

End Sub


Thierry
0
Rejoignez-nous