Pb d'update BDD locale via un dataset [Résolu]

lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 6 sept. 2016 à 08:04 - Dernière réponse : lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention
- 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
Afficher la suite 

16 réponses

Répondre au sujet
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 6 sept. 2016 à 09:58
0
Utile
1
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
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 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
Commenter la réponse de cs_ShayW
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 6 sept. 2016 à 10:45
0
Utile
2
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
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 6 sept. 2016 à 10:48
C Clair ! J'ai merdé !
Je vais modifier ça et je te tiens au jus
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 6 sept. 2016 à 11:18
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
Commenter la réponse de cs_ShayW
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 6 sept. 2016 à 11:59
0
Utile
1
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
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 6 sept. 2016 à 13:03
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.
Commenter la réponse de cs_ShayW
cs_Le Pivert 4782 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 18 décembre 2017 Dernière intervention - 6 sept. 2016 à 14:19
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 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
Commenter la réponse de cs_Le Pivert
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 6 sept. 2016 à 14:33
0
Utile
1
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
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 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.
Commenter la réponse de cs_ShayW
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - Modifié par cs_ShayW le 6/09/2016 à 15:37
0
Utile
4
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
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 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
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 7 sept. 2016 à 10:54
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 !!
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention > lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention - 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  
lebelge80 22 Messages postés mardi 10 août 2010Date d'inscription 4 novembre 2016 Dernière intervention > cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 8 sept. 2016 à 10:09
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
Commenter la réponse de cs_ShayW

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.