Question

Essentiellement, je veux savoir si dans VB.NET 2005, utiliser une commande sql, puis la réutiliser en utilisant le NEW est une erreur.Cela provoquera-t-il une fuite de mémoire.

PAR EXEMPLE:

try

dim mySQL as new sqlcommand(sSQL, cnInput)

// do a sql execute and read the data 

mySQL = new sqlcommand(sSQLdifferent, cnInput)

// do sql execute and read the data
catch ...

finally

if mysql isnot nothing then
   mysql.dispose
   mysql = nothing
end if

MODIFIER:mettez try catch pour éviter les commentaires sur le fait de ne pas les utiliser

Était-ce utile?

La solution

Juste pour étendre ce que Longhorn213 a dit, voici le code correspondant :

Using mysql as SqlCommand = new SqlCommand(sSql, cnInput)
  ' do stuff'
End Using

Using mysql as SqlCommand = new SqlCommand(otherSql, cnInput)
  ' do other stuff'
End Using

(modifier) ​​Tout comme pour information, using enveloppe automatiquement le bloc de code autour d'un try/finally qui appelle la méthode Dispose sur la variable avec laquelle il est créé.C'est donc un moyen simple de garantir la libération de votre ressource. http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx

Autres conseils

La collecte des déchets récupérera les premiers nouveaux lors de son exécution.

Uniquement le deuxième que vous disposez volontairement dans le bloc Enfin.Le premier sera supprimé lors de la prochaine exécution du garbage collection.

Je ne pense pas que ce soit une bonne idée.Si la première commande n'est pas fermée correctement, il est possible que vous ayez une connexion ouverte à la base de données et qu'elle ne soit pas supprimée.

Une meilleure façon serait de supprimer la première commande une fois que vous avez fini de l'utiliser, puis de la réutiliser.

Euh, à tous ces gens qui disent "c'est bon, ne vous inquiétez pas, le GC s'en occupe..." le tout indiquer de la Dispose Le modèle consiste à gérer ces ressources par le GC. ne peut pas se débarrasser.Donc si un objet a un Dispose méthode, vous feriez mieux de l'appeler lorsque vous en aurez terminé !

En résumé, Longhorn213 a raison, écoutez-le.

Une chose que je n'ai jamais résolue : si j'ai une classe qui implémente IDisposable, mais je ne m'en débarrasse jamais moi-même, je le laisse juste traîner pour le GC, le GC appellera-t-il réellement Dispose pour moi?

Non, le garbage collector trouvera l'ancienne version de mySql et la libérera en temps voulu.

Le garbage collector doit récupérer tout ce qui a été déréférencé tant qu'il n'a pas été déplacé dans le tas d'objets volumineux.

Tandis que la collecte des déchets nettoiera après vous finalement le modèle de suppression est là pour aider le système à libérer plus tôt toutes les ressources associées à l'objet. Vous devez donc appeler dispose une fois que vous avez terminé avec l'objet avant de le réaffecter.

Sois prudent.Si vous devez en faire beaucoup en boucle, cela peut être lent.Il est préférable de simplement mettre à jour la propriété .CommandText de la même commande, comme ceci (vous pouvez également nettoyer un peu la syntaxe) :

Using mysql as New SqlCommand(sSql, cnInput)
  ' do stuff'

    mySql.CommandText = otherSql

   'do other stuff'
End Using

Bien entendu, cela ne fonctionne que si la première commande n'est plus active.Si vous êtes toujours en train d'utiliser un lecteur de données, vous feriez mieux de créer une nouvelle commande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top