Mise a jour d'un dataset entier dans une base SQLite

Résolu
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 - 25 nov. 2011 à 21:13
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 - 27 nov. 2011 à 19:07
Bonsoir a tous,
Je travaille actuellement sur une base Sqlite tres simple avec un utilisateur unique.
Mon appli n'utilise que la représentation de cette base en DataSet.
J'arrive a extraire correctement les données de cette base, par contre je ne trouve aucun exemple valable me permetant a l'inverse de mettre a jour cette Base avec le Dataset modifié.

Voici un exemple de ce cela pourrais donné ... mais qui bien sur ne fonctionne pas.

        ...
       'Connection a la Base
       Private Connex As SQLiteConnection
       'Liste des noms des tables de la base
        Dim ListeTable as List(of String)
        ....
        Try
            For Each NOM In ListeTable
                Dim Txte As String = "UPDATE " & NOM & " SET *"
                Dim adapter As SQLiteDataAdapter = New SQLiteDataAdapter(Txte, Connex)                 adapter.Update(_MyDataset, NOM)
            Next
            MsgBox("La Sauvegarde du DataSet est effectuée ", MsgBoxStyle.Information)
        Catch
            MsgBox("La Sauvegarde du DataSet a Echouée ", MsgBoxStyle.Critical)
        End Try
        ...
   

Pourriez vous m'aider a effectuer cette opération.

5 réponses

cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
27 nov. 2011 à 14:53
Bonjour,

En fait je ne travail pas avec SQLite mais SQLServer, mais c'est du SQL. Les dataadapter and Co doivent être équivalent vis à vis du .Net donc :

[1] Ta commande :

"UPDATE " & NOM & " SET *"


ne veut rien dire car SET * ?????

Dans un UPDATE (simple)

UPDATE Nom_Table_A_Modifier
SET Nom_Champ1_A_Modifier2 = Nouvelle_Valeur2,
    Nom_Champ1_A_Modifier2 = Nouvelle_Valeur2,
    ...
WHERE Nom_Champ_Condition = Condition


Par exemple :

update ListeLivre
set Prix = 15
where IDLivre = 156423


dans cet exemple on met donc la valeur 15 dans le champ prix de la table ListeLivre si l'IDLivre = 156423

Tu dois donc dans ton programme parcourir les enregistrements à modifier et lancer cette requete.

On lance une requete comme celle la avec le methode ExecureNonQuery d'un Sqlcommand (en sqlserver) comme ceci

cn.Open()  'ouverture de ta connection

Dim cmd as SqlCommand = cn.CreateCommand()
cmd.CommandText "UPDATE  ListeLivre set Prix 15 where IDLivre = 156423"
cmd.ExecuteNonQuery()


les deux dernières lignes étant dans une boucle pour toi.

[2] Comme tu viens de le voir tu dois connaitre le détail des tables même pour un simple update.

[3] Le dataset est une collection de datatable contenant les données sur lesquelles tu veux travailler, le lien entre ce dataset et ta base de donnée devrait être un DataAdapter.

Le dataset retient les enregistrements qui ont été ajoutés, supprimés et modifiés. et par la methode update() du dataadapter, toutes les modifications sont faites en même temps.

ceci grace aux commande (insertcommand,deletecommande et updatecommande)

le
WHERE DeptNo = :oldDeptNo
veut dire que l'on met à jour le champ pour lequel le DeptNo de la base vaut le numero original lors du chargement de la table dans le dataset.

[4] avec ta methode [1] tu dois distinguer les cas et lancer soit un insert, soit un delete ou soit un update.

avec le dataadapter si tu définis bien tes trois commandes cela se fait par un simple da.update()

A mon avis cela vaut le coup d'apprendre le fonctionnement de l'update du dataadapter.

Bon dimanche




Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
3
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
25 nov. 2011 à 21:21
J'ai oublié quelques ligne ....
    ...
        'Connection a la Base
        Private Connex As SQLiteConnection
        'Liste des noms des tables de la base
        Dim ListeTable as List(of String)
        'DataSet des tables de la base
        Dim _MyDataset as DataSet
        ....
        Try
            For Each NOM In ListeTable
                Dim Txte As String = "UPDATE " & NOM & " SET *"
                Dim adapter As SQLiteDataAdapter = New SQLiteDataAdapter(Txte, Connex)                 adapter.Update(_MyDataset, NOM)
        
                adapter.Update(_MyDataset, NOM)
            Next
            MsgBox("La Sauvegarde du DataSet est effectuée ", MsgBoxStyle.Information)
        Catch
            MsgBox("La Sauvegarde du DataSet a Echouée ", MsgBoxStyle.Critical)
        End Try
        ...
0
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
26 nov. 2011 à 11:59
Bonjour,

Je suppose que tu initialises ton dataset avec un sqlitedataadapter (méthode fill), alors regarde la le fonctionnement de la méthode Update() du dataadapter et les propriétés updatecommand,insertcommand, et deletecommand.

ici par exemple


bonne journée



Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
27 nov. 2011 à 11:11
Bonjour,
Merci pour ce lien cgandco
J'ai plusieurs questions:

[1] La commande "UPDATE TABLE " serait elle pas plus approprié?
ou peut on comprendre son fonctionnement?

[2] A ce que je comprend, a l'inverse de la méthode Fill du dataadapter, le fonctionnement de la méthode Update() requiert une connaissance en détail des champs du DataTable.

SQLiteCommand("UPDATE Dept SET DeptNo :DeptNo, DName :DName " & _
"WHERE DeptNo = :oldDeptNo", sqConnection)

Je veux mettre a jour tous les champs et l'ensemble des enregistrements.
A quoi correspond dans cette ligne "SET DeptNo = :DeptNo"

Est ce ici que l'on associe la désignation des champs du DataTable et ceux de la base?

[3] La clause "WHERE DeptNo = :oldDeptNo", correspond elle a un filtre sur les enregistrements a l'intérieur de la base ou entre le datatable et la base?

[4] Me faut il donc également distinguer (dans le datatable) les lignes Mise a jour, inséré et détruite entre son initialisation et sa sauvegarde pour effectuer ces changements dans la table.

Cordialement CGSI3
0

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

Posez votre question
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
27 nov. 2011 à 19:07
Bonsoir cgandco,
Merci pour cette réponse très détaillée et concrète.
0
Rejoignez-nous