Mise à jour vers base de données

cs_diga Messages postés 2 Date d'inscription samedi 2 décembre 2006 Statut Membre Dernière intervention 7 décembre 2006 - 6 déc. 2006 à 20:48
cs_diga Messages postés 2 Date d'inscription samedi 2 décembre 2006 Statut Membre Dernière intervention 7 décembre 2006 - 7 déc. 2006 à 00:40
Bonjour,

Je suis entrain de créer un programme ou j'utilise un datagridView lié par un BindingSource à un dataset dont les données proviennent d'une BD SQL SERVER.

L'utilisateur peux effectuer des modifications (ajout, suppression, retrait) sur les données de la table vie le datagrid view remplit par une commande SQL dont voici le code épuré.


                1    DbDataAdapter ODA;
                2    ODA = dbpf.CreateDataAdapter();
                3    ODA.SelectCommand = oConn.CreateCommand();
                4    ODA.SelectCommand.CommandText = "select * FROM acteurs WHERE nom= '" + listBoxActeurs.SelectedItem + "'";
               5     ODA.Fill(dataSetInfo, "acteur");




Pour modifier les requètes SQL d'ajout, suppression ou modification en fonction des lignes mises à jour, j'ai utilisé un transtypage sur le DbDataAdapter vers un SqlDataAdapter de manière à pouvoir utiliser les évênements RowUpdating et RowUpdated. Puis je crée mes commandes Update, Insert et Delete comme ça.

              //transtypage temporaire
        6    sqlDA = (SqlDataAdapter)ODA;
        7    sqlDA.RowUpdating += new SqlRowUpdatingEventHandler(sqlDA_RowUpdating);
        8    sqlDA.RowUpdated += new SqlRowUpdatedEventHandler(sqlDA_RowUpdated);

               //création des commandes
        9     ODA.UpdateCommand = oConn.CreateCommand();
        10   ODA.InsertCommand = oConn.CreateCommand();
        11   ODA.DeleteCommand = oConn.CreateCommand();
            
               //mise à jour vers la BD
        12   ODA.Update(dataSetInfo, "films");

        13    void sqlDA_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
        14    {
        15    string commandeSQL;
           
        16    //si c'est un update*
        17    if (e.StatementType == StatementType.Update)
        18    {
        19    //ici je modifie la requète pour l'update
        20    }
         
        21    //si c'est un insert
        22    if (e.StatementType == StatementType.Insert)
        23    {
        24       
//ici je modifie la requète pour l'insert

        25    }

        26    //si c'est un delete*
        27    if (e.StatementType == StatementType.Delete)
        28    {
        29       
//ici je modifie la requète pour l'insert

        30    }    
        31    }

Mon problème est que tout ce passe bien tant que l'utilisateur ne fait pas 2 modifications de type identique avant de lancer la mise à jour vers la base de données (via un bouton). C'est à dire que s'il y a 2 modification et/ou 2 insertions et/ou 2 delete, une exception se produit sur la ligne ODA.Update(dataSetInfo, "films"); avec le message suivant:

exception: l'index (de base 0) doit être supérieur ou égal à 0 et inférieur à la taille de la liste de ses arguments

Après de longues recherches sur le net et sur ce site, je ne comprends toujours pas d'où provient ce genre d'erreur.

J'ai aussi un autre problème qui n'a rien (je pense) en commun avec le premier, c'est que dans mes requète, certaine donnée que j'ajoute ou modifie possède des quotes ( ' ) et ca fout en l'aire la requète SQL qui croit que c'est le délimiteur de fin de champs tetxe.

Voilà, je pense avoir été le plus précis possible mais si vous avez besoin d'autres détail n'hésitez pas.

Un grand merci d'avance à tous ceux qui tenteront ou qui pourront m'aider

2 réponses

IslandMan974 Messages postés 104 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 27 juin 2007 3
7 déc. 2006 à 00:27
salut,

je ne sais pas exactement comment est  codée l application mais en genaral ce genre d'erreur et generée lorsque  qu'on q une condition sur des composants a dimensions.(tableaux....des choses dans ce genres la)

En fait  "index de base 0 " signifie que ton tableau, par exemple,sur lequel tu doit surement opérer une condition  doit commencer à 0 .

Pour moi ca vient soi d4un tableaux ,soit de ton dataset ....

Bon courage
0
cs_diga Messages postés 2 Date d'inscription samedi 2 décembre 2006 Statut Membre Dernière intervention 7 décembre 2006
7 déc. 2006 à 00:40
Bonjour,

Oui j'ai vérifié celà mais le seul tableau que j'utilise dans toute l'application est le tableau des tables qui sont contenues dans le dataset.
C'est d'ailleurs sur la ligne ODA.Fill(monDataset, MaTable) que l'application s'arrête mais j'ai déjà utilisé plein de fois cette table dans l'apllication sans problème et avec la même syntaxe.
De plus ça fonctionne tant que 2 modifications du même types (ajout, suppresion, modif) ne soient executée dans la même MAJ vers la base.

ex:
j'ajoute une ligne, j'en efface une autre et j'en modifie une troisième  -->> ca fonctionne
J'efface 2 lignes ou je modifie 2 lignes -->> EXCEPTION

merci
0
Rejoignez-nous