Meilleur auteur de réponses
(Visual Studio 2008) Fermer correctement une base de données MDF

Question
-
Bonjour,
Voici le code d'ouverture de la base
Public MaBase As String = My.Application.Info.DirectoryPath & "\Fic\" & NomBase Dim strcon As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=" & MaBase & ";Integrated Security=True;User Instance=True" Public wNbrENRG As Integer ' Nombre enregistrements ou ligne trouvé Public wIndERR As Integer ' Indice pour faire une boucle sur type des erreurs Public sqlRequete As String ' Pour les SELECT Public SqlDR As SqlDataReader Public SqlConx As New SqlConnection(strcon) 'Public SqlConx As New SqlConnection(My.Settings.commandeConnectionString) ' Paramètre de l'aplication Public SqlCmd As SqlCommand Public wDataSet As New DataSet Public wSqlDatAda As SqlDataAdapter Public Sqltrans As SqlTransaction Public Sub ConnectionBase() Try If SqlConx.State = ConnectionState.Closed Then SqlConx.Open() End If Catch ex As SqlException For wModBaseDonne.wIndERR = 0 To ex.Errors.Count - 1 MsgErreur = "ConnectionBase - Index #" & wModBaseDonne.wIndERR.ToString() & ControlChars.NewLine _ & "Message: " & ex.Errors(wModBaseDonne.wIndERR).Message & ControlChars.NewLine _ & "LineNumber: " & ex.Errors(wModBaseDonne.wIndERR).LineNumber & ControlChars.NewLine _ & "Source: " & ex.Errors(wModBaseDonne.wIndERR).Source & ControlChars.NewLine _ & "Procedure: " & ex.Errors(wModBaseDonne.wIndERR).Procedure & ControlChars.NewLine MessageBox.Show(MsgErreur) Next wModBaseDonne.wIndERR wOk = False Catch ex As Exception MsgBox("ConnectionBase " & ex.Message) wOk = False End Try End Sub
Et son code fermeture
Public Sub Fermeture() Try If Not SqlDR Is Nothing Then SqlDR.Close() SqlDR = Nothing End If If Not SqlCmd Is Nothing Then 'SqlCmd.Dispose() SqlCmd = Nothing End If If Not wDataSet Is Nothing Then 'wDataSet.Dispose() wDataSet = Nothing End If If Not wSqlDatAda Is Nothing Then 'wSqlDatAda.Dispose() wSqlDatAda = Nothing End If If Not SqlConx Is Nothing Then If SqlConx.State = ConnectionState.Open Then SqlConx.Close() 'possibilité de vérifier l'état de connexion pour rendre + robuste 'SqlConx.Dispose() 'SqlConx = Nothing End If End If SqlConnection.ClearPool(SqlConx) GC.Collect() Catch ex As SqlException For wModBaseDonne.wIndERR = 0 To ex.Errors.Count - 1 MsgErreur = "Fermeture - Index #" & wModBaseDonne.wIndERR.ToString() & ControlChars.NewLine _ & "Message: " & ex.Errors(wModBaseDonne.wIndERR).Message & ControlChars.NewLine _ & "LineNumber: " & ex.Errors(wModBaseDonne.wIndERR).LineNumber & ControlChars.NewLine _ & "Source: " & ex.Errors(wModBaseDonne.wIndERR).Source & ControlChars.NewLine _ & "Procedure: " & ex.Errors(wModBaseDonne.wIndERR).Procedure & ControlChars.NewLine MessageBox.Show(MsgErreur) Next wModBaseDonne.wIndERR wOk = False Catch ex As Exception MsgBox("Fermeture " & ex.Message) wOk = False End Try End Sub
Je lance la fermeture et veux copier la base
J'ai l'erreur
Comment faire pour fermer correctement ?
Cordialement Sauveur CONSALVI
Réponses
-
Bonsoir,
Merci de vous êtes intéressé à ce problème
J'ai réussi à détacher cette base !
Je suis persuadé que cela vient du fait que ne pouvant détacher la base de mon projet, j'ai détaché les autres, celles de projet abandonnés, dont les bases étaient listées dans sys.databases
Maintenant, je peux détacher ma base sans problème, et le fait d'établir une connexion la rattache
Et la copie de cette base se fait sans incident
Je vais essayer d'exécuter BACKUP et RESTORE en place de cette copie
Je n'ai pas réussi à faire une connexion sur MASTER, et je n'ai pas Microsoft Sql Server Management
Cordialement Sauveur CONSALVI
- Marqué comme réponse Sauveur Consalvi mercredi 28 novembre 2012 17:16
Toutes les réponses
-
Bonjour
Ce que vous voulez ici c’est le fonctionnement normal.
Quand vous ouvrez une connexion vers une BD en effet vous êtes connectée au serveur SQL qui utilise (attache) le fichier MDF.
Quand vous fermez la connexion, vous arrêtez la communication entre votre application et le serveur, mais le serveur continue à utiliser le fichier MDF (n’est pas détache tout de suite, par default le fichier est détachée après 1 heure après la dernière connexion est fermée).
Vous devez arrêter le service SQL Express ou utiliser SSEUtil (détachez la BD ):
http://www.microsoft.com/en-us/download/details.aspx?id=3990
Cordialement,
-
Bonjour,
Merci pour votre proposition
J'ai bien installé SSEUtil.exe mais je n'arrive pas à l'exécuter correctement
Je suis sous Windows 7 Edition Intégrale. Et même en changeant les paramètres de compatibilité, il ne se lance pas
Cordialement Sauveur CONSALVI
-
Pouvez-vous nous donner exactement le message d’erreur ?
Aussi, une autre solution qui peut-être vous convient mieux c’est ici :
http://msdn.microsoft.com/fr-fr/library/ms188031.aspx
Cordialement,
-
-
J'ai bien vu le message d'erreur.
Détacher = Libérer le fichier.
La solution c'est de détacher la BD soit en utilisant SSEUtil.exe ou sp_detach_db.
Donc on a besoin d’exécuter correctement soit SSEUtil.exe soit sp_detach_db.
Cordialement,
- Modifié Aurel Bera lundi 26 novembre 2012 10:55
-
Bonjour
Je reviens pour plus de détails.
Vous êtes dans une situation de développement, donc vous utilisez SQL Server Express.
Si le serveur est un serveur SQL dédiée on a des autres mécanismes pour copier les informations d’une BD comme réplication, etc .
Dans cette situation vous n’avez pas besoin de détacher le fichier MDF, parce-que le serveur fait sa gestion du fichier.
Cordialement
-
-
Je ne m'en sors pas …
Pour la Réplication, je n'ai pas l'onglet REPLICATION dans l'explorateur de serveur
Et tous les codes de la fonction SP_DETACH_DB que je trouve donnent des erreurs !
Où puis-je trouver un exemple de code qui marche, afin que je puisse le mettre dans une procédure stockée ?
MerciCordialement Sauveur CONSALVI
-
Pouvez-vous nous indiquer la procédure stockée que vous avez créée et le message d’erreur?
Cordialement,
-
Dans certains cas on a besoin d’accès an mode SINGLE USER.
USE master;
ALTER DATABASE BASE DE DONEES
SET SINGLE_USER;
GO
-
La raison pour laquelle vous n’avez Réplication dans l’Explorateur de Serveur c’est d’habitude que l’utilisateur n’a pas droits suffisantes.
Cordialement,
-
Bonsoir,
1 - Pour ALTER DATABASE, j'ai un message d'erreur sur la syntaxe ! Je ne vois pas ...
sqlRequete = "ALTER DATABASE 'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\Sql_Essais\Sql_Essais\BIN\DEBUG\Fic\bdTEST_SQL.MDF' SET SINGLE_USER;" SqlCmd = New SqlCommand(sqlRequete, SqlConx, Sqltrans) SqlCmd.ExecuteNonQuery()
Syntaxe incorrecte vers
'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\Sql_Essais\Sql_Essais\BIN\DEBUG\Fic\bdTEST_SQL.MDF'.
LineNumber: 1 Source: .Net SqlClient Data Provider Procedure:2 – Je suis le seul utilisateur déclaré sur mon poste, avec les droits d''administrateur
Exécuter sp_detach_db !
Je tourne en rond … C'est épuisant !
Première difficulté, il a fallu que je trouve le nom "exact" de la base
J'ai réussi à obtenir les informations dans sys.databases
Le SP_DETACH_DB ne donne plus d'erreur de syntaxesqlRequete = "Use master; EXEC sp_detach_db 'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\Sql_Essais\Sql_Essais\BIN\DEBUG\Fic\bdTEST_SQL.MDF', TRUE" SqlCmd = New SqlCommand(sqlRequete, SqlConx, Sqltrans) SqlCmd.ExecuteNonQuery()
Mais j'ai le message d'erreur disant que la base est en cours d'utilisation !!!
Message: Impossible de détacher la base de données
'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\SQL_ESSAIS\SQL_ESSAIS\BIN\DEBUG\FIC\BDTEST_SQL.MDF'
car elle est en cours d'utilisation. LineNumber: 1 Source: .Net SqlClient Data
Provider Procedure:Si je ferme la connexion, je ne peux plus lancer le SP_DETACH_DB !!!
Comment faire ? J'ai beau parcourir le NET, je ne trouve pas d'exempleCordialement Sauveur CONSALVI
-
Bonjour,
J'ai mis le DETACH dans une procédure stockée
Je n'ai pas lancé mon projet, mais j'ai utilisé l'option "Exécuter une procédure Pas à pas détaillé" , dans le panneau "Explorateur de serveur"
J'ai l'erreur :
[dbo].[StoredProcDetach] en cours d'exécution.
Impossible de détacher la base de données 'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\SQL_ESSAIS\SQL_ESSAIS\BIN\DEBUG\FIC\BDTEST_SQL.MDF' car elle est en cours d'utilisation.
Aucune ligne n'est affectée.
(0 ligne(s) retournée(s)
@RETURN_VALUE = 0
Exécution de [dbo].[StoredProcDetach] terminée.
Donc, même quand la connexion n'est pas ouverte, je ne peux détacher cette base !
Mais alors, comment faire ???
Cordialement Sauveur CONSALVI
- Modifié Sauveur Consalvi mercredi 28 novembre 2012 07:17
-
Bonjour
Vous devez utiliser une connexion vers la BD « master » et créer et exécuter la procédure sur « master » toujours.
Cordialement,
-
Aussi essayez d’utiliser sp_detach_db avec le nom de la BD et pas avec le chemin.
-
Bonsoir,
Si j'écris :EXEC sp_detach_db N'bdTEST_SQL.MDF'
J'ai l'erreur :
[dbo].[StoredProcDetach] en cours d'exécution.
La base de données 'bdTEST_SQL.MDF' n'existe pas. Fournissez un nom de base de données valide. Pour obtenir la liste des bases de données disponibles, faites appel à sys.databases.
Aucune ligne n'est affectée.
(0 ligne(s) retournée(s)
@RETURN_VALUE = 0
Exécution de [dbo].[StoredProcDetach] terminée.C'est en exécutant SYS DATABASES que j'ai trouvé le nom complet
Cordialement Sauveur CONSALVI
-
essayez
eXEC sp_detach_db N'bdTEST_SQL'
- Modifié Aurel Bera mercredi 28 novembre 2012 14:31
-
-
-
Si vous ouvrez une connexion vers DB vous ne pouvez pas la détacher en
utilisant la même connexion.Essayez de ouvrir une nouvelle connexion vers la DB master (même en
utilisant une nouvelle connexion string) et exécutez la procédure crée sur
MASTER.Ou essayez de modifier la BD comme dans l’image:
- Modifié Aurel Bera mercredi 28 novembre 2012 14:49
-
Bonsoir,
Merci de vous êtes intéressé à ce problème
J'ai réussi à détacher cette base !
Je suis persuadé que cela vient du fait que ne pouvant détacher la base de mon projet, j'ai détaché les autres, celles de projet abandonnés, dont les bases étaient listées dans sys.databases
Maintenant, je peux détacher ma base sans problème, et le fait d'établir une connexion la rattache
Et la copie de cette base se fait sans incident
Je vais essayer d'exécuter BACKUP et RESTORE en place de cette copie
Je n'ai pas réussi à faire une connexion sur MASTER, et je n'ai pas Microsoft Sql Server Management
Cordialement Sauveur CONSALVI
- Marqué comme réponse Sauveur Consalvi mercredi 28 novembre 2012 17:16