2017-09-25 11 views
0

Je ne suis pas tout à fait sûr si je rencontre un bug ou si je ne comprends pas comment cela fonctionne. Alors récemment, j'ai essayé de résoudre cette exception MySql.Data.MySqlClient.MySqlException: 'There is already an open DataReader associated with this Connection which must be closed first.' et j'ai commencé une session de débogage pour voir ce qui se passe. Ce que j'ai vu ne calcule pas tout à fait dans ma tête (voir la capture d'écran ci-jointe).MySqlDataReader ne se ferme pas après avoir appelé Close() sur le lecteur

Après avoir appelé reader.Close(), la propriété IsClosed reste false, et les appels répétés à .Close() (dans les fenêtres immédiates) ne modifient pas cela.

Ce comportement est-il attendu et mon problème est ailleurs, ou s'agit-il d'un bogue et de la cause de l'exception? Cela se produit lorsque vous utilisez MySql.Data v6.10.3-rc (à partir de nuget.org), qui est le seul supportant la norme .NET à ce jour. En outre, le code est compilé à une application .NET Core 2.0.

UPD: Il y a des tâches autour, mais le lecteur n'est traité qu'à partir du thread principal. En outre, reader est déclaré comme DbDataReader, dont MySqlDataReader est héritée.

UPD2: Apparemment, si j'appelle ((MySql.Data.MySqlClient.MySqlDataReader)reader).Close(), le lecteur se ferme correctement. On dirait que c'est un bug dans le connecteur et comment ils utilisent des méthodes virtuelles. Droite?

Debugger session

+1

êtes-vous dans une tâche asynchrone? – apomene

+0

@apomene Non, en dehors de la tâche, code monothread normal. Il y a des tâches autour mais elles ne traitent pas avec le lecteur, seulement les données extraites du lecteur. – bazzilic

+1

Que se passe-t-il si vous appelez 'lecteur.Dispose()'? Est-ce qu'on s'en débarrasse? – waka

Répondre

0

Assurez-vous de toujours utiliser tous vos lecteurs dans une clause using. J'utilise tous les objets de lecture et de connexion dans les clauses d'utilisation et je n'ai remarqué aucune erreur ou je n'ai pas fermé. Je ne vois pas beaucoup de choses que les choses pourraient mal tourner avec la clause using.

+0

Il y a un bogue dans l'implémentation de MySqlDataReader, ils ne remplacent pas la méthode, donc l'appel virtuel résout de vider l'implémentation de DbDatReader. – bazzilic

+0

Je viens de remarquer que vous avez parlé de l'utilisation de la v6.x puisque seulement cela est supporté par la norme. J'utilise actuellement 8.0.8-dmr et ça marche bien. Il y a aussi une version plus récente si vous voulez essayer –

+0

Même après avoir lu la documentation, je ne comprends toujours pas quelle est la différence entre les connecteurs 6.x et 8.x. – bazzilic