Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données
Accès aux données Forum d'entraide sur les technologies d'accès aux données de Microsoft (ADO.NET, Linq, Entity Framework, etc.).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/11/2012, 12h06   #1
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
Par défaut Mise à jour champ base automatiquement

Bonjour,

J'ai Table1 contenant les champs
- Champ1
- ...
- Champ999
- TraceDateDerniereMiseAJourEnregistrement
- TraceLogginAyantFaitLaDernièreMiseAJour
J'espère être clair dans mes noms de champs!

L'utilisateur se logue à mon application. Dans une windows form il navigue (bindingnavigator) sur tous les enregistrements de Table1. Je veux pour tout enregistrement modifié, modifier automatiquement les champs de 'trace'.
Sur le Windows form j'ai un dataset et un bindingsource. Puis-je faire cela directement dans une partie code du dataset (comme je peux le faire en entity framework)? Sinon, sur quel évènement du bindingsource (ou du dataset) puis-je mettre un bout de code pour être sûr qu'il ne s'exécutera QUE lorsque l'utilisateur aura modifié un enregistrement.
J'ai essayé sur le bindingSource curentItemChanged, CurrentChanged, ListChanged mais ces évènement sont levés même si je ne modifie pas d'enregistrement...

Merci de m'aiguiller vers LA solution parfaite qui me ferait gagner du temps.
Laumon.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 12h31   #2
sisqo60
Membre Expert
 
Avatar de sisqo60
 
Homme
Consultant informatique
Inscription : février 2006
Messages : 730
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : février 2006
Messages : 730
Points : 1 147
Points : 1 147
Bonjour,

Il n'y a pas de solution parfaite, il n'y a que des solutions adaptées à tes besoins.
Une solution serait un trigger en base de données sur ta table.

Bon dév.
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

N'oubliez pas de avant de
Pas de question techniques par MP, c'est contre la philosophie du forum
sisqo60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 12h37   #3
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
Le trigger passerait pour la date, mais le login utilisateur est dans l'application. C'est à ce niveau que je bloque et c'est pourquoi je souhaite gérer ça dans l'application.
Laumon.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2012, 12h57   #4
sisqo60
Membre Expert
 
Avatar de sisqo60
 
Homme
Consultant informatique
Inscription : février 2006
Messages : 730
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : février 2006
Messages : 730
Points : 1 147
Points : 1 147
Tu as une propriété HasChanges() sur le dataset et ensuite GetChanges() pour récupérer les modifications.
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

N'oubliez pas de avant de
Pas de question techniques par MP, c'est contre la philosophie du forum
sisqo60 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/11/2012, 14h57   #5
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
Bien, bien, bien...
Alors en m'inspirant de l'excellent conseil de sisqo60 ( +1 pour toi ) j'ai créé une petite void de trace appelée avec un dataset et un nom de table. Je définis toujours mes champs de trace avec les mêmes noms (DateCre, DateMaj, Utilisateur).
Ci-dessous le code que ça donne.
Code :
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
        private void Table1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.Table1BindingSource.EndEdit();
 
            if (dataSet1.HasChanges(DataRowState.Modified | DataRowState.Added))
            {
                TraceValues(ref dataSet1, "Table1");
            }
            this.tableAdapterManager.UpdateAll(dataSet1);
        }
 
        private void TraceValues(ref dataSet1 dataSet, string pTableTracee)
        {
            foreach (DataRow row in dataSet.Tables[pTableTracee].Rows)
            {
                if (row.RowState == DataRowState.Modified)
                {
                    row["Utilisateur"] = "Login";
                    row["DateMaj"] = DateTime.Now;
                }
                if (row.RowState == DataRowState.Added)
                {
                    row["Utilisateur"] = "Login";
                    row["DateCre"] = DateTime.Now;
                }
            }
        }
Remarquez que je n'ai pas utilisé le getChanges(), donc je suis obligé de parcourir toutes les lignes de la table. Le GetChanges() crée un nouveau Dataset "déconnecté" du dataset d'origine, donc le résultat d'un updateAll sur ce dataset2 ne met pas à jour le windows form. il faudrait ensuite recharger les données du formulaire. S'il y a une solution que je ne connais pas, je suis preneur.
Je ne sais pas qu'est-ce qui est le plus rapide. Je suppose que (pour mes données) le parcours d'un dataset en mémoire est moins consommateur en temps qu'une relecture des données en base. J'ai donc opté pour la solution que je vous présente ici.

Laumon.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h04.


 
 
 
 
Partenaires

Hébergement Web