Destruction des objets de récupération de données

Résolu
cs_aloisio11 Messages postés 126 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 7 décembre 2009 - 15 oct. 2007 à 17:13
cs_aloisio11 Messages postés 126 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 7 décembre 2009 - 16 oct. 2007 à 11:15
Bonjour,

J'utilise un module pour mon site Web pour tout ce qui est récupération de données.
Voici le code :

Option

Strict
OnImports

System.Data.SqlClient
Public

Module SQLDataAccess

Public
Function GetReader(
ByVal pRequeteSQL
As
String)
As SqlDataReader

Dim vCommande
As
New SqlCommand(GetChaineSQL(pRequeteSQL),
DirectCast(HttpContext.Current.Session(
"CONNECTION"), SqlConnection))

Return vCommande.ExecuteReader()

End
Function

Public
Function GetTable(
ByVal pRequeteSQL
As
String)
As Data.DataTable

Dim vDataTable
As
New Data.DataTable(
"TABLE")

Dim vDataAdapter
As SqlDataAdaptervDataAdapter =

New SqlDataAdapter(GetChaineSQL(pRequeteSQL),
DirectCast(HttpContext.Current.Session(
"CONNECTION"), SqlConnection))vDataAdapter.Fill(vDataTable)

Return vDataTable

End
Function

Public
Function GetScalar(
ByVal pRequeteSQL
As
String)
As
Integer

Dim vCmd
As
New SqlCommand(pRequeteSQL,
DirectCast(HttpContext.Current.Session(
"CONNECTION"), SqlConnection))

Dim vRes
As
IntegervRes =

CInt(vCmd.ExecuteScalar())vCmd.Dispose()

vCmd =

Nothing

Return vRes

End
FunctionEnd

Module

Pour le GetReader et le GetTable, dois-je fermer et détruire les objets que j'utilise comme dans GetScalar.
Si oui comment dois-je faire ?

Est ce que je fais des erreurs en faisant ainsi ?

Merci pour votre aide

6 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2007 à 09:53
Non,

le module, contient des méthodes static qui sont global à l'application. En ouvrant la connection dans le init de la page et en le fermant dans le unload, tu vas d'abord laisser la connexion trop longtemps ouvert (le unload se fait tard) et surtout si tu as 2 requêtes simultannées alors tu as un sacré bordel en perspective :p

Si tu veux faire de la sorte, il ne faut pas passer par une variable static (module) mais mettre la connexion accessible seulement pour la page via Page.Items["conn"]  = conn;

Sinon, utilise les using.

using reader as SqlDataReader = GetReader()
   while reader.read

   end while
end using

le using fait automatiquement un dispose qui lui même fera le close. Il est aussi inutile de faire =nothing.

La solution d'ouvrir et fermer une connexion par page peut paraitre séduisante MAIS ca suffira seulement pour des petits sites, car tupourras pas avoir beaucoup de requête simultannées.

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
3
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
15 oct. 2007 à 17:37
Bonjour,


le vCmd = nothing ne sert à rien, en faisant un dispose le garbage sait que l'objet ne sert plus à rien et qu'il peut le nettoyer quand il en aura envie.


Sinon, oui il faut toujours faire un dispose sur le datreader et la connection c'est meme ce qui permet de lacher la connexion à sql ...


Comme tu retournes ton sqldatreader il faut faire le dispose dans la méthode appellante (le dispose fait automatiquement le close)

Je te conseille d'utiliser le mot clé using

using reader as sqldatareader = getReader()

end using

ca fera le dispose et donc le close automatiquement.


Par contre ce qui est mal c'est de mettre la connexion en session !!! :-| je suis de l'avis de mettre une requete=une connexion. On peut ouvrir seulement 20 connexions simultannées (il me semble valeur par défaut). Si tu as plus de 20 utilisateurs alors t'es cuit :p


Bref créer une connexion par requete, la création d'une connexion n'est pas si couteuse que ca, puisque ADO.net gère déjà un pool de 20 connexions ...

En faisant ca, il faudra impérativement fermer la connexion après utilisation. Dans le cas de la méthode GetReader il faudra rajouter un paramètre dans command.ExecuteReader(xxxx) pour lui dire de fermer automatiquement la connexion lorsque l'on ferme le reader.





<hr />

Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
cs_aloisio11 Messages postés 126 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 7 décembre 2009
16 oct. 2007 à 08:54
Merci pour ta réponse.

Voila la nouvelle version de mon module :

Option

Strict
OnImports

System.Data.SqlClient
Public

Module SQLDataAccess

  Public vConnection
As SqlConnection

  Public
Function GetReader(
ByVal pRequeteSQL
As
String)
As SqlDataReader

    Dim vCommande
As
New SqlCommand(GetChaineSQL(pRequeteSQL), vConnection)

    Dim vDr
As SqlDataReader    vDr = vCommande.ExecuteReader()

    vCommande.Dispose()

    Return vDr

  End
Function

  Public
Function GetTable(
ByVal pRequeteSQL
As
String)
As Data.DataTable

    Dim vDataTable
As
New Data.DataTable(
"TABLE")

    Dim vDataAdapter
As SqlDataAdapter    vDataAdapter =

New SqlDataAdapter(GetChaineSQL(pRequeteSQL), vConnection)    vDataAdapter.Fill(vDataTable)

    vDataAdapter.Dispose()

    vDataAdapter =

Nothing

    Return vDataTable

  End
Function

  Public
Function GetScalar(
ByVal pRequeteSQL
As
String)
As
Integer

    Dim vCmd
As
New SqlCommand(pRequeteSQL, vConnection)

    Dim vRes
As
Integer    vRes =

CInt(vCmd.ExecuteScalar())    vCmd.Dispose()

    Return vRes

  End
FunctionEnd

Module

Toutes mes pages hérite de la classe BasePage dans laquelle j'ouvre la connection au Init et la ferme au Unload

Option

Strict
OnImports

System.Data.SqlClient
Public

Class BasePage

  Inherits System.Web.UI.Page

  Public
Sub
New()

  End
Sub

  Private
Sub Page_Init(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles
Me.Init

    vConnection =
New SqlConnection(ConfigurationManager.ConnectionStrings(ConfigurationManager.AppSettings(
"SITE") &
"_" & ConfigurationManager.AppSettings(
"DECKPOINT")).ToString())    vConnection.Open()

  End
Sub

  Private
Sub Page_Unload(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles
Me.Unload
    vConnection.Close()

    vConnection.Dispose()

    vConnection =

Nothing

  End
Sub

  Protected
Overloads
Overrides
Sub OnError(
ByVal e
As EventArgs)
     Session(

"ERREUR") = Server.GetLastError()

     Response.Redirect(
"pErreur.aspx")

  End
Sub
End

Class

Quand j'appelle getReader je le fais ainsi :

Dim

vDrArt
As Data.SqlClient.SqlDataReader

vDrArt = GetReader(vSQL)

If vDrArt.Read()
Then
   '.....
End
IfvDrArt.Close()

vDrArt =
Nothing

Dois-je faire un vDrArt.Dispose() ?

Le reste est il correcte ?

Merci d'avance pour votre aide qui m'est plus qu'efficace ?

 
0
cs_aloisio11 Messages postés 126 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 7 décembre 2009
16 oct. 2007 à 10:04
Merci.

A part le Unload je peux fermer dans quel événement ?

Quand j'ai des requêtes qui se croisent j'utilise une Datatable et un DataReader.

Pour la connexion par page elle est préférable car sur une page je peux me retrouver avec 200 voir 300 requêtes, ce qui serait beaucoup trop lourd s'il y avait 200-300 connexions, ouvertures, fermetures.

Avant je faisais cela et je trouve qu'avec une connexion par page les perf sont meilleurs.
0

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

Posez votre question
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2007 à 10:07
2 ou 300 requête par page :| dans ce cas là ... mais je pense que tu dois pouvoir regrouper tes requêtes et tes connexions....

Tu peux faire le dispose après le render

overrides sub Render(..)
mybase.Render(...)
close();
end sub

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
cs_aloisio11 Messages postés 126 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 7 décembre 2009
16 oct. 2007 à 11:15
Merci pour ton aide, je vais essayer de me débrouiller avec ces conseils.
0
Rejoignez-nous