Problème d'enregistrement de la base de données Access avec DataSet [Résolu]

Messages postés
18
Date d'inscription
vendredi 23 janvier 2004
Dernière intervention
13 décembre 2009
- 13 déc. 2009 à 00:06 - Dernière réponse :
Messages postés
120
Date d'inscription
samedi 3 mai 2008
Dernière intervention
18 juillet 2013
- 13 déc. 2009 à 20:35
Bonjour, j'ai un soucis avec mon code. Je me met à VB.NET en venant de VB6 (les recordsets n'ont plus de secret pour moi mais la je sèche )J'enregistre des données par textbox dans une base Acces (base Gestsant; table : patients.mdb) avec un dataset et un dataadapter. Tout parait bien fonctionner car j'ai mis en 'test' un datareader pour voir si les données étaient ajoutées. Le datareader m'indique que les données sont ajoutées car le compte i s'incrémente mais quand j'ouvre la base access les nouvelles données ne s'y trouvent pas et si je redémare le programme elles ne s'y trouvent plus non plus. Alors que tant que le programme reste ouvert je peux voir ces données par datereader. Pourquoi mon dataset ne transmet pas à ma base les nouvelles données ? Voila mon code :

Dim Cx As New OleDbConnection
Dim Str1 As String
Dim str2 As String
Dim Cd As OleDbCommand = Cx.CreateCommand()
Dim Rd As OleDbDataReader
Dim i As Integer

Str1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\GestSant.mdb;User Id=Admin; Password="
Cx.ConnectionString = Str1
Cx.Open()

Cd.CommandText = "SELECT * FROM Patients Order By Nom, Prénom"
Rd = Cd.ExecuteReader
i = 0
'Ici pour tester la base avant les modifications
Do Until Rd.Read = False
i = i + 1
Loop
Rd.Close()

str2 = "SELECT * FROM Patients"
Dim Da As New OleDbDataAdapter(str2, Cx)
Dim Ds As New DataSet("Patients")
Da.Fill(Ds, "Patients")

Dim ObjetCommandBuilder As New OleDbCommandBuilder

ObjetCommandBuilder = New OleDbCommandBuilder(Da)

Da.InsertCommand = New OleDbCommand("INSERT INTO Patients (Nom, Prénom, ******toutes mes valeurs) VALUES ('" & TextBox1.Text & "'" & "," & "'" & TextBox2.Text & "'"****** tous mes textbox correspondants"')", Cx)

Da.InsertCommand.Parameters.Add("@Nom", OleDbType.VarChar, 50, "Nom")
Da.InsertCommand.Parameters.Add("@Prénom", OleDbType.VarChar, 20, "Prénom")
***************tous les autres insertcommand.parameters **********

Dim DRow As DataRow

DRow = Ds.Tables("Patients").NewRow
DRow.BeginEdit()
DRow("Nom") = TextBox1.Text
DRow("Prénom") = TextBox2.Text
****************autres DRow ************
DRow.EndEdit()

Ds.Tables("Patients").Rows.Add()

Da.Update(Ds, "Patients")
Da.Dispose()
***********recharger le reader pour voir si les modifs ont été apportées *
Ds.Clear()
Da.Fill(Ds, "Patients")
Rd = Cd.ExecuteReader
i = 0

Do Until Rd.Read = False
i = i + 1
Loop
Rd.Close()

**** là le reader me dit un enregistrement en plus ****
Cx.Close()
MsgBox("La fiche patient a été enregistrée.")

Toutefois si j'ouvre ma base patients.mdb les nouvelles données n'ont pas été enregistrées dans la base. Si j'appelle sur un autre form le reader les données ajoutées apparaissent mais si je redémarre le programme elles ne sont plus la !!!!!


Quelqu'un aurait une idée pour me sortir de cette panade?
Par avance merci
/size=4NewbieGothic
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
120
Date d'inscription
samedi 3 mai 2008
Dernière intervention
18 juillet 2013
- 13 déc. 2009 à 11:56
3
Merci
re,
je me demande si par hasard tu as cree dataset
via l'assistant (dataset typé) ??
tu te rappel d'un message du genre


si tuas choisi "OUI" il te faut juste modifier la chaine de connexion au niveau du dataadapter creer par l'assistant.
bonne chance pour la suite

Merci cs_ssefyou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cs_ssefyou
Messages postés
120
Date d'inscription
samedi 3 mai 2008
Dernière intervention
18 juillet 2013
- 13 déc. 2009 à 00:43
0
Merci
salut
je pense que tu ajoute une ligne vide
Ds.Tables("Patients").Rows.Add()
je croi que tu dois faire
Ds.Tables("Patients").Rows.Add(DRow)
Commenter la réponse de cs_ssefyou
Messages postés
18
Date d'inscription
vendredi 23 janvier 2004
Dernière intervention
13 décembre 2009
- 13 déc. 2009 à 01:09
0
Merci
Merci pour cette réponse rapide. Je viens d'essayer mais mêmes symptômes le datareader change je vois les modifs mais rien dans la base et ces modifications s'effacent lorsque je relance le programme. C'est bizarre car je pensais que le dataset mettait automatiquement à jour la base avec un update. J'ai une deuxième form où je fais de nouveau connexion à la base et je relis par datareader et les nouvelles données apparaissent mais rien dans la base elle même (que j'édite avec access) et ces données disparaissent quand je relance le programme. On dirait que le dataset est resté en mémoire sans mettre à jour la base ....

/size=4NewbieGothic
Commenter la réponse de corv
Messages postés
120
Date d'inscription
samedi 3 mai 2008
Dernière intervention
18 juillet 2013
- 13 déc. 2009 à 02:49
0
Merci
salut ,
j'ai remarqué un tas de truc inutile dans ton code par exemple si tu utilise une commande
d'insertion (requete insert into ) t'a pa besoin
d'utilisé un commande builder
tu vide le dataadapter ,le dataset
tu ajout une ligne vide

un exemple qui montre comment ajouter une ligne via des textbox




Imports System.Data.OleDb
Public Class Form2

    'Declaration Des objets
    Dim Con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\TESTIMG.mdb;Persist Security Info=False")
    Dim Comm As New OleDbCommand("Select * from clients", Con)
    Dim DA As New OleDbDataAdapter(Comm)
    Dim DST As New DataSet
    Dim CommB As New OleDbCommandBuilder(DA)


    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'chargement du dataset
        DA.Fill(DST, "Clients")

        Dim i As Integer = DST.Tables("Clients").Rows.Count
        MsgBox(i & " lignes")

    End Sub

    Private Sub Cmd_Ajouter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cmd_Ajouter.Click
        'creation d'une nouvelle ligne
        Dim row As DataRow
        row = DST.Tables("Clients").NewRow
        'affectation des valeurs a la ligne
        row.BeginEdit()
        row.Item(0) = TextBox1.Text
        row.Item(1) = TextBox2.Text
        row.Item(2) = TextBox3.Text
        row.Item(3) = DateTimePicker1.Text
        row.EndEdit()

        Try
            'ajout de la nouvelle ligne au DATASET
            DST.Tables("Clients").Rows.Add(row)
            'Mise a jour de la DB
            DA.Update(DST, "Clients")
            MsgBox("Ajout effectué")
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try


    End Sub
End Class
Commenter la réponse de cs_ssefyou
Messages postés
18
Date d'inscription
vendredi 23 janvier 2004
Dernière intervention
13 décembre 2009
- 13 déc. 2009 à 08:39
0
Merci
Merci encore de m'aider. Je viens de tester ton code et ... même symptôme. Tant que je reste avec le programme ouvert les datareader me permettent de retrouver les nouveaux enregistrements mais rien dans la base et quand je redémarre le programme rien non plus... Je comprend plus rien. J'en arrive à me demander si ça vient pas de ma base mais j'ai essayé avec une mdf pour voir et pareil.... en tous cas merci pour ton coup de main.

Euu oui mon code n'est pas net du tout mais j'ai fais plusieurs essais par sql ou autre et j'ai pas épuré.

/size=4NewbieGothic
Commenter la réponse de corv
Messages postés
18
Date d'inscription
vendredi 23 janvier 2004
Dernière intervention
13 décembre 2009
- 13 déc. 2009 à 18:17
0
Merci
Oui ça vient de la!!!!
Merci encore à toi. Juste une dernière chose si c'est pas trop abusé.... Effectivement si j'ai bien compris, lors de l'assistant il crée la base DANS mon projet ce qui a l'avantage après d'être copié dans le débug quand tu test. Si j'enlève complètement ma base du projet le code que tu m'as donné fonctionne parfaitement mais je dois copier la base dans le débug, chose que me faisait l'assistant. Donc quelle est la meilleur solution? Et où modifier le dataadapter (dans le code j'ai pas trouvé et les autres path sont grisé). En tout cas merci tu m'as empêché momentanément de retourner vers mon vieux VB6

/size=4NewbieGothic
Commenter la réponse de corv
Messages postés
120
Date d'inscription
samedi 3 mai 2008
Dernière intervention
18 juillet 2013
- 13 déc. 2009 à 19:25
0
Merci
salut ,
ce qui concerne le meilleur emplacement pour la Db je n'ai aucune idée
mais si tu souhaite utilisé un DATASET fortement typé ce qui est préférable (http://www.supinfo-projects.com/fr/2006/bdd_visualstudio_2005/1/)
et tu veux garder la DB originale il suffit de répondre "Non".
sinon tu peux modifier la chaine de connexion



ps: le code que j'ai envoyé au debut n'utilise pas un dataset typé

@++
Commenter la réponse de cs_ssefyou
Messages postés
18
Date d'inscription
vendredi 23 janvier 2004
Dernière intervention
13 décembre 2009
- 13 déc. 2009 à 20:32
0
Merci
Encore merci de ton aide vraiment Sans toi j'étais prêt à ressortir mes recordset Mais c'est dommage de passer à côté de ça car les codes sont intéressant. Et merci pour ta patience.
@++

/size=4NewbieGothic
Commenter la réponse de corv
Messages postés
120
Date d'inscription
samedi 3 mai 2008
Dernière intervention
18 juillet 2013
- 13 déc. 2009 à 20:35
0
Merci
de rien
Commenter la réponse de cs_ssefyou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.