2008-10-29 6 views
2

Je nettoie les DataReaders dans un ancien projet .NET 1.1 dont j'ai hérité.SqlDataReader: Dans ce scénario, le lecteur sera-t-il fermé?

Le développeur précédent a codé la couche d'accès aux données de telle sorte que la plupart des méthodes DAL ont renvoyé SqlDataReaders (laissant ainsi à l'appelant le soin d'appeler les méthodes .Close() ou .Dispose()).

J'ai rencontré une situation, cependant, où un appelant n'attrape pas le SqlDataReader retourné (et par conséquent n'est pas en disposer correctement). Voir le code ci-dessous:

Data Access Méthode:

Public Shared Function UpdateData() As SqlDataReader 
    ... 

    drSQL = cmdSQL.ExecuteReader(CommandBehavior.CloseConnection) 

    Return drSQL 

End Function 

Indicatif téléphonique:

... 
DataAccessLayer.UpdateData() 
... 

Comme vous pouvez le voir, la méthode d'appel ne reçoit/coud pas le SqlDataReader retourné. Alors qu'est-ce qui se passe? Est-ce que SqlDataReader est toujours là et ouvert? Ou obtient-il automatiquement les ordures collectées puisque rien ne s'y adresse?

Je ne pouvais pas penser à un moyen de déboguer et de tester cela. Si quelqu'un a des idées ou des suggestions, ce serait génial.

Répondre

4

je crois qu'il va se fermer, mais pas jusqu'à ce que le garbage collector se « autour de lui, qui peut-être pas pour très longtemps ...

+0

Je pense que vous avez raison sur celui-ci. Depuis, nous avons ajouté le comportement de commande pour fermer la connexion lorsque l'objet SqlDataReader est fermé/éliminé, la Garbage Collection doit prendre soin de tout (à chaque fois que cela se produit). –

+0

@ [Jeffaxe]: je ne laisserais pas cela à la merci du GC. Si ce type d'opération se produit fréquemment, vous pouvez consommer le pool de connexions et d'autres ressources. De plus (en lisant la méthode littéralement) si seulement une mise à jour est faite, vous n'avez pas besoin d'un lecteur de données en premier lieu. –

Questions connexes