IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Updater que les records modifies, Pas toute la Table


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut Updater que les records modifies, Pas toute la Table
    Bonjour,

    J'ai un datagridview lie a une base Access. Le dataset qui alimente la grid ne correspond pas a la table dans la base: pour mettre a jour les donnees, j'ai du preciser la requete pour l'update.

    Cependant, l'update tente de recopier la ligne modifiee sur tous les records, au lieu d'affecter seulement les records modifies. Si je detruis les colonnes rajoutees au dataset pour que ce dernier ressemble a la table, et supprime la requete d'update, seuls les records modifies sont affectes. D'ou ma question: Comment preciser que seuls les records modifies sont a updater.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    //Load the dataset and feed the grid
    private void setDataGridViewList(String fundID)
            {
                try
                {
                    adapterDataGrid = new OleDbDataAdapter("select ID, Date, Return, NAV, FundsManaged, StrategyAUM, BusinessAUM, Data,  Estimate, Net,GrossLong, GrossShort, GrossTotal, Vami, CumulatedReturn, LastUpdated from Performance where ID=" + fundID + " order by Date;", conn);
     
                    if (myDataset.Tables["Datagrid"] != null)
                    {
                        myDataset.Tables["Datagrid"].Clear();
                    }
     
                    adapterDataGrid.Fill(myDataset, "DataGrid");
                    this.dataGridView_FundList.DataSource = myDataset.Tables["Datagrid"];
                    commandBuilderDataGrid = new OleDbCommandBuilder(adapterDataGrid);
     
    //Ajout de colonnes dans le Dataset...
     
    }
     
    //Update the DB
    private void btn_Save_Click(object sender, EventArgs e)
            {
                try
                {
                    this.Validate();
     
                    adapterDataGrid.UpdateCommand = new OleDbCommand("Update Performance SET ID=?, [Date]=?, Return=?, FundsManaged=?, NAV=?, LastUpdated=?, StrategyAUM=?, BusinessAUM=?, Data=?, Estimate=?, Net=?, GrossLong=?, GrossShort=?, GrossTotal=?", conn);              
                    adapterDataGrid.UpdateCommand.Parameters.Add("ID", OleDbType.Integer, 5, "ID");
                    adapterDataGrid.UpdateCommand.Parameters.Add("Date", OleDbType.DBDate, 5, "Date");
                    adapterDataGrid.UpdateCommand.Parameters.Add("Return", OleDbType.Double, 10, "Return");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@FundsManaged", OleDbType.Double, 10, "FundsManaged");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@NAV", OleDbType.Double, 10, "NAV");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@LastUpdated", OleDbType.DBDate, 5, "LastUpdated");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@StrategyAUM", OleDbType.Double, 5, "StrategyAUM");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@BusinessAUM", OleDbType.Double, 5, "BusinessAUM");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@Data", OleDbType.VarChar, 5, "Data");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@Estimate", OleDbType.Boolean, 5, "Estimate");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@Net", OleDbType.Double, 5, "Net");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@GrossLong", OleDbType.Double, 5, "GrossLong");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@GrossShort", OleDbType.Double, 5, "GrossShort");
                    adapterDataGrid.UpdateCommand.Parameters.Add("@GrossTotal", OleDbType.Double, 5, "GrossTotal");
     
    adapterDataGrid.Update(myDataset.Tables["DataGrid"]);
     
    //...
     
    }
    Je rate peut etre une option par defaut que je dois preciser, ou ma methode n'est simplement pas la bonne. Avez vous une idee ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Bonjour,

    Il me semble qu'il existe une fonction sur les dataset nommée "GetChanges" qui peut ne pas prendre de paramètre (elle retourne alors toutes les lignes modifiées (insérées, modifiées et supprimées)) ou tu peux lui spécifier quel type de modif tu veux uniquement (et dans ce cas elle ne retourne que les lignées par exemple modifiées si tu veux que les modifiées)...

    Bon courage

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Il me semble qu'il faut une clause WHERE qui se réfère aux valeurs avant modification du record à modifier.

  4. #4
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Tu peux tester l'etat de chaque ligne de ton DataSet. Il y a plusieurs etats:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DataRowState.Added;
    DataRowState.Deleted;
    DataRowState.Modified;
    DataRowState.Unchanged;
    Tu peux boucler sur toutes les lignes qui ont recu des changements grace a la methode GetChanges() et n'updater que les Row dont l'etat est Modified:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach(DataRow MyRow in myDataset.Tables["DataGrid"].GetChanges())
    {
        if(MyRow.RowState == DataRowState.Modified)
        {
            adapterDataGrid.Update(MyRow);
        }
    }
    C'est cela que tu cheches ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut
    Merci pour toutes vos reponses. Je cherchais a updater la base de maniere automatique, ie sans a avoir a boucler sur chaque enregistrement comme le proposait Contrec. L'inclusion de la clause where levait une exception car je devais passer en parametre une valeur deja incluse dans le select.

    J'ai cependant resolu le probleme: Le dataset n'a pas a avoir la meme structure que la table qui l'alimente pour la mettre a jour. Dans le code de mon premier post, j'ai supprime la requete en update et toute la partie sur les liaisons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.Validate();
    adapterDataGrid.Update(myDataset.Tables["DataGrid"]);
    Le dataset met alors a jour que les lignes modifiees, sans que je n'ai a preciser
    - la correspondance entre les champs
    - les lignes qui doivent etre amendees.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/04/2014, 16h17
  2. [AC-2010] Enable = False sur un record et pas toute une table
    Par lefabe dans le forum VBA Access
    Réponses: 0
    Dernier message: 10/04/2014, 12h05
  3. Réponses: 1
    Dernier message: 31/10/2013, 10h36
  4. Ne mettre à jour que les données modifié
    Par demanghonj dans le forum Hibernate
    Réponses: 3
    Dernier message: 10/06/2009, 15h21
  5. Récupérer grâce à une requête SQL que les champs modifiés
    Par guigui11 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 29/08/2006, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo