Comment fermer toutes les connexions à une base de données par programmation
Je veux fermer les connexions existantes à un Serveur SQL server afin que je puisse faire une restauration de la base de données. Je suis en utilisant entity framework. J'ai essayé de l'exécution de
alter database YourDb
set single_user with rollback immediate
mais puis-je obtenir une exception en disant que
De connexion n'a pas été fermé
Je ne peux pas comprendre pourquoi les connexions ne sont pas autorisés à fermer?
Cette image montre la totalité exception
c'est la méthode,
public void dbQueueryExctr(string queuery)
{
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;
using (SqlConnection connectionx = new SqlConnection(CONNECTIONSTRING))
{
connectionx.Open();
//connectionx.Open(); //Removed
cmd.CommandText = queuery;
cmd.CommandType = CommandType.Text;
cmd.Connection = connectionx;
reader = cmd.ExecuteReader();
connectionx.Close();
}
Edit:
J'ai enlevé la première .Open(). Maintenant, j'ai seulement Ouvert()
êtes-vous vous connecter à la base de données :-), je pense que vous auriez besoin pour vous connecter à la base de données de l'instance de sql server où la base de données vies à courir et la commande alter database. voir aussi stackoverflow.com/questions/7197574/...
pourquoi faites-vous appel à
Si vous êtes en utilisant Entity Framework, pourquoi êtes-vous à l'aide de
Maintenant que l'ouvrir n'est appelée qu'une fois, vous devriez obtenir une erreur différente. Je prendrais tous les ouverts de loin et de voir quelle est l'erreur que vous obtenez. Peu importe, le message d'erreur que vous envoyez à cette question n'est pas un problème avec la fermeture de la connexion, c'est un problème de l'exécution d'une requête. Si vous mettez
Pourriez-vous peut-être revenir le Modifier dans votre extrait de code? Puisque les gens (comme moi) pour un problème similaire à la leur, cela apporte de la confusion. Si je l'avais vu tout de suite que vous avez utilisé pour avoir 2 Open() déclarations, je pourrais avez sauté cette question. Vous n'avez pas à supprimer l'erreur de montrer à tous le correctif, la réponse indique que le correctif.
pourquoi faites-vous appel à
.Open()
deux fois?Si vous êtes en utilisant Entity Framework, pourquoi êtes-vous à l'aide de
SqlConnection
?Maintenant que l'ouvrir n'est appelée qu'une fois, vous devriez obtenir une erreur différente. Je prendrais tous les ouverts de loin et de voir quelle est l'erreur que vous obtenez. Peu importe, le message d'erreur que vous envoyez à cette question n'est pas un problème avec la fermeture de la connexion, c'est un problème de l'exécution d'une requête. Si vous mettez
SELECT * FROM TABLE_NAME
(où TABLE_NAME est une table dans votre base de données), vous obtenez le même problème. Démarrage simple et de le faire fonctionner, alors essayez d'ajouter de la complexité.Pourriez-vous peut-être revenir le Modifier dans votre extrait de code? Puisque les gens (comme moi) pour un problème similaire à la leur, cela apporte de la confusion. Si je l'avais vu tout de suite que vous avez utilisé pour avoir 2 Open() déclarations, je pourrais avez sauté cette question. Vous n'avez pas à supprimer l'erreur de montrer à tous le correctif, la réponse indique que le correctif.
OriginalL'auteur Sanke | 2015-05-07
Vous devez vous connecter pour publier un commentaire.
Vous obtenez cette erreur lors de l'appel
Open()
sur une connexion à deux reprises. Vous devriez faire tous les SqlConnection les objets que vous créez à l'intérieur deusing
bloque et ne les ouvrir une fois.Si vous êtes à la réutilisation des connexions "pour le rendre plus rapide" .NET ne fait que par défaut pour vous par le biais Le Regroupement De Connexion mais vous devez vous débarrasser de l'objet de connexion pour le faire fonctionner.
Vous ne désactivez pas le pool de connexion, votre erreur est de les deux appels Open() vous avait. Maintenant que vous vous êtes débarrassé de la deuxième Open() que vous êtes susceptible d'obtenir une erreur différente. Vous devez annuler votre changement et de poser une nouvelle question avec la nouvelle erreur que vous obtenez (Si vous obtenez la même erreur que vous avez un autre endroit dans votre programme où vous appeler Ouvert deux fois, consultez la trace de la pile.)
OriginalL'auteur Scott Chamberlain
Il semble que le Cadre de l'Entité conserve une connexion à la base de données. Vous pouvez le voir exécuter
sp_who2
dans SQL Server Management Studio où Entity Framework est répertorié comme EntityFrameworkMUE sous le Programme.Vous n'avez pas à utiliser "brut" des instructions sql pour déconnecter les connexions actives cependant, il peut être résolu de cette façon:
Si quelqu'un est à la recherche de l'espace de noms du Serveur: Microsoft.SqlServer.De la gestion.Smo
OriginalL'auteur Default
Vous devez disposer du lecteur, la commande et la connexion. Votre lecteur n'est pas disposé. Cet extrait de code, vous aurez la garantie que la connexion est fermée, même si il y a des exceptions générées pendant le processus de lecture.
Ce n'est pas à même de comprendre ce que l'OP est de demander. Oui, vous devriez le faire, mais si vous souhaitez restaurer une base de données ou d'y apporter des modifications qui nécessite d'être en mode hors connexion disposer de vos connexions ne résout pas le problème. C'est pas une réponse à cette question.
OriginalL'auteur Radin Gospodinov
L'erreur est assez clair...à l'aide de Linq de cette façon, vous ne pouvez pas fermer la connexion que vous êtes actuellement sur. Je n'ai pas essayé mais je pense que la suivante serait de travailler...essayez de créer une procédure stockée dans votre base de données et exécuter dans votre code C# en utilisant soit un TableAdapter ou SqlCommand(vous pouvez toujours utiliser Linq trop). Votre code ne sais pas vous êtes sur le point d'exécuter une procédure stockée qui est sur le point de tuer c'est la connexion, donc ça devrait marcher.
Maintenant, vous pouvez exécuter cette procédure stockée à partir du code et il va tuer les connexions ouvertes même votre propre. Profitez-en!
OriginalL'auteur waltmagic
Votre premier problème (maintenant que vous avez posté votre code) c'est que vous appelez ouvrir deux fois:
Suivant votre problème exigera de vous de réinitialiser la base de données à force de fermer toutes les connexions. Vous aurez à utiliser une chaîne de connexion pour se connecter à la MAÎTRISE de la base de données que vous essayez de fermer toutes les connexions.
Une fois que vous avez exécuté le SQL ci-dessus à partir de MASTER sur la base de données ayant besoin de réinitialiser vous devriez être bon pour faire tout ce que vous devez faire. Rappelez-vous, connectez-vous à maître!!!! Si vous vous connectez à la base de données que vous essayez de le réinitialiser en fin de compte vous de fermer toutes les connexions, y compris vous-même, ce qui ne fonctionnera pas!
Changer votre Catalogue de maître.
Exemple De Chaîne De Connexion (à partir de MSDN):
Également s'assurer de l'Utilisateur SQL que vous utilisez dispose de toutes les autorisations de maître. Pour ce faire, ouvrez management studio et en regardant les utilisateurs de la collection de sous-maître.
Plus de détail serait formidable... Si vous ouvrez SQL Mgmt Studio et exécuter exactement la même déclaration, n'est-il pas fermer toutes les connexions?
Vu que vous avez posté votre code. conn.Open (), puis dans le Connecticut.Open() est pourquoi vous le souffle. Correctif utiliser ma requête, ça marchera.
bien dans SQL Mgmt Studio, il ferme toutes les connexions. mais quand je l'execute avec c# il ne pas comme prévu.
Êtes-vous de la connexion à maître? Vous pouvez modifier votre catalogue de Maître et vous devez vous assurer de l'utilisateur de base de données que vous utilisez dispose des autorisations nécessaires pour se connecter à maîtriser. Si ces 2 choses sont réglées correctement, il travail, j'ai vérifié ce matin.
OriginalL'auteur VulgarBinary
Il est de bonne pratique de vérifier pour voir si la connexion est ouverte avant de tenter de l'ouvrir. Essayez d'ajouter une case avant d'essayer d'ouvrir votre connexion, quelque chose comme ceci:
Cela aidera à prévenir le problème que vous avez décrit.
OriginalL'auteur Tom Miller
Vous pouvez utiliser SqlConnection.ClearAllPools et SqlConnection.ClearPool fermer tous ou l'un de connexion .NET.
ClearPool efface le pool de connexion qui est associé à la connexion. Si des connexions supplémentaires associés à la connexion sont en cours d'utilisation au moment de l'appel, ils sont marqués de façon appropriée et sont ignorés (au lieu d'être retourné à la piscine) lorsque la fermeture est appelée sur eux.
ClearAllPools réinitialise (ou vide) le pool de connexions. Si il y a des connexions en cours d'utilisation au moment de l'appel, ils sont marqués de façon appropriée et sera jeté (au lieu d'être retourné à la piscine) lorsque la fermeture est appelée sur eux.
pour exemples:
Alors maintenant utiliser try/final blocs. et jeu essayez par les codes de connexion telles que ouvrir, exécuter, ajouter params, et etc. Et enfin le bloc situé à proximité de code pour s'assurer que la fermeture de la connexion déjà!
eh bien, je suis en utilisant entity framework.
OriginalL'auteur Behzad
Une fois que l'examen de cette façon, c'est ma couche d'accès aux Données des échantillons:
OriginalL'auteur Behzad