La base de données est utilisé par un autre processus ... mais ce processus?
J'ai écrit un très petit programme C#, qui utilise une très petite base de données SQL Server, purement pour certains d'apprentissage & des fins de test. La base de données est utilisé dans ce nouveau projet et nulle part ailleurs. Cependant, je reçois des problèmes pendant la course Débogue où le programme ne fonctionnera pas, car la base de données "est utilisé par un autre processus".
Si je redémarre ma machine, il fonctionnera de nouveau, et puis, après quelques essais je vais avoir le même problème à nouveau.
J'ai trouvé beaucoup, beaucoup de problèmes similaires signalés partout sur l'Internet, mais ne trouve pas de réponse définitive quant à la façon de résoudre ce problème. Tout d'abord, comment puis-je savoir ce que "d'autres processus" est à l'aide de mon .mdf & .fichiers ldf ? Alors, comment puis-je obtenir ces fichiers mis à disposition & qui ne sont pas détenus dans le but d'arrêter ce qui se passe fois après le temps ?!?
Je suis nouveau sur VS2010, SQL Server & C#, donc s'il vous plaît être très descriptif, les réponses que vous me donnez !!!
C'est mon code, comme vous pouvez le voir, vous ne pouviez pas obtenir quoi que ce soit beaucoup plus basique, certes, je ne devrais pas être en cours d'exécution en tant de problèmes !!!
namespace MySqlTest
{
public partial class Form1 : Form
{
SqlConnection myDB = new SqlConnection(@"Data Source=MEDESKTOP;AttachDbFilename=|DataDirectory|\SqlTestDB.mdf;Initial Catalog=MySqlDB;Integrated Security=True");
SqlDataAdapter myDA = new SqlDataAdapter();
SqlCommand mySqlCmd = new SqlCommand();
string mySQLcmd;
int myCount;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("myDB state = " + myDB.State.ToString());
//Open SQL File
myDB.Open();
MessageBox.Show("myDB state = " + myDB.State.ToString());
}
private void button2_Click(object sender, EventArgs e)
{
myCount++;
MessageBox.Show("myCount = " + myCount.ToString());
//Insert Record Into SQL File
mySqlCmd.Connection = myDB;
mySqlCmd.CommandText = "INSERT INTO Parent(ParentName) Values(myCount)";
myDA = new SqlDataAdapter(mySqlCmd);
mySqlCmd.ExecuteNonQuery();
}
private void button3_Click(object sender, EventArgs e)
{
//Read Record From SQL File
}
private void button4_Click(object sender, EventArgs e)
{
//Read All Records From SQL File
}
private void button5_Click(object sender, EventArgs e)
{
//Delete Record From DQL File
}
private void button6_Click(object sender, EventArgs e)
{
MessageBox.Show("myDB state = " + myDB.State.ToString());
//Close SQL File
myDB.Close();
MessageBox.Show("myDB state = " + myDB.State.ToString());
}
private void button7_Click(object sender, EventArgs e)
{
//Quit
this.Close();
}
}
}
Quand j'ai d'abord exécuter le programme, il fonctionne très bien, et continue à travailler, mais je suis de débogage et d'arrêter le programme sans logiquement compléter parfois. Il ne semble pas être un point régulier à qui cela commence à se produire, mais peut-être que c'est lié à mon arrêt du debug sans la fermeture de la DB. Serait VS2010 pas à gérer que si ?!?
OriginalL'auteur Gary Heath | 2012-02-08
Vous devez vous connecter pour publier un commentaire.
Les options les plus probables:
Vous pouvez vérifier 1) avec le gestionnaire de tâches et 2) par la recherche dans l'Explorateur de serveurs. Votre base de données devrait montrer une petite croix rouge qui signifie "fermée".
Et que vous devez réécrire votre code de fermer les connexions les plus brefs délais. Utiliser try/finally ou
using(){ }
blocs.OriginalL'auteur Henk Holterman
C'est le nouveau code, à l'aide de la "à l'Aide de" des déclarations. Lorsque j'exécute le programme et cliquez sur Insérer un Enregistrement Dans le Fichier SQL, c'est parti, termine le processus avec myCount = 1 (si je ne suis pas sûr à 100% qu'il est en train de faire une Écriture physique, suis-je raté une commande qui fait "s'engage" la mise à jour ?!?) et s'affiche à nouveau le Formulaire.
Si je puis cliquez sur Insérer un Enregistrement Dans le Fichier SQL de nouveau, j'obtiens une erreur comme suit :
C'est le programme (je suis le seul utilisateur de ce PC et disposer des droits d'Administrateur, "l'État" de la base de données à ce stade est, selon les Propriétés, Fermé, il ressemble à la première passe dans le code fait comme prévu ...
Je ne comprends pas pourquoi je suis tout à coup perdre l'accès à mon propre fichier que j'utilise déjà ?!?
OriginalL'auteur Gary Heath
essayez d'exécuter sp_who2 pour voir la liste des processus.
Pour info: vous n'avez pas besoin de redémarrer votre machine, dans le pire des cas, redémarrer le service SQL Server
ok, laissez-nous savoir 🙂
OK, VS2010 ne me laisse pas ouvrir une nouvelle requête, il a dit "Impossible d'ouvrir le fichier physique ..... Erreur du système d'exploitation 32: "32(pas réussi à récupérer le texte de cette erreur. Raison:15105). Une tentative d'attacher une base de données nommée automatique de fichier ..... a échoué. Une base de données avec le même nom existe, ou le fichier spécifié ne peut pas être ouvert, ou il est situé sur un partage UNC.", alors, j'ai couru sp_who2 dans SQL Server Management Studio et a obtenu 31 résultats, seule la partie 2 de qui semblent pertinents à cette base de données, c'est à dire qu'ils ont MySqlDB dans la colonne DBName.
Les deux lignes de dire que le Nom du Programme est "Microsoft SQL Server Management Studio - Requête, puis la première ligne indique l'État = PRATICABLE, Command = SÉLECTIONNEZ DANS, Temps CPU = 125 & DiskIO = 20, alors que la deuxième ligne indique le Statut = Sommeil, Command = en ATTENTE de COMMANDE, Temps CPU = 0 & DiskIO = 0 ... donc il n'y a aucune mention de Visual Studio en utilisant le fichier(s) !!!
Si j'essaie de prendre de la DB en mode hors connexion, j'obtiens une erreur comme suit: "Définie en mode hors connexion a échoué pour la Base de données 'MySqlDB'. Une exception s'est produite lors de l'exécution d'une instruction Transact-SQL ou par lot. MODIFIER la BASE de données a échoué en raison d'un verrou qui ne peut être placé sur la base de données 'MySqlDB'. Essayez de nouveau plus tard. MODIFIER instruction de BASE de données a échoué. (Microsoft SQL Server, message d'Erreur: 5061)" ... mais, si je lance le sp-who2 encore une fois, le "Statut = Sommeil, Command = en ATTENTE de COMMANDE" ligne de requête est parti, mais le "Statut = PRATICABLE, Command = SÉLECTIONNEZ DANS" la ligne est toujours là (je n'ai aucune idée si tout cela est important !)
OriginalL'auteur Diego
IIRC à l'aide de
AttachDbFilename
lance uneSqlServr.exe
processus qui s'exécute sous le compte d'utilisateur de votre processus, distinct de l'instance de sql server exécute en tant que service (afin d'arrêter le service MsSqlServer ne s'arrête pas à cette question). Dans le cas d'une sale de sortie, parfois, ce processus n'est pas nettoyé. Je soupçonne que le meurtre de ce processus permettra de libérer les fichiers db.J'ai dû aller dans les Services & trouver MSSQLSERVER, modifier l'option de Démarrage sur Manuel, puis physiquement Arrêter ... que, et seulement alors, étais-je capable de supprimer les fichiers dans le dossier bin\debug !!! J'ai modifié l'option de Démarrage Automatique & commencé le Service, et à la fin, c'est tout fonctionne à nouveau !!! Maintenant, je dois savoir pourquoi cela se produit et pour éviter que cela se reproduise ...
OriginalL'auteur spender
Essayez d'utiliser Process Explorer écrit par Mark Russinovich, une Technique boursière de Microsoft. C'est un standard suisse de l'armée de l'outil dans la poche de Windows Administrateurs/Développeurs. Il peut vous montrer quels sont les processus en tenant les poignées sur les ressources du système.
Une fois que vous avez Process Explorer est installé, essayez les solutions suivantes:
Résultats de la recherche devraient afficher un processus ou un service de la poignée d'une des ressources encore détenus par un mal-arrêt de processus.
J'ai dû aller dans les Services & trouver MSSQLSERVER, modifier l'option de Démarrage sur Manuel, puis physiquement Arrêter ... que, et seulement alors, étais-je capable de supprimer les fichiers dans le dossier bin\debug !!! J'ai modifié l'option de Démarrage Automatique & commencé le Service, et à la fin, c'est tout fonctionne à nouveau !!! Maintenant, je dois savoir pourquoi cela se produit et pour éviter que cela se reproduise ...
OriginalL'auteur GrantJ
De travail avec VS 2010 et Entité Cadres à l'aide de SQL Server j'ai couru dans cette plus de quelques fois. Dans mon cas, c'est arrivé quand j'ai essayé d'exécuter le programme et j'ai eu une requête ouvrir dans l'Explorateur de serveurs. Une fois qu'il échoue, j'ai dû abandonner toutes les connexions pour le faire fonctionner à nouveau.
VS2010 des copies de la base de données source (un
.MDF
et.LDF
fichier) que vous travaillez dans l'Explorateur de serveurs pour les projets de dossier de débogage. C'est la copie de travail au moment de l'exécution. Lorsque ce fichier est copié est contrôlée par le MDF propriétéCopy to Output Directory
par défaut, elle est définie àCopy always
. Cela signifie qu'il va essayer de le copier le fichier sur une nouvelle construction ou d'exécuter et si vous l'avez ouvert, ailleurs, il échoue et puis elle est accrochée.La façon de voir la connexion est d'ouvrir le SQL Server Management Console. Par défaut VS2010 est à l'aide d'un utilisateur instance de SQL Server comme spécifié dans la chaîne de connexion. Dans le cas de l'Entité Cadres c'est dans l'Application.Config XML.
L'instance d'utilisateur est séparé de copie de mémoire de SQL Server qui a tous les droits d'utilisateur attribué à l'utilisateur connecté. Pour y accéder, vous devez trouver la bonne connexion.
L'exécution de cette requête à partir de la principale instance de SQL montrera tous de l'Instance Utilisateur connexions.
Ce sera le retour de quelque chose qui ressemble à ceci:
Si vous copiez le nom de l'instance et de l'utiliser comme nom de serveur dans une nouvelle connexion, exécute en tant qu'utilisateur associé avec lui, vous pourrez voir vos données à partir du dossier de débogage.
Maintenant, si vous faites un clic droit sur la base de données et sélectionnez
Tasks >
Detach...
Vous ouvrez uneDetach Database
boîte de dialogue vérifier l'Drop Connections
case à cocher à côté de la base de données nom de fichier et cliquez surOK
.La base de données sera supprimé de la liste et vous devriez être en mesure de construire et d'exécuter l'application.
OriginalL'auteur Rich Shealer
J'ai trouvé cette solution: http://oreilly.com/catalog/errata.csp?isbn=0636920022220
Cliquez-droit sur la base de données dans VS de l'explorateur de base de données et cliquez sur fermer la connexion entre les sessions de débogage et il a travaillé pour moi.
OriginalL'auteur RT.
La chose la plus simple est d'aller dans l'Explorateur de serveurs. Choisissez la base de données du problème. Cliquez-droit et choisissez "lien Étroit".
Si elle est déjà fermée, se connecter et se déconnecter.
OriginalL'auteur Rap
Je pense qu'il y a déjà SqlTestDB.mdf est attaché.
J'ai été confronté à ce problème avant, il suffit d'aller à Ms Sql server et détacher la base de données, puis de la reconstruction de votre connexion au Serveur de l'Explorateur dans Visual Studio.
OriginalL'auteur Bahaa Salaheldin
Vous ouvrent les dbase au début et pas de certitude qu'il est publié une fois terminé. Vraiment vous êtes en attente pour le gestionnaire de mémoire pour faire le tri, il dépend de la disponibilité du système est: à quand le fichier peut être libéré.
Je pense que vous avez besoin de modifier ce paramètre à "Ouvrir quand il le faut".
J'ai par exemple mis le code pour accéder à une base de données dans sa propre classe, une fois que les mesures ont été achevées, je le libère.
D'ouverture et de fermeture n'ont dessus, mais j'ai trouvé que je peux vivre avec elle en faisant ce qui suit,
Ont plus d'un point d'entrée dans votre classe, un pour les transactions simples, et un autre pour de multiples opérations. Par exemple
Je trouve que dans la plupart des applications, il peut être statique, parce qu'ils en eux-mêmes ne stockent pas de données ils ne passent à travers et à partir de la base de données. Il ne perd que c'est statique si je veux me cache quelque chose pour mon application.
- Je utiliser "à l'aide" dans la S_SingleTransaction() car il nettoie pour moi. Mais je laisse les Multiples point d'entrée de l'ouvrir et de la fermer quand mon appel de la fonction se termine. Je n'ai jamais eu ce problème de verrouillage avec une seule mdf et une application. Il serait revenir en jeu avec un mdf et de multiples applications, dans ces cas, vous avez besoin de faire usage de la MSSQL comme un service dbase au lieu de cela, vous trouverez qu'il est tout aussi facile à installer dans votre Visual Studio, puis dans d'autres applications que vous avez déjà la base de données sur la liste dans votre barre d'outils.
OriginalL'auteur Bob