corv
Messages postés18Date d'inscriptionvendredi 23 janvier 2004StatutMembreDernière intervention13 décembre 2009
-
13 déc. 2009 à 00:06
cs_ssefyou
Messages postés119Date d'inscriptionsamedi 3 mai 2008StatutMembreDernière intervention18 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
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 **********
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
corv
Messages postés18Date d'inscriptionvendredi 23 janvier 2004StatutMembreDernière intervention13 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 ....
cs_ssefyou
Messages postés119Date d'inscriptionsamedi 3 mai 2008StatutMembreDernière intervention18 juillet 20131 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
corv
Messages postés18Date d'inscriptionvendredi 23 janvier 2004StatutMembreDernière intervention13 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é.
corv
Messages postés18Date d'inscriptionvendredi 23 janvier 2004StatutMembreDernière intervention13 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
cs_ssefyou
Messages postés119Date d'inscriptionsamedi 3 mai 2008StatutMembreDernière intervention18 juillet 20131 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é
corv
Messages postés18Date d'inscriptionvendredi 23 janvier 2004StatutMembreDernière intervention13 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.
@++