System.InvalidOperationException was unhandled [Résolu]

Signaler
Messages postés
8
Date d'inscription
mardi 12 décembre 2006
Statut
Membre
Dernière intervention
5 mars 2008
-
Messages postés
8
Date d'inscription
mardi 12 décembre 2006
Statut
Membre
Dernière intervention
5 mars 2008
-
Bien qu'ayant suivi le tuto à la lettre j'ai une erreur lors de l'update

System.InvalidOperationException was unhandled
Message="Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information."
  Source="System.Data"

Voici l'extrait de ma source

Private Sub BtnModifier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnModifier.Click

        'récupération de la ligne dans le datarow
        dtr_Points = dts_Points.Tables("Points").Rows(rownum)

        'modification des données
        dtr_Points("STAT") = Me.TbStat.Text 'string
        dtr_Points("HpStat") = Me.TbHpStat.Text 'Num single
        dtr_Points("Numpt") = Me.TbNumpt.Text 'Num long Integer
        dtr_Points("Ligne") = Me.TbLigne.Text 'Num integer
        dtr_Points("ANGH") = Me.TbAngh.Text 'Num signle
        dtr_Points("ANGV") = Me.TbAngv.Text ' num single
        dtr_Points("DIST_OB") = Me.TbDisob.Text 'Num Single
        dtr_Points("DIST_HO") = Me.TbDisho.Text 'num single
        dtr_Points("HAUT_PR") = Me.Tbhautpr.Text 'num single
        dtr_Points("EXCEN") = Me.TbExcen.Text 'Num single
        dtr_Points("CDE_PT") = Me.TbCdept.Text 'Integer
        dtr_Points("CDE_LI") = Me.TbCdeli.Text ' Integer
        dtr_Points("COORDX") = Me.TbCoordX.Text 'Num double
        dtr_Points("COORDY") = Me.TbCoordY.Text 'Num double
        dtr_Points("COORDZ") = Me.TbcoordZ.Text 'Num double
        dtr_Points("COMMENT") = Me.TbComment.Text 'String
        dtr_Points("FILE") = Me.TbFile.Text 'String
        dtr_Points("LiNum") = Me.TbLinum.Text 'Long Integer

        'création et exécution du commandbuilder
        'pour mettre à jour le DataAdapter
        cmdb_Points = New OleDbCommandBuilder(dta_Points)

        'mise à jour des données du DataAdapter
        'à partir du commandbuilder
        dta_Points.Update(dts_Points, "Points") - L'erreur se déclenche ici.

        'on vide le dataset pour le recréer avec
        'les nouvelles données
        dts_Points.Clear()
        dta_Points.Fill(dts_Points, "Points")
        dtt_Points = dts_Points.Tables("Points")
        dtv_Points = dts_Points.Tables("Points").DefaultView

        'mise à jour de la datagridview

        DataGridView1.DataSource = dtv_Points

        'retour au début du fichier
        rownum = 0

        'affichage des données dans les texbox

        TbpointToDttPoint()

        MessageBox.Show("Les données sont modifiées !", "Modification...", MessageBoxButtons.OK, MessageBoxIcon.Information)

    End Sub
merci de votre aide

pascal

4 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
C'est justement ce que semble dire le message d'erreur : il manque une clé primaire sur ta base.

Pour pouvoir mettre à jour les données le moteur ado a besoin de pouvoir les identifier. Comme c'est en automatique, tu ne lui fournie pas la clause Where de la requette, c'est à lui de la construire. Et il ne peut la construire que si la base contient une clé primaire permettant d'identifier de manière unique chaque enregistrement.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
L'erreur que tu obtient signifie que la table source n'est pas valide.

Par contre, lors de l'appel de la methode Update du DataAdapter, normalement on ne passe que le DataSet, pas la table. C'est tout le DataSet qui est mis à jour. Ca pourrait etre peut-etre la source de l'erreur.

Autre chose, le détail de l'erreur pourait laisser supposer qu'aucune information sur une colonne clé n'est remontée. As-tu définie une clé primaire dans ta table ????

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
8
Date d'inscription
mardi 12 décembre 2006
Statut
Membre
Dernière intervention
5 mars 2008

merci pour ton aide

1 - la table source est pour moi valide
      je travaillé d'abord avec une source Access 97 que j'ai transformé en Access 2000 pour resté plus en adéquation avec ADO je crois.
       Dans mon formulaire je charge les données avant d'effectuer des modification.
       Comment faire pour connaître la validation d'une table?
2 - Dans le tuto on donne bien les instructions suivante   
               -récupération de la ligne
               dtr = dts.Tables("table").rows(rownum)
                -modification des données
               dtr("champs1")= me.txt1.Text
               .......
               -création et exécution du CommandBuilder pour le DataAdapter à jour
                cmdb = newOleDbCommandBuilder(dta)
               -Mise à jour des donnée du DataAdapter à partir du Commandbuilder
               dta.Update(dts,"tables")

      Hors faute de décryptage je ne vois pas l'erreur dans cette méthode
   3   -   Il n'y a pas de clé primaire

Bref je suis encore loin de la jouissance finale

Merci de partager ta force.

pascal
Messages postés
8
Date d'inscription
mardi 12 décembre 2006
Statut
Membre
Dernière intervention
5 mars 2008

Casy,

J'ai été trop rapide pour mettre une clé primaire à ma table et  j'ai oublié de te remercier.
Encore une fois la solution était simple et ne dépandait nullement de la programmation mais probablement d'un manque d'expérience de ma part. 

Encore une fois

Merci pour le partage de ta force.

pascal