none
(Visual Studio 2008 – SQL SERVER 2005 EXPRESS) Synchronisation du chemin de la base RRS feed

  • Question

  • Bonjour,

    Quand j'utilisais une base ACCESS, j'avais le chemin ainsi :

    My.Application.Info.DirectoryPath & "\NomBase"

    Ainsi, quand je faisais un "copier/coller" sous Windows pour sauvegarder mon projet, le chemin correct de la base était assuré

    Maintenant, j'ai une base SQL SERVER, et le string de connexion est dans les "Paramètres" de "MyProject"

    Si jamais j'ouvre cette copie, je serais connecté à une "mauvaise" base …

    J'ai essayé d'entrer une variable dans la définition du mot clef connectionString mais je n'ai pas trouvé la bonne synthaxe, et ni suis pas arrivé

    Existe-t-il un moyen pour avoir un lien correct ?


    Cordialement Sauveur CONSALVI

    mercredi 19 décembre 2012 10:57

Réponses

  • Cela dit quoi si vous ouvrez la connexion ? Je pense que le remplacement pourrait être fait par la classe SqlConnection lorsqu'elle utilise la valeur plus qu'à la lecture depuis le fichier de config.

    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    jeudi 20 décembre 2012 09:44
    Modérateur

Toutes les réponses

  • Bonjour,

    Voir par exemple http://msdn.microsoft.com/fr-fr/library/cc716756.aspx et chercher |DataDirectory|. On peut donc inclure cette notation dans la chaine de connexion, la valeur peut-être définie par AppDomain.SetData("DataDirectory", objValue) comme indiquée dans la doc et elle sera donc automatiquement remplacée par la valeur objValue.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 19 décembre 2012 11:49
    Modérateur
  • Bonsoir,

    Votre réponse est pertinente et doit corresponde à mon besoin. Mais …

    Je sais remplacer dans app.config

    connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=E:\MesDocumentsD\VisualBasic\VB2008\ProjetsTestEssai\Sql_Essais\Sql_Essais\bin\Debug\Fic\dbTest_Sql.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" />

    Par :

    connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\dbTest_Sql.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True" />

    Mais COMMENT et OU mettre le <tt>AppDomain.SetData("DataDirectory", objValue) ?</tt>

    J'essaye, dans un module du projet, pour la connexion de la base :

    (Trouvé dans http://msdn.microsoft.com/fr-fr/library/vstudio/37z40s1c(v=vs.90).aspx)

    Dim instance As AppDomain

    Dim name As String = "DataDirectory"

    Dim data As Object = My.Application.Info.DirectoryPath & "\Fic\"

    instance.SetData(name, data)

    Seulement, à l'exécution, j'ai l'erreur : (Sur instance.SetData(name, data))

    La référence d'objet n'est pas définie à une instance d'un objet.

    Quelle est la (bonne) syntaxe à utiliser ?


    Cordialement Sauveur CONSALVI

    mercredi 19 décembre 2012 15:10
  • Ah oui. Ce serait donc plus exactement AppDomain.CurrentDomain.SetData(name,data) pour faire la manip sur le domaine courant de l'application (votre code déclare une variable et essaie de l'utiliser alors qu'elle est encore à Nothing d'où le "la référence d'objet n'est pas définie à une instance d'un objet").

    Cela dépend un peu de votre archi. A priori il doit suffire de le mettre avant que la chaine de connexion ne soit lue (par exemple http://msdn.microsoft.com/fr-fr/library/vstudio/tzdks800.aspx et voir "Afficher les événements de l'application" et le mettre dans Startup ce qui la le mets vraiment au plus tôt) ou si votre code contient une seule fonction de création de la connexion à la base dans cette fonction par exemple.

    A chaque fois que je vois une question sur le sujet, je me dis qu'il faudra que je teste si ce principe de "placeholder" fonctionne aussi avec d'autres valeurs définies par nous-même voire avec d'autres choses que les chaines de connexion...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 19 décembre 2012 15:40
    Modérateur
  • Bonsoir,

    J'ai certainement du mal  m'exprimer …Ou je n'ai rien compris

    (Ou les deux aussi … !)

    A ce niveau, la chaine de connexion n'est pas encore lue

    C'est l'affectation instance.SetData(name, data) qui se plante

    Pourtant INSTANCE, NAME et DATA sont définis

    Donc, quand on arrive sur cette instruction, rien ne doit être à NULL

    Pourtant, vous avez certainement raison, car dans l'analyse de syntaxe, au niveau de instance.SetData(name, data)  j'ai un avertissement sur instance souligné en vert:

    Avertissement            La variable 'instance' est utilisée avant qu'une valeur ne lui ait été assignée. Une exception de référence null peut se produire au moment de l'exécution.

    Certes, mais si c'est cela, comment faire ?

    Je suis bien obligé de faire la déclaration de instance avant de faire son assignation ?

    Bon, je vais continuer de chercher. A demain

    Pour rappel, les instructions

    1 Dim instance As AppDomain

    2 Dim name As String = "DataDirectory"

    3 Dim data As Object = My.Application.Info.DirectoryPath & "\Fic\"

    4 instance.SetData(name, data)


    Cordialement Sauveur CONSALVI

    mercredi 19 décembre 2012 17:10
  • Donc la ligne de code serait AppDomain.CurrentDomain.SetData(name,data)  au lieu de instance.SetData(name,data) (instance est toujours Nothing) :

            Const DataDirectory As String = "DataDirectory"
            Dim Dossier As String = "Mon dossier"
            Dim instance As AppDomain
            MsgBox("Instance n'est pas initialisé : " & IsNothing(instance))
            AppDomain.CurrentDomain.SetData(DataDirectory, Dossier)
            ' ou alors
            instance = AppDomain.CurrentDomain
            instance.SetData(DataDirectory, Dossier)
    Dans votre code instance ou ci dessus "instance" est déclaré mais d'abord "vide" (Nothing). Comme toujours il faut intialiser cet objet vide avant de pouvoir l'utiliser (donc dans le code ci-dessus en lui affectant AppDomain.CurrentDomain).

    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".




    mercredi 19 décembre 2012 17:37
    Modérateur
  • Bonjour,

    Peut-être que je ne sais pas définir le domaine DATADIRECTORY ?

    Voici le code

        Partial Friend Class MyApplication
            Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
                Dim instance As AppDomain
                instance = AppDomain.CurrentDomain
                instance.SetData("DataDirectory", MaBase)
                Dim toto As String = My.Settings.bdTest_SqlConnectionString
            End Sub
        End Class

    J'ai mis un point d'arrêt sur TOTO

    MABASE a la bonne valeur

    TOTO récupère bien la chaine de connexion, mais |DATADIRECTORY| n'a pas été remplacé par la valeur de MABASE


    Cordialement Sauveur CONSALVI

    jeudi 20 décembre 2012 08:02
  • Cela dit quoi si vous ouvrez la connexion ? Je pense que le remplacement pourrait être fait par la classe SqlConnection lorsqu'elle utilise la valeur plus qu'à la lecture depuis le fichier de config.

    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    jeudi 20 décembre 2012 09:44
    Modérateur
  • Bonsoir,

    Bravo ! Effectivement, le remplacement ne se fait qu'a la connexion

    Voici les codes

    1 - La création de DATADIRECTORY (Je modifie pour signaler qu'on ne peut mettre le chemin + le nom de la base)

    Partial Friend Class MyApplication
            Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
                Dim instance As AppDomain
                instance = AppDomain.CurrentDomain
                instance.SetData("DataDirectory", My.Application.Info.DirectoryPath & "\Fic")
            End Sub
        End Class

    2 - La déclaration dans app.config   (Je modifie pour signaler qu'il faut entrer le nom de la base ainsi : |DataDirectory|\NomBase On ne peut l'inclure dans l'initialisation de "DataDirectory",)

    connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\dbTest_Sql.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

    3 - La reprise, qui est automatique (Du moins si on l'ouvre) dans les paramètres, chaine de connexion

    Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\dbTest_Sql.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True

    4 - L'ouverture de la base (La procédure)

    Public SqlConx As New SqlConnection
    
    Public Sub ConnectionBase()
            Try
                SqlConx = New SqlConnection(My.Settings.bdTest_SqlConnectionString)
                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

    C'est bien ce que je cherchais, n'avoir à ne définir qu'en un seul endroit la base est son chemin

    Et pour aller plus loin ! Ne peut-on faire de même dans le fichier app.config ?

    L'avantage est que le chemin de la base et le nom de la base seraient  des constantes dans un module, là où se trouve la procédure d'ouverture de la base

    Pour la maintenance des programmes, c'est mieux ….

    Encore merci



    Cordialement Sauveur CONSALVI


    jeudi 20 décembre 2012 14:26