[VB.Net] Problème d'instanciation d'objet dans une appli web

cs_Razalgood Messages postés 9 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 6 février 2006 - 19 janv. 2006 à 14:28
cs_Razalgood Messages postés 9 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 6 février 2006 - 6 févr. 2006 à 17:13
Bonjour,

J'obtiens ce message d'erreur :

La référence d'objet n'est pas définie à une instance d'un objet.

Message déjà rencontré lorsqu'on fait appel à une variable non déclarée. Mais là mon problème se pose dans le fait que j'obtiens ce message lors que je lance 2 Internet Explorer et que je clique sur le même bouton.
En fait je suppose que dans ma procédure où je déclare un DataReader où je l'instancie, l'utilise puis le close, le fait d'appeler 2 fois cette procédure en même temps via 2 IE a pour effet que de ne créer qu'un seul objet et donc le premier passage dans la procédure le close et le second lorsqu'il veut faire de même ne peut pas car il est déjà fermé.

Comment puis-je m'en sortir ? Est-ce normal ? Dois-je interdire la possibilité d'ouvrir 2 fois la même page (pas pratique car besoin fonctionnel) ? Est-ce un problème d'ouverture dans 2 IE qui ne provienne pas d'une même session ?

Enfin je ne sais pas trop donc si vous avez des idées...

Cordialement,

Razalgood

Config :
- VB.NET sous visual studio 2003
- Windows server 2003
- Serveur Web IIS
- Framework .Net 1.1.4322.573
- Oracle 8.1.6
- Connexion OleDB

7 réponses

cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
19 janv. 2006 à 15:27
Bonjour,

Tant de questions pour si peu d'infos...

Fais voir le bout de ton code qui plante, on va le guérir...
0
cs_Razalgood Messages postés 9 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 6 février 2006
20 janv. 2006 à 10:11
Bonjour,
Voici le code :



Function Identifiant_Login(
ByVal login)
As
String
Dim resultat
As
String = ""

Dim ConnexionLogin
As OleDbConnection = ouverture_connexion()

Dim MycommandLogin
As OleDbCommand = connlog.CreateCommand()
MycommandLogin .CommandText = "select ...."

MycommandLogin .Parameters.Add("@nom", OleDbType.Char).Value = LCase(Trim(login))

Dim ReaderLogin
As OleDbDataReader = MycommandLogin .ExecuteReader()

ReaderLogin .Read()
resultat = ReaderLogin .GetValue(0).ToString

ReaderLogin .Close()
MycommandLogin .Dispose()
ConnexionLogin .Close()

Return resultat

End
Function

L'erreur se produit à : ReaderLogin .Close()
Lorsque j'execute cette fonction dans une seule fenêtre, je n'ai pas de problème.
Par contre lorsque je la lance en simultanée dans 2 fenêtres j'ai mon problème.
Ai-je un problème d'architecture ? Est-ce une question d'option ? Est-il impossible de lancer 2 fois la même page sur un poste sans risque de conflit d'objets ?

En fait c'est un problème qui s'avère avoir certainement la même origine que celui-ci http://www.vbfrance.com/forum.v2.aspx?ID=637797 à ceci près que l'un appelle une procédure d'un module alors que l'autre une fonction de la page concernée.

Alors c'est grave docteur ?

Cordialement,

Razalgood
0
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
20 janv. 2006 à 11:36
ok
ce que je te conseil :

- Mettre toutes tes fonctions dans une class

- Ouvrir ta connexion en début d'application
Et Fermer ta connexion à la fin de ton application

- Faire le reste entre temps

- Faire en sorte de ne pas utiliser le même readerlogin en même temps pour tes 2 exécutions

- Eviter le dispose sauf à la fin de l'application

Si tu arrives à faire tout ça y a plus de souci
ps : en mettant tes fonctions dans une class si c bien fait tu peux exécuter simultanément autant d'instances que tu veux
0
cs_Razalgood Messages postés 9 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 6 février 2006
20 janv. 2006 à 11:56
merci de ta réponse,

par contre du coup j'ai des questions par rapport à ça :

- Mettre toutes tes fonctions dans une class
=> même si ma fonction ne me sert que dans une seule page ? quel bénéfice par rapport à la classe de la page concernée ?

- Ouvrir ta connexion en début d'application
Et Fermer ta connexion à la fin de ton application
=> travaillant sur une base oracle n'autorisant que 55 sessions simultanées avec actuellement une 20aine de session de libre en moyenne, si j'ouvre ma connexion en début d'appli pour ne la fermer qu'en fin, il ne faut pas que j'ai plus de 20 personnes qui se connecte sous peine d'impossibilité de connexion ?

- Faire en sorte de ne pas utiliser le même readerlogin en même temps pour tes 2 exécutions
=> là je vois pas comment, si c'est la même page que j'appelle le code ne change pas, mes objets gardent le même nom, non ? Si non comment créer des objets avec un nom dynamique ?

ai-je bien interprété ce que tu m'as dit ?

Razalgood
0

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

Posez votre question
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
20 janv. 2006 à 12:13
hem
t'es pas du genre compliqué toi lol...
ouverture et fermeture de connexion -> ça ralentit tous les traitements de façon conséquente

l'intégration à une class -> sert à la clarté du code et surtout l'instanciation pour la réutilisation des mêmes objets

bref si tu ne veux rien faire je ne peux pas beaucoup t'aider...

Supprime au moins le dispose qui peut te causer des ennuis

Et met un Try Catch sur ce qui plante
0
cs_Razalgood Messages postés 9 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 6 février 2006
20 janv. 2006 à 12:31
Oula non ! je suis prêt à changer tout le code s'il le faut, et c'est très gentil à toi de m'expliquer ce qui faut faire, c'est juste que j'essaye de comprendre pourquoi afin d'éviter de refaire ces erreurs.

Je vais faire mes changements pis je te tiens au courant.

Razalgood
0
cs_Razalgood Messages postés 9 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 6 février 2006
6 févr. 2006 à 17:13
Bonjour,

J'ai donc créé une connexion dans le session_start du global.asax que j'utilise durant toute la session.

Après quelques jours de tests, il semblerait qu'il n'y ait plus de problèmes d'instanciations avec les connexions...

Par contre pour faire face à l'augmentation du nombre de connexions du à la connexion persistante, il a fallu changer 2 paramètres de la base oracle :

open_cursors : de 100 je l'ai passé à 1000
sessions : de 50 à 200 pour éviter les conflits du à un temps de session un peu long (45 min)

merci pour tout,

Razalgood
0
Rejoignez-nous