une déclaration de retour peut empêcher une instruction à l'aide de la fermeture d'une connexion à une base de données?

StackOverflow https://stackoverflow.com/questions/588396

Question

Quand je crée des tables temporaires, je reçois un message d'erreur me disant que la table temporaire existe déjà. La table temporaire est unique à la session il semble donc ma connexion ne se ferme pas correctement et je pense qu'il peut avoir quelque chose à voir avec une déclaration de retour, j'ai dans ma déclaration à l'aide.

Je le code suivant:

using (IDbConnection connection = dbConnectionHandler.CreateConnection())
{
   connection.Open();
   CreateATempTable();
   PopulateTempTable();
   DataSet ds = CallStoredProcThatUsesTempTable();
   return ds;
}

J'utilise ce genre de code dans plusieurs endroits pour créer une table temporaire avec le même nom.

Malheureusement, je reçois l'erreur suivante: There is already an object named '#MyTempTable' in the database

.

Maintenant, je sais que la table temporaire est unique à la session et donc une fois que la session est fermée, il devrait disparaître.

Il y a trois choses que je crois pourrait provoquer ce ...

  1. Je dois appeler Connection.Close ()
  2. Je dois placer la déclaration de retour en dehors de ma déclaration en utilisant
  3. Je dois laisser tomber la table temporaire j'ai créé avant le retour

Quelqu'un sait-il que l'on est? ou si son quelque chose que je ne l'ai pas pensé?

Était-ce utile?

La solution

Je devine ici mais il faut vérifier vos paramètres de mise en commun de connexion de base de données. Essayez de mettre hors tension et la mise en commun si ça aide.

En général, lorsque vous fermez / disposer une connexion au niveau des bibliothèques .NET, la connexion au serveur de base de données réelle est pas fermée. Il est juste retourné à la piscine de connexion à l'intérieur fournisseur de données et sera réutilisé lorsque le programme demande une connexion avec les mêmes paramètres et les informations d'identification. Je ne pense pas que la session de base de données est remis à zéro en aucune manière avant d'être renvoyé à la piscine, à l'exception des transactions ouvertes et peut-être quelques paramètres de base. objets les plus chers, comme les tables temporaires, sont laissés seuls.

Vous pouvez activer la mise en commun de (très inefficace). Vous pouvez également vérifier l'existence de la table temporaire avant d'essayer de créer et supprimer son contenu si elle existe. Vous pouvez également déposer table temporaire avant fermeture de la connexion.

Autres conseils

Je suis assez sûr que connection.Dispose () (et donc Connection.Close () ainsi) seront appelés.

Vous pouvez vérifier que assez facilement en faisant 1) et 2) et vérifier que le problème existe toujours. La solution est probablement 3) et l'explication serait la mise en commun de connexion.

A moins d'un cycle de courant ou d'une autre Éliminez cas d'angle sérieusement bizarre est appelé.

Si vous voulez la preuve envelopper l'objet et mettre un point d'arrêt dans.

Un bloc à l'aide est traduit dans un try / catch / finally bloc sous le capot. Oui, il disposera indépendamment du retour dans le bloc à l'aide.

Non, Connection.Close sera toujours appelée parce interne avec il met dans un bloc try / finally.

Vous pouvez également envisager la mise en commun de connexion. Essayez d'envelopper votre code dans un TransactionScope.

Pour répondre à vos questions:

  1. L'instruction à l'aide sera implicitement fermer la connexion, lorsque la méthode Dispose est appelée. De la connexion
  2. Cela ne devrait pas être nécessaire: http://aspadvice.com/blogs/name/archive/2008/05/22/Return-Within-a-C_2300_-Using-Statement.aspx
  3. Essayez.

instruction à l'aide disposera l'objet si sa classe est IDisposable même il y a une déclaration de retour dans le bloc à l'aide.

Il est la mise en commun de connexion qui maintient votre #temptable, vous voudrez peut-être laisser tomber cette table manuellement.

Sans en savoir plus sur la bibliothèque de connexion de base de données en cours d'utilisation, je suppose qu'il est ni des deux premiers; using a été spécialement mise en place pour faciliter le nettoyage de telles ressources plus facile lors du retour de méthodes; il est directement analogue à un bloc de try...finally ordinaire en Java ou similaire.

En d'autres termes, le return laissera le bloc et la méthode Dispose sera appelée sur la connexion, ce qui devrait, en supposant une mise en œuvre saine de ce fait, appeler la méthode Close dans le cadre de ce processus.

Le point clé ici est "mise en œuvre saine d'esprit".

Il est causé par la mise en commun de connexion. Enveloppez ce que vous faites dans une transaction, et le rouler en arrière à la fin. Ou, laissez tomber la table temporaire après remplissage de la DS.

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