none
VB express 2010 - Manip donnée .MDB inclu dans le projet RRS feed

  • Question

  • Bonjour (ou bonsoir)

    J'ai un projet avec une base inclue dans le projet (d'où le «|DataDirectory|» dans le chemin de la source de la connexion).
    Je m'y connecte avec ce code ci :

    «
    Imports System.Data
    Imports System.Data.OleDb

    Module Mdl_Divers
         '(...)
        Public G_dbCN As New System.Data.OleDb.OleDbConnection()

        Public Sub sb_dbConnection()
            'procédure de connection à la base Medicat
            Try
                G_dbCN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=|DataDirectory|\Medicat.mdb"
                G_dbCN.Open()
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à Medicat.mdb." & ex.Message)
            End Try
        End Sub
    »

    Je mets à jour les données comme cela :

    «
        Sub EnregistreMed()
            Dim dbCmd As OleDbCommand
            Dim sSql As String, I As Integer, sTxt As String, V As Single
            dbCmd = New OleDbCommand
            Call sb_dbConnection()
            dbCmd.Connection = G_dbCN
            'Call VirgulesEnPoints()
            'sql 001 update medicament
            sSql = "UPDATE Tbl_Medicaments SET" _
                & " Tbl_Medicaments.Med_Nom = '" & Me.Txt_Nom.Text & "'" _
                & ", Tbl_Medicaments.Med_Echelle = " & Me.Txt_Echelle.Text _
                & ", Tbl_Medicaments.Med_Posologie = " & Me.Txt_Posologie.Text _
                & ", Tbl_Medicaments.Med_Unite = '" & Me.Txt_Unite.Text & "'" _
                & ", Tbl_Medicaments.Med_Pic_Serique = '" & Me.Txt_Pic_Serique.Text & "'" _
                & ", Tbl_Medicaments.Med_Demi_vie = '" & Me.Txt_Demi_Vie.Text & "'" _
                & ", Tbl_Medicaments.Med_Alarme = " & Me.Bl_Alarme.Checked _
                & " WHERE Tbl_Medicaments.Med_Id=" & G_Med_Id _
                & ";"
            dbCmd.CommandText = sSql
            dbCmd.ExecuteNonQuery()
    '(...)
    »

    Cela semble fonctionner (les données modifiées sont visibles dans la session) sauf que ces données ne sont pas physiquement enregistrées :-(

    Merci,

    Blaise


    • Modifié blaise032 mardi 31 janvier 2012 17:53
    mardi 31 janvier 2012 17:50

Réponses

  • Bonjour,

    DataDirectory n'est pas le dossier du projet mais le dossier où sont stockées les données (le dossier de sortie quand l'appli tourne sous VS).

    Donc voir dans le dossier bin\Debug ou bin\Release de votre application et non pas directement dans le fichier projet. En plus selon les propriétés du fichier MDB ("Copier dans le répertoire de sortie"), le fichier peut-être écrasé à chaque génération


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse Ould MouradEditor mardi 31 janvier 2012 18:59
    • Non marqué comme réponse blaise032 mercredi 1 février 2012 18:20
    • Marqué comme réponse blaise032 jeudi 2 février 2012 16:23
    mardi 31 janvier 2012 18:21
    Modérateur
  • En gros c'est comparable à une variable d'environnement. Une valeur par défaut est fournie mais AppDomin.CurrentDomain.SetData/GetData permet de la modifier/lire si besoin en fonction du sens que vous voulez lui donner pour votre appli (avec GetFolderPath par exemple).

    Cela permet de définir le sens à donner à |DataDirectory| et d'avoir des applications qui utilisent toujours la même chaine de connexion mais pour l'une ce sera le dossier "Mes documents\Mon appli" pour l'autre le dossier "Application Data" etc...

    Par exemple qq chose comme :

      Private Sub SetDataDirectory()
            Const DataDirectory = "DataDirectory"
            Const MyCompany As String = "MyCompany"
            Const MyApp As String = "MyApp"
            Dim p As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            p = IO.Path.Combine(p, MyCompany)
            p = IO.Path.Combine(p, MyApp)
            If Not IO.Directory.Exists(p) Then
                IO.Directory.CreateDirectory(p)
            End If
            AppDomain.CurrentDomain.SetData(DataDirectory, p)
        End Sub
    

    Définira |DataDirectory| comme étant le dossier "Mes documents" de Windows quel qui soit sur ce poste en particulier et dans ce dossier l'emplacement MyCompany\MyApp...

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 2 février 2012 10:46
    Modérateur

Toutes les réponses

  • Bonjour,

    DataDirectory n'est pas le dossier du projet mais le dossier où sont stockées les données (le dossier de sortie quand l'appli tourne sous VS).

    Donc voir dans le dossier bin\Debug ou bin\Release de votre application et non pas directement dans le fichier projet. En plus selon les propriétés du fichier MDB ("Copier dans le répertoire de sortie"), le fichier peut-être écrasé à chaque génération


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Marqué comme réponse Ould MouradEditor mardi 31 janvier 2012 18:59
    • Non marqué comme réponse blaise032 mercredi 1 février 2012 18:20
    • Marqué comme réponse blaise032 jeudi 2 février 2012 16:23
    mardi 31 janvier 2012 18:21
    Modérateur
  • DataDirectory n'est pas le dossier du projet mais le dossier où sont stockées les données (le dossier de sortie quand l'appli tourne sous VS).

    Donc voir dans le dossier bin\Debug ou bin\Release de votre application et non pas directement dans le fichier projet. En plus selon les propriétés du fichier MDB ("Copier dans le répertoire de sortie"), le fichier peut-être écrasé à chaque génération

    Bonsoir,

    Merci pour l'explication, bien qu'il me fusse aller lire beaucoup (très) entre les lignes ;-)

    Dans ma petite tête, je pensais résoudre un problème d’installation en incluant une petite base de données dans le projet et je voyais «|DataDirectory|» comme solution.

    D'ailleurs, à quoi sert cette balise si elle ne fait (systématiquement ?) que référence à une copie déconnectée ?
    Comme beaucoup ici (?), je viens du VB6 et du VBA et je ne comprends pas bien cette philosophie.

    Bon donc, si vous avez une solution plutôt qu'une explication, je suis preneur

    Cdt,

    Blaise

    mercredi 1 février 2012 19:09
  • Bonjour, Blaise,

     

    Votre problème est connu et a été déjà discuté sur nos forums pour une base de données SDF et pour une base Access. Je vous invite lire les deux discussions pour comprendre ce que Patrice vous a dit.

     

    Si vous décidez utiliser des chemins relatifs pour référencer la base de données il faut payer attention aussi comment vous gérez les strings de connexion au déploiement.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 2 février 2012 10:20
  • En gros c'est comparable à une variable d'environnement. Une valeur par défaut est fournie mais AppDomin.CurrentDomain.SetData/GetData permet de la modifier/lire si besoin en fonction du sens que vous voulez lui donner pour votre appli (avec GetFolderPath par exemple).

    Cela permet de définir le sens à donner à |DataDirectory| et d'avoir des applications qui utilisent toujours la même chaine de connexion mais pour l'une ce sera le dossier "Mes documents\Mon appli" pour l'autre le dossier "Application Data" etc...

    Par exemple qq chose comme :

      Private Sub SetDataDirectory()
            Const DataDirectory = "DataDirectory"
            Const MyCompany As String = "MyCompany"
            Const MyApp As String = "MyApp"
            Dim p As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            p = IO.Path.Combine(p, MyCompany)
            p = IO.Path.Combine(p, MyApp)
            If Not IO.Directory.Exists(p) Then
                IO.Directory.CreateDirectory(p)
            End If
            AppDomain.CurrentDomain.SetData(DataDirectory, p)
        End Sub
    

    Définira |DataDirectory| comme étant le dossier "Mes documents" de Windows quel qui soit sur ce poste en particulier et dans ce dossier l'emplacement MyCompany\MyApp...

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 2 février 2012 10:46
    Modérateur
  • Merci à tous,

    Le franc est tombé.  Le problème ne se présente que dans VS.  Au temps pour moi, comme on dit et on écrit.  Mais comme dit aussi plus haut, venant du VB6 et bloqué en VBA au boulot, c'est assez troublant...

    Bien à vous,

    Blaise

    jeudi 2 février 2012 16:50