IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème Recordset laissant Base access ouvert (.ldb) [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut Problème Recordset laissant Base access ouvert (.ldb)
    Bonjour à tous,

    Toujours débutant, merci d'avance pour votre indulgence

    J'ai constaté que lorsque j'accède à ma base de données, apparait ce fameux fichier .ldb qui est sensé disparaitre lorsqu'on referme la connection. Et chez moi il reste .....

    L'utilisateur saisit des données dans un form, puis je les intègrent dans la base de données ainsi :

    Pour info, connection1() est dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Module ModuleConnection
        Public base1 As String
        Public base3 As String
     
        Public Sub connection1()
            base1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = "
            base3 = "C:\Users\masession\Documents\escale.mdb;"
        End Sub
     End Module
    Une fois que l'utilisateur valide, cette procédure se lance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Public Class Form2
        Dim MyConnect As String
        Dim MyRecordset As ADODB.Recordset 
     
    Private Sub valider_Click(sender As System.Object, e As System.EventArgs) Handles valider.Click
    Try
               Call connection1()
                    MyConnect = base1 & base3
                    MyRecordset = New ADODB.Recordset
                    MyRecordset.Open("Table1", MyConnect, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
                    MyRecordset.AddNew()
                    MyRecordset.Fields("NDC").Value = dc.Text
                    MyRecordset.Update()
                    MyRecordset.Close()
     
    'mise à jour de mon datagridview associé
    Form1.GetData(Form1.Table1dataAdapter.SelectCommand.CommandText)
     
    Catch ex As Exception
                    MsgBox(Err.Description)
    End Try
    End sub
     
    End class
    Concernant la ligne de commande de mise à jour du datagridview, je vous mets le code contenu dans le form1 :

    Tout en haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imports System.Data.OleDb
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Sub GetData(ByVal selectCommand As String)
     
            Try
                Call connection1()
                Dim connectionString1 As String = base1 & base3
     
                Me.Table1dataAdapter = New OleDbDataAdapter(selectCommand, connectionString1)
                Dim commandBuilder1 As New OleDbCommandBuilder(Me.Table1dataAdapter)
     
                Dim table1 As New DataTable()
                table1.Locale = System.Globalization.CultureInfo.InvariantCulture
     
                Me.Table1dataAdapter.Fill(table1)
     
            Catch ex As DataException
                MsgBox(Err.Description)
            End Try
    J'espère que cela pourra vous aider .....

    Edit 1 : De plus je remarque que dans VB, j'ai dans fenêtre exécution :
    Une exception de première chance de type 'System.NullReferenceException' s'est produite dans Escale.exe
    et une info-bulle :
    La référence d'objet n'est pas défini à une instance d'un objet
    Est-ce lié car je sais pas comment savoir à quelle ligne de mon programme çà bug .... et VB2010 me pointe pas la ligne qui pourrait générer cette erreur.....

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    les recordset n'ont pas leur place en .net

    avec ado.net on peut s'assurer que la connexion se ferme même en cas d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using conn as new system.data.oledb.oledbconnection(chaine_de_connexion)
      ' utilisation de la connexion
    end using
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Salut Pol63,

    Merci pour ta réponse.
    Concernant mon EDIT et l'erreur j'ai trouvé d'ou celà venait. En fait, j'avais mis un timer qui rafraichissait les données tous les X temps. Et le rafraichissement se lançait que si le Form1 est actif en testant un paramètre qui était null .

    Sinon dans ton petit exemple, tu peux juste l'adapter à ce que j'ai mis pour que je vois comment je peux enregistrer mon textbox dans la base de données ?
    (ps pour info, je compile en framework version 2)
    Merci d'avance

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je te conseille de lire un tuto sur ado.net, qui est la solution recommandée pour accéder aux données en vb.net

    il y a plusieurs méthodes dont :
    - par requete : oledbconnection (connection) / oledbcommand (requete SQL (insert/update/delete), dans ton cas "UPDATE table SET colonne = valeur WHERE condition") / oledbdatareader (permet de lire les données d'un select)
    - dataadapter / dataset : c'est aussi simple que les recordsets, tu n'as que le select à écrire et tu récupère une variable tableau, tu peux modifier n'importe quelle cas et dire à l'objet daadapter de répercuter les modifications sur la base de données
    - entity framework (pas dispo avec le framework 2 et access je crois) en code plus simple que les dataset, ca permet de manipuler des collections typées et il n'y a aucune requete à écrire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Merci pour tes conseils. En fait je me suis inspiré de la doc MSDN pour la partie "Public Sub GetData(ByVal selectCommand As String)"

    Et lorsque je modifie une donnée dans mon datagridview via un form, la mise à jour de la base est faite par la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Validate()
    Form1.Table1bindingSource.EndEdit() 
    Form1.Table1dataAdapter.Update(CType(Form1.Table1bindingSource.DataSource, DataTable))
    Tout se passe bien avec ces commandes/fonctions.
    Je modifie une donnée déjà existante et mets à jour et pas de traces de fichiers .ldb
    Mon problème vient vraiment de ce module avec mes myrecordset. Tout s'enregistre dans la base de données mais malgré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyRecordset.Update()
    MyRecordset.Close()
    Le fichier .ldb reste

    En fait dans mon datagridview je ne rapatrie pas toutes les colonnes de ma base access . C'est pour cela que je dois passer par une écriture en premier sur ma base et puis mettre à jour mon datagridview. Certaines données saisies initialement restent sur la base de données et ne sont plus modifiables

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Je m'étais inspiré de cette doc :

    http://msdn.microsoft.com/en-us/library/fbk67b6z.aspx

    Avec cette méthode, je peux gérer le chargement des tables, mettre à jour. Ils donnent le code et j'ai pu l'adapter sans soucis

    Mais ils ne disent pas comment par cette méthode insérer de nouveaux données directement dans la base de données. Sachant que ces données à insérer viennent de textbox par exemple

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pour ajouter une ligne il faut ajouter un new datarow sur le datatable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Merci pour le conseil. Les données à intégrer dans la base access sont issus d'un Form2 et ma table1 entre autres est déclarée et instanciée dans le Form 1 sous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub GetData(ByVal selectCommand As String)
    .....
    End Sub
    Comme sur le lien que j'ai mis chez MSDN

    J'ai un peu fouiné sur le net et trouvé quelques codes mais lorsqu'on fait tout depuis un même form..... Et là c'est va pas pour moi. Depuis le form2, je ne peux pas faire des trucs du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim row As DataRow 
    row = Form1.Table1.NewRow()
    row("NDC") = dc.text
    row("Nom") = nom.text
    row("prenom") = prenom.text
    Form1.Table.Rows.Add(row)

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bon j'ai déclaré ma Table en public dans le form1 et j'y ai accès dans mon form2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public table1 As New DataTable()
    Dans Mon Form1 load j'ai bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetData("select * from Table1")
    pour exécuter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Sub GetData(ByVal selectCommand As String)
     
            Try
                Call connection1()
                Dim connectionString1 As String = base1 & base3
     
                Me.Table1dataAdapter = New OleDbDataAdapter(selectCommand, connectionString1)
                Dim commandBuilder1 As New OleDbCommandBuilder(Me.Table1dataAdapter)
     
                Dim table1 As New DataTable()
                table1.Locale = System.Globalization.CultureInfo.InvariantCulture
     
                Me.Table1dataAdapter.Fill(table1)
     
            Catch ex As DataException
                MsgBox(Err.Description)
            End Try
    Ensuite dans mon Form2, j'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim row As DataRow
                        row = Form1.table1.NewRow()
     
                        row("Indice") = indicecale.Text
                        row("Marche") = marchecale.Text
     
                        Form1.table1.Rows.Add(row)
     
    Form1.Table1bindingSource.EndEdit()
                        Form1.Table1dataAdapter.Update(CType(Form1.Table1bindingSource.DataSource, DataTable))
                        Form1.GetData(Form1.Table1dataAdapter.SelectCommand.CommandText)
    Et je me chope l'erreur :
    aucun membre par défaut trouvé pour le type DBNull
    Pourtant indicecale.Text et marchecale.Text contiennent des données

    Merci pour votre aide

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Bon je progresse, je n'ai plus l'erreur d'avant mais maintenant celle-ci :
    le champ est trop petit pour accepter la quantité de données ....
    Pourtant

    indicecale.Text = 7 caractères au maximum
    marchecale.Text = 6 caractères au maximum

    Dans ma base access, la colonne Indice et Marche acceptent 255 caractères

    Est-ce la méthode d'ajout qui va pas car dans ma base access, j'ai deux colonnes " Indice" et "Marche" et je veux que la valeur indicecale.text se mette dans la colonne "Indice" et marchecale.text dans la colonne "Marche" , le tout sur la même ligne .....

    Pfff.....

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bon malgré la résolution de ma dernière erreur, celà ne marche pas . J'ai cherché tout l'après-midi comment faire en tenant compte de mes paramètres de connection à ma base . Et rien ne marche......

    Si je déclare la table en public, tout se double dans le datagridview et les nouvelles entrées ne s'affichent pas... Donc rien ne va plus.

    J'aimerais vraiment pouvoir avoir de l'aide pour pouvoir avancer. J'ai vu qu'on pouvait jouer aussi avec le binding... mais là c'est encore pire....

    Please help me

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bon toujours à l'assault..... j'ai testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .....SQLstr = "INSERT INTO.....
    Les données se mettent bien dans la base access mais impossibles de les faire apparaitre dans mon datagridview même en refermant l'application et en la relançant avec les paramètres que j'ai actuellement.

    Donc il est 01h03, je suis fatigué et je retourne à mes origines.....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Try
    Dim MyRecordsetcale As ADODB.Recordset
                        MyRecordsetcale = New ADODB.Recordset
     
                        MyRecordsetcale.Open("Table1", MyConnectcale, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
                        MyRecordsetcale.AddNew()
                        MyRecordsetcale.Fields("Indice").Value = indicecale.Text
                        MyRecordsetcale.Fields("Wg").Value = nombre.Text
                        MyRecordsetcale.Fields("Lg").Value = longueur.Text
                        MyRecordsetcale.Update()
                        MyRecordsetcale.Close()
                        MyRecordsetcale = Nothing
     
                    Catch ex As Exception
                        MsgBox(Err.Description)
                    End Try
    Comment on peut savoir ce qui empêche la fermeture dans un recordset tel que celui-ci et faire en sorte que ce maudit fichier .ldb disparaisse ?

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si tu as des questions sur les recordset, va sur le forum vb6, personne n'en utilise avec vb.net ... (à part quelques hérétiques peut etre)

    sinon ton titre n'est surement pas le mieux pour attirer des connaisseurs de datatable ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Salut Pol63,

    Content de te relire

    Après des heures et des heures de recherches, j'ai enfin trouvé comment faire en très peu de lignes et cela marche enfin. Voici mon code (avec 2 textbox) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Form1.CalebindingSource.DataSource.Rows.Add(New Object() {sitechoisi.Text, indicecale.Text})
     Form1.CalebindingSource.Position = Form1.CalebindingSource.Count - 1
     Form1.CaledataAdapter.Update(CType(Form1.CalebindingSource.DataSource, DataTable))
    J'aurais encore une autre question sur les DateTimePicker. Ce serait sympa si tu peux me dire ou est le soucis. J'ai dans un form un DateTimePicker.
    J'ai mis le Format = short.
    Si l'utilisateur valide sans changer la date (la date par défaut sélectionnée est celle du jour), la valeur renvoyée est quand même au format :
    09/06/2012 00:00 alors que moi je veux 09/06/2012
    J'ai essayé en passant par une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim madate as date
    madate = DateTimePicker.Value.Date
    Mais il me renvoit toujours le format avec l'heure...... C'est ou le problème ?

  15. #15
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par IL-MAFIOSO Voir le message
    Content de te relire
    J'ai bien suivi ce que tu disais au fur et à mesure mais je ne savais pas trop quoi te dire ^^

    Citation Envoyé par IL-MAFIOSO Voir le message
    J'aurais encore une autre question sur les DateTimePicker. Ce serait sympa si tu peux me dire ou est le soucis. J'ai dans un form un DateTimePicker.
    J'ai mis le Format = short.
    Si l'utilisateur valide sans changer la date (la date par défaut sélectionnée est celle du jour), la valeur renvoyée est quand même au format :
    09/06/2012 00:00 alors que moi je veux 09/06/2012
    J'ai essayé en passant par une variable, mais il me renvoit toujours le format avec l'heure...... C'est ou le problème ?
    le type date en vb.net contient forcément une date et une heure
    dtp.value contient la sélection du datetimepicker
    uneDate.Date retourne la partie date en retirant l'heure certes, mais vu que c'est typé as date, ca contient l'heure quand même, c'est juste qu'elle vaut 00:00:00 au lieu de 13:12:50 par exemple
    mettre le format short, c'est pour précisé la représentation en string de la date (car une date n'est pas un string, c'est un format binaire sur 8 octets)

    peut etre que dans access il y a un type date sans heure, dans ce cas le .value.date devrait quand même fonctionner ... non ?
    si non, il faut préciser le code, le message d'erreur ou le comportement qui ne convient pas ; dire "ca ne marche pas" ne faisant pas avancer les choses
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Alors ce que j'ai essayé :

    - Base access, format date/heure avec uniquement la date
    - Tableau datagridview même format

    J'ai aussi fait un custom pour le Datetimepicker directement en code.... Et il me sort toujours en + l'heure à 00:00:00
    Je vais passer à un monthcalendar à la place.

    Je vais cloturer ce Topic car c'est un tout autre sujet.
    Merci en tout cas pour ton assistance et disponibité. Mon problème initial est résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème update sur base access
    Par Ludosjob dans le forum ASP
    Réponses: 4
    Dernier message: 01/09/2008, 21h16
  2. [Delphi 6] Problème avec une base Access
    Par chakir76 dans le forum Bases de données
    Réponses: 1
    Dernier message: 13/03/2008, 17h08
  3. problème de connexion base access
    Par garthalgar dans le forum ASP
    Réponses: 3
    Dernier message: 23/07/2007, 15h41
  4. Réponses: 1
    Dernier message: 04/04/2006, 10h28
  5. Problème de connexion base Access
    Par Ricardo_Tubbs dans le forum ASP
    Réponses: 3
    Dernier message: 21/02/2006, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo