Problème d'enregistrement de la base de données Access avec DataSet

Résolu
corv Messages postés 18 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 13 décembre 2009 - 13 déc. 2009 à 00:06
cs_ssefyou Messages postés 119 Date d'inscription samedi 3 mai 2008 Statut Membre 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

9 réponses

cs_ssefyou Messages postés 119 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 18 juillet 2013 1
13 déc. 2009 à 11:56
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
3
cs_ssefyou Messages postés 119 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 18 juillet 2013 1
13 déc. 2009 à 20:35
de rien
1
cs_ssefyou Messages postés 119 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 18 juillet 2013 1
13 déc. 2009 à 00:43
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)
0
corv Messages postés 18 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 13 décembre 2009
13 déc. 2009 à 01:09
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ssefyou Messages postés 119 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 18 juillet 2013 1
13 déc. 2009 à 02:49
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
0
corv Messages postés 18 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 13 décembre 2009
13 déc. 2009 à 08:39
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
0
corv Messages postés 18 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 13 décembre 2009
13 déc. 2009 à 18:17
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
0
cs_ssefyou Messages postés 119 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 18 juillet 2013 1
13 déc. 2009 à 19:25
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é

@++
0
corv Messages postés 18 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 13 décembre 2009
13 déc. 2009 à 20:32
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
0
Rejoignez-nous