Pb d'update BDD locale via un dataset

Résolu
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016 - 6 sept. 2016 à 08:04
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016 - 8 sept. 2016 à 10:09
Bonjour

J'ai parcouru pas mal de discussion mais aucun ne résout mon soucis (Ou Alors je n'arrive pas à comprendre d'où il provient)

J'utilise VS2010 pour le développement et SQLCE pour ma BDD (Intégrer à VS2010)

Je désire faire un update de ma BDD à l'aide d'un bouton mais quand je ferme mon appli, ma BDD locale n'est pas updatée.
En fait, si je ne ferme pas l'appli, toutes mes données sont updatées.

Donc je pense que seulement le dataset est updatée mais pas la BDD.

La connexion à ma BDD se fait bien au lancement de mon appli car si je modifie manuellement directement un champs dans la BDD, je vois bien la modif lors de l'ouverture de mon appli. Mais rien ne se passe dans l'autre sens. Donc, avez vous une idée d'où provient mon soucis svp ?

Voici mon code :

Private Sub BDD_Update()

Try

Dim strConnexion As String = "Data Source=|DataDirectory|\Database1.sdf"
Dim strRequete As String = "SELECT * FROM Personnel ORDER BY ID_Personne"


Dim oConnection As New SqlCeConnection(strConnexion)
oConnection.Open()

' Chargement de la liste des catégories dans oDataSet

Dim oSqlDataAdapter As New SqlCeDataAdapter(strRequete, strConnexion)


Dim oDataSet As New DataSet("Personnel")
oSqlDataAdapter.Fill(oDataSet, "Personnel")


' Remplissage de la commande InsertCommand

oSqlDataAdapter.InsertCommand = New SqlCeCommand("INSERT INTO Personnel(usine, nom, prenom, fonction, adresse_mail, surnom, Actif, telephone_fixe, telephone_port, photo, Emetteur_de_Devis) Values(@usine,@nom,@prenom,@fonction,@adresse_mail,@surnom,@Actif,@telephone_fixe,@telephone_port,@photo,@Emetteur_de_Devis)", oConnection)
oSqlDataAdapter.InsertCommand.Parameters.Add("@usine", SqlDbType.Int, 4, "Usine")
oSqlDataAdapter.InsertCommand.Parameters.Add("@nom", SqlDbType.NVarChar, 100, "nom")
oSqlDataAdapter.InsertCommand.Parameters.Add("@prenom", SqlDbType.NVarChar, 100, "prenom")
oSqlDataAdapter.InsertCommand.Parameters.Add("@fonction", SqlDbType.NVarChar, 200, "fonction")
oSqlDataAdapter.InsertCommand.Parameters.Add("@adresse_mail", SqlDbType.NVarChar, 200, "adresse_mail")
oSqlDataAdapter.InsertCommand.Parameters.Add("@surnom", SqlDbType.NVarChar, 200, "surnom")
oSqlDataAdapter.InsertCommand.Parameters.Add("@Actif", SqlDbType.Int, 4, "Actif")
oSqlDataAdapter.InsertCommand.Parameters.Add("@telephone_fixe", SqlDbType.NVarChar, 40, "telephone_fixe")
oSqlDataAdapter.InsertCommand.Parameters.Add("@telephone_port", SqlDbType.NVarChar, 40, "telephone_port")
oSqlDataAdapter.InsertCommand.Parameters.Add("@photo", SqlDbType.Image, 16, "photo")
oSqlDataAdapter.InsertCommand.Parameters.Add("@Emetteur_de_Devis", SqlDbType.Int, 4, "Emetteur_de_Devis")


Dim oDataRow As DataRow
Dim byteArray As Byte() = {&H0, &H0}

oDataRow = oDataSet.Tables("Personnel").NewRow()
oDataRow("usine") = 1
oDataRow("nom") = "TEST"
oDataRow("prenom") = "TEST"
oDataRow("fonction") = "TEST"
oDataRow("adresse_mail") = "TEST"
oDataRow("surnom") = "TEST"
oDataRow("Actif") = 1
oDataRow("telephone_fixe") = "TEST"
oDataRow("telephone_port") = "TEST"
oDataRow("photo") = byteArray
oDataRow("Emetteur_de_Devis") = 1

oDataSet.Tables("Personnel").Rows.Add(oDataRow)

' Mise à jour de la source de données à partir du DataSet
oSqlDataAdapter.Update(oDataSet, "Personnel")

' Rechargement des données de la source mise à jour
oDataSet.Clear()
oSqlDataAdapter.Fill(oDataSet, "Personnel")


Dim Builder As New SqlCeCommandBuilder(oSqlDataAdapter)

oSqlDataAdapter.UpdateCommand = Builder.GetUpdateCommand
oSqlDataAdapter.Update(oDataSet, "Personnel")


oConnection.Close()
Catch e As Exception
MsgBox(e.Message)
End Try


End Sub

6 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
6 sept. 2016 à 09:58
Bonjour

ce n'est peut etre pas la solution mais écris
le select l' insert et le update dans des sub différent et pour chacun
ouvre et ferme la connection
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
6 sept. 2016 à 10:06
Salut

Merci de ta réponse. J'ai enlevé l'insert mais comme tu t'en douté, ça ne résout pas mon soucis

Voici le nouveau code
Private Sub BDD_Update()

Try

Dim strConnexion As String = "Data Source=|DataDirectory|\Database1.sdf"
Dim strRequete As String = "SELECT * FROM Personnel ORDER BY ID_Personne"


Dim oConnection As New SqlCeConnection(strConnexion)
oConnection.Open()

' Chargement de la liste des catégories dans oDataSet

Dim oSqlDataAdapter As New SqlCeDataAdapter(strRequete, strConnexion)


Dim oDataSet As New DataSet("Personnel")
oSqlDataAdapter.Fill(oDataSet, "Personnel")


' Mise à jour de la source de données à partir du DataSet
oSqlDataAdapter.Update(oDataSet, "Personnel")

' Rechargement des données de la source mise à jour
oDataSet.Clear()
oSqlDataAdapter.Fill(oDataSet, "Personnel")


Dim Builder As New SqlCeCommandBuilder(oSqlDataAdapter)

oSqlDataAdapter.UpdateCommand = Builder.GetUpdateCommand
oSqlDataAdapter.Update(oDataSet, "Personnel")


oConnection.Close()
Catch e As Exception
MsgBox(e.Message)
End Try


End Sub
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
6 sept. 2016 à 10:45
tu n'as updaté aucun row de ton datatable !!!
tu as rempli ton dataset et après
' Mise à jour de la source de données à partir du DataSet
oSqlDataAdapter.Update(oDataSet, "Personnel")

qu'as tu mis à jour ?

http://plasserre.developpez.com/cours/vb-net/?page=bases-donnees2
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
6 sept. 2016 à 10:48
C Clair ! J'ai merdé !
Je vais modifier ça et je te tiens au jus
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
Modifié par lebelge80 le 6/09/2016 à 11:21
En fait si, j'avais bien mis un update, mais j'ai un doute par rapport à son emplacement. En fait, quand je clique sur mon bouton "SAVE", je fait d'abord quelques actions avant de vouloir mettre à jour ma BDD. Je sais c'est tordu ! Si t'as une meilleur idée je suis preneur.

Voici le code complet :
Private Sub Btn_Save_Click(sender As System.Object, e As System.EventArgs) Handles Btn_Save.Click



If TB_Surname.Text <> "" And TB_Name.Text <> "" Then

'Remplacer l'apostrophe par 2 apostrophes
TB_Surname.Text = Replace(TB_Surname.Text, "'", "''")
TB_Name.Text = Replace(TB_Name.Text, "'", "''")
TB_Function.Text = Replace(TB_Function.Text, "'", "''")
TB_Email.Text = Replace(TB_Email.Text, "'", "''")
TB_Surnom.Text = Replace(TB_Surnom.Text, "'", "''")
TB_Office.Text = Replace(TB_Office.Text, "'", "''")
TB_Portable.Text = Replace(TB_Portable.Text, "'", "''")
CB_Choice_Plant.Text = Replace(CB_Choice_Plant.Text, "'", "''")

Try
' Commande SQL pour Prendre l ID du pays
Req_sql_string = "Select Table_Pays.PaysID " & _
" FROM Table_Pays " & _
" WHERE Table_Pays.Pays = '" & CB_Choice_Plant.Text & "'"

SourceBaseMethod.Open()
MycommandMethod.CommandText = Req_sql_string

Pays = MycommandMethod.ExecuteScalar
'MessageBox.Show(Pays.ToString())

SourceBaseMethod.Close()

Catch ex As Exception
MsgBox(ex.Message)
'SourceBaseMethod.Close()
End Try

Try
' Commande SQL pour mettre a jour tous les champs de la personne sélectionné

Req_sql_string = "update Personnel set Personnel.usine = '" & Pays & "' , Personnel.nom ='" & TB_Surname.Text & "' , Personnel.prenom ='" & TB_Name.Text & "' , Personnel.fonction ='" & TB_Function.Text & "' , Personnel.adresse_mail ='" & TB_Email.Text & "' , Personnel.surnom ='" & TB_Surnom.Text & "' , Personnel.Actif ='" & Actif & "' , Personnel.telephone_fixe ='" & TB_Office.Text & "', Personnel.telephone_port ='" & TB_Portable.Text & "', Personnel.Emetteur_de_Devis ='" & Emetteur_Devis & "' " & _
"WHERE Personnel.ID_Personne = '" & TB_ID.Text & "'"

SourceBaseMethod.Open()
MycommandMethod.CommandText = Req_sql_string

Dim NbreLignesAffectés As Integer
NbreLignesAffectés = MycommandMethod.ExecuteNonQuery()

'MsgBox("Number of Lines Updated : " & NbreLignesAffectés)

SourceBaseMethod.Close()

Catch ex As Exception
MsgBox(ex.Message)
SourceBaseMethod.Close()
End Try

Call BDD_Update()


End If

End Sub


 Private Sub BDD_Update()

Try
'Dim strConnexion As String = "Data Source=localhost; Integrated Security=SSPI;" + "Initial Catalog=Database1.sdf"
Dim strConnexion As String = "Data Source=|DataDirectory|\Database1.sdf"
Dim strRequete As String = "SELECT * FROM Personnel ORDER BY ID_Personne"


Dim oConnection As New SqlCeConnection(strConnexion)
oConnection.Open()

' Chargement de la liste des catégories dans oDataSet
Dim oSqlDataAdapter As New SqlCeDataAdapter(strRequete, strConnexion)


Dim oDataSet As New DataSet("Personnel")
oSqlDataAdapter.Fill(oDataSet, "Personnel")

' Mise à jour de la source de données à partir du DataSet
oSqlDataAdapter.Update(oDataSet, "Personnel")

' Rechargement des données de la source mise à jour
oDataSet.Clear()
oSqlDataAdapter.Fill(oDataSet, "Personnel")

'Dim Req_Update As String = "UPDATE Personnel SET usine = 3 WHERE ID_Personne = 1"
'oSqlDataAdapter.UpdateCommand.Parameters.Add("@usine", SqlDbType.Int, 4, "Usine")
Dim Builder As New SqlCeCommandBuilder(oSqlDataAdapter)

oSqlDataAdapter.UpdateCommand = Builder.GetUpdateCommand
oSqlDataAdapter.Update(oDataSet, "Personnel")


oConnection.Close()
Catch e As Exception
MsgBox(e.Message)
End Try


End Sub
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
6 sept. 2016 à 11:59
Ce n'est pas le bouton qui fait update mais le code que tu
es supposé d'écrire
update modifier un ou plusieurs row(s) de ton dataset
tu remplis ton dataset avec ta requete et tu travaille avec
ta datatable

Dim dr As DataRow
dr = oDataSet.Tables("Personnel").Rows(x)
dr(field1) = blabla
dr(field2) = blabla
etc.....

try
oSqlDataAdapter.Update(oDataSet, "Personnel")

'On vide le DataSet et on le 'recharge' de nouveau.
oDataSet.Clear()
oSqlDataAdapter.Fill(oDataSet, "Personnel")

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
Modifié par lebelge80 le 6/09/2016 à 13:09
J'ai essayé ton bout de code mais j'ai une erreur à l'execution. Il me dit d'instancier comme new cette ligne :
 
dr = oDataSet.Tables("Personnel").Rows(x)


Voici le code complet :
 
Private Sub BackupDatas_to_BDD()

Dim dr As DataRow
Dim byteArray As Byte() = {&H0, &H0}
Dim x As Integer
Dim oDataSet As New DataSet("Personnel")

x = TB_ID.Text 'N° ID de la personne

dr = oDataSet.Tables("Personnel").Rows(x)
dr("usine") = 1
dr("nom") = "TEST"
dr("prenom") = "TEST"
dr("fonction") = "TEST"
dr("adresse_mail") = "TEST"
dr("surnom") = "TEST"
dr("Actif") = 1
dr("telephone_fixe") = "TEST"
dr("telephone_port") = "TEST"
dr("photo") = byteArray
dr("Emetteur_de_Devis") = 1

Try
Dim strConnexion As String = "Data Source=|DataDirectory|\Database1.sdf"
Dim strRequete As String = "SELECT * FROM Personnel ORDER BY ID_Personne"


Dim oConnection As New SqlCeConnection(strConnexion)
oConnection.Open()

' Chargement de la liste des catégories dans oDataSet
Dim oSqlDataAdapter As New SqlCeDataAdapter(strRequete, strConnexion)
oSqlDataAdapter.Update(oDataSet, "Personnel")

'On vide le DataSet et on le 'recharge' de nouveau.
oDataSet.Clear()
oSqlDataAdapter.Fill(oDataSet, "Personnel")

oConnection.Close()

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

End Sub


T'avoue que je suis un peu perdu car débutant.
Je que je n'arrive pas à comprendre c'est qu'avec le code précédant (Voir plus haut), le dataset se met bien à jour, mais pas ma BDD. En fait, mon plus gros soucis, c'est d'écrire correctement le code.
Si tu as un exemple de code simple, je pense que j'arriverai à solutionner mon problème. Mon soucis ne se situe que sur l'update de ma BDD.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
6 sept. 2016 à 14:19
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
6 sept. 2016 à 15:35
Je suis au taf et mon antivirus ne me permet pas de télécharger le projet car site non recommandés. J'essayerai de voir ça ce soir.

Merci de ta contribution
0

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

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
6 sept. 2016 à 14:33
bah oui
ton dataset et vide il faut d'abord le remplir extraire le row pour
modifier les champs et updater

Private Sub BackupDatas_to_BDD()

Try
Dim strConnexion As String = "Data Source=|DataDirectory|\Database1.sdf"
Dim strRequete As String = "SELECT * FROM Personnel ORDER BY ID_Personne"


Dim oConnection As New SqlCeConnection(strConnexion)
oConnection.Open()

' Chargement de la liste des catégories dans oDataSet
Dim oSqlDataAdapter As New SqlCeDataAdapter(strRequete, strConnexion)


Dim oDataSet As New DataSet("Personnel")
oSqlDataAdapter.Fill(oDataSet, "Personnel")

x = TB_ID.Text 'N° ID de la personne

dr = oDataSet.Tables("Personnel").Rows(x)
dr("usine") = 1
dr("nom") = "TEST"
dr("prenom") = "TEST"
dr("fonction") = "TEST"
dr("adresse_mail") = "TEST"
dr("surnom") = "TEST"
dr("Actif") = 1
dr("telephone_fixe") = "TEST"
dr("telephone_port") = "TEST"
dr("photo") = byteArray
dr("Emetteur_de_Devis") = 1
oSqlDataAdapter.Update(oDataSet, "Personnel")

'On vide le DataSet et on le 'recharge' de nouveau.
oDataSet.Clear()
oSqlDataAdapter.Fill(oDataSet, "Personnel")

oConnection.Close()

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

End Sub
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
6 sept. 2016 à 15:34
ça me marque "Update requiert un UpdateCommand valide lors du passage de la collection DataRow avec des lignes modifiées". Je comprend pas. Je dois écrire champs par champs un update ? si oui comment ?

Encore merci pour ton aide.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 6/09/2016 à 15:37
J'ai l'impression qu'il y a un autre problème

x = TB_ID.Text 'N° ID de la personne
dr = oDataSet.Tables("Personnel").Rows(x)

x doit etre le numero de la rangée que tu veux modifier
mais chez toi x est le id du client
donc
il faut trouvé la rangée dont le champ ID_Personne correspond à TB_ID

if faut suprimer cette ligne
x = TB_ID.Text 'N° ID de la personne

et ajouter
 For x As Integer = 0 To ds.Tables("Personnel").Rows.Count - 1
If ds.Tables("Personnel").Rows(x)("ID_Personne") = TB_ID.Text Then
Exit For
End If
Next


et ensuite
 dr = oDataSet.Tables("Personnel").Rows(x)  

le reste ne change pas
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
6 sept. 2016 à 15:59
Le For ne marche pas car il me dit que la variable x masque un bloc englobant !?
Du coup j'ai remplacé cette ligne
 dr = oDataSet.Tables("Personnel").Rows(x)

par
 dr = oDataSet.Tables("Personnel").Rows(4)

juste pour tester et ça me met le même défaut précedant :"Update..."

Vais laisser tomber pour aujourd'hui. Après une bonne nuit, j'espère que la solution viendra !
Merci pour ton temps
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
Modifié par lebelge80 le 7/09/2016 à 10:55
C'est bon, j'ai trouvé mon problème !!!
Je suis parti du code exemple que ma donné cs_Le Pivert. Et en fait, je ne pointait pas sur la bonne base !! j'avais 2 bases du même nom dans mon repertoire, mais l'une dans le rep Bin et l'autre dans le rep racine de mon appli. Du coup, je mettais à jour celle du rep bin mais quand j'ouvrais mon appli j'appelé celle du rep racine. En fait je voyais jamais ma mise à jour.
J'ai quand même changer le code en m'inspirant du code example donné par cs Le pivert et ça marche nickel. Voici le code pour update une BDD :

Private Sub BackupDatas_to_BDD()

Try
' Commande SQL pour Prendre l'ID du pays
Req_sql_string = "Select Table_Pays.PaysID " & _
" FROM Table_Pays " & _
" WHERE Table_Pays.Pays = '" & CB_Choice_Plant.Text & "'"

SourceBaseMethod.Open()
MycommandMethod.CommandText = Req_sql_string

Pays = MycommandMethod.ExecuteScalar
'MessageBox.Show(Pays.ToString())

SourceBaseMethod.Close()

Catch ex As Exception
MsgBox(ex.Message)
'SourceBaseMethod.Close()
End Try

Dim connectionString As String
Dim fileName As String = "Database1.sdf"
connectionString = String.Format("DataSource=""{0}"";", fileName)


Dim connex As New SqlCeConnection(connectionString)
If connex.State = ConnectionState.Closed Then
connex.Open()
End If
Try
Dim cmd As New SqlCeCommand()

Req_sql_string = "update Personnel set Personnel.usine = '" & Pays & "' , Personnel.nom ='" & TB_Surname.Text & "' , Personnel.prenom ='" & TB_Name.Text & "' , Personnel.fonction ='" & TB_Function.Text & "' , Personnel.adresse_mail ='" & TB_Email.Text & "' , Personnel.surnom ='" & TB_Surnom.Text & "' , Personnel.Actif ='" & Actif & "' , Personnel.telephone_fixe ='" & TB_Office.Text & "', Personnel.telephone_port ='" & TB_Portable.Text & "', Personnel.Emetteur_de_Devis ='" & Emetteur_Devis & "' " & _
"WHERE Personnel.ID_Personne = '" & TB_ID.Text & "'"


cmd = New SqlCeCommand(Req_sql_string, connex)
cmd.Parameters.Add(New SqlCeParameter("@usine", SqlDbType.Int, 4))
cmd.Parameters.Add(New SqlCeParameter("@nom", SqlDbType.NVarChar, 100))
cmd.Parameters.Add(New SqlCeParameter("@prenom", SqlDbType.NVarChar, 100))
cmd.Parameters.Add(New SqlCeParameter("@fonction", SqlDbType.NVarChar, 200))
cmd.Parameters.Add(New SqlCeParameter("@adresse_mail", SqlDbType.NVarChar, 200))
cmd.Parameters.Add(New SqlCeParameter("@surnom", SqlDbType.NVarChar, 200))
cmd.Parameters.Add(New SqlCeParameter("@Actif", SqlDbType.Int, 4))
cmd.Parameters.Add(New SqlCeParameter("@telephone_fixe", SqlDbType.NVarChar, 40))
cmd.Parameters.Add(New SqlCeParameter("@telephone_port", SqlDbType.NVarChar, 40))
cmd.Parameters.Add(New SqlCeParameter("@photo", SqlDbType.Image, 16))
cmd.Parameters.Add(New SqlCeParameter("@Emetteur_de_Devis", SqlDbType.Int, 4))
cmd.ExecuteNonQuery()
connex.Close()

Catch
MsgBox(Err.Description)
End Try


End Sub


Merci en tout cas pour votre précieuse aide, car je galèrai depuis des semaines !!
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57 > lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016
7 sept. 2016 à 15:09
De rien
la requete update fonctionne ?
parceque je ne vois pas le lien entre la requete et les parametres

update    Personnel set Personnel.usine = '"

cela serait plutot
update    Personnel set Personnel.usine = @usine  AND  Personnel.nom =@nom  
0
lebelge80 Messages postés 22 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 4 novembre 2016 > cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019
Modifié par lebelge80 le 8/09/2016 à 10:10
Oui ça marche
Fais glisser la barre horizontale et tu verras qu'il y a pas mal de parametres derriere !
J'avais la flemme de mettre les " & _ "
Je verrais ça plus tard
0
Rejoignez-nous