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

Accès aux données Discussion :

Restaurer une base de données / annuler toute modification


Sujet :

Accès aux données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Par défaut Restaurer une base de données / annuler toute modification
    Bonjour,
    je développe une application de gestion de comptes bancaire, qui nécessite donc la sauvegarde et l'accès aux données dans une base.

    1. Lors d'une session l'utilisateur peut insérer/supprimer des données en base et les requêtes à venir doivent prendre en compte ces modifications.

    2. A la fin de la session (quand on quitte l'appli) il doit être possible d'annuler toutes les modifications effectuées en base par l'utilisateur (ajout, suppression, mise à jour etc).

    Pour le moment j'utilise Linq To Sql, qui fait bien le boulot pour le point 1, mais je bloque au point 2.

    Quelle solution me conseillez vous ?
    - Méthode bourrin : Faire une copie de la BDD en début de session et travailler sur une BDD temporaire. Si l'utilisateur annule on supprime la BDD temporaire, sinon on remplace la BDD par la BDD temporaire ?
    - Utiliser un TransactionScope (testé mais je n'ai pas réussi à l'utiliser pour le point 2).
    - Changer de techno ? Si oui avez vous un exemple illustrant le point 2 ?
    - Autre proposition ?

    Merci de votre aide.

  2. #2
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Salut

    A priori je pense que l'utilisation des transactions est suffisante.

    Pour annuler, il suffit de faire un rollback sur ta transaction pour annuler toutes les modifications de l'utilisateur qui n'ont pas été "commit".

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Par défaut
    Pouvons nous avoir un peu plus de détail (web / winform) ? Version du Framework (3.5) ?

    Si les données sont unique pour chaque client, c'est à dire qu'il n'existe pas de données transversale (utilisé par plusieurs clients en même temps) alors tu peux faire un contexte générale par connexion. Si je ne me trompe pas, tu dois faire "context.SaveChanging()" pour valider tes changements ? et bien ton contexte peut rester ouvert tout le long de ta manipulation des données et tu fais la sauvegarde que quand tu as besoin de la faire.

    Sinon les transaction avec Commit et RollBack fonction très bien pour ça, ce qui revient aux même que de faire ce que je t'ai dis.

    Sinon tu structures ta base de données autrement. Dans le cas par exemple où tu aurais besoin de sauvegarder tes manipulations et pouvoir les manipuler plus tard sans qu'elles aient été enregistré dans les données principales. Et bien tu crées des tables tampons, qui permettent de stockés les pré-modifications.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 224
    Par défaut
    L'application est du type Winform avec le Fw 3.5.

    Je ne dois pas avoir bien saisi l'utilisation des transactions. J'ai vu un peu partout ce type de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    using (TransactionScope scope = new TransactionScope()) 
    { 
       MaTable.InsertOnSubmit(UneNouvelleLigne);
       MaTable.SubmitChanges();
       scope.complete();
    }
    En procédant ainsi, les données sont sauvées en base si tout se passe bien, (pas de rollback possible), et le rollback est automatique si SubmiChanges plante par exemple, ou si on enlève scope.Complete(). C'est bien pour une opération ponctuelle mais pas pour une session entière, à moins d'avoir un seul TransactionScope global à l'application, j'ai donc tenté ça :

    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
     
    public class MaClasse:Form
        {
            ...
            //Déclaration d'un TransactionScope global à l'application
            TransactionScope ts;
            ...
     
            public MaClasse()
            {
                InitializeComponent();
     
                ts = new TransactionScope();
                ...
            }
     
            //Tout enregistrer
            private void buttonEnregistrer_Click(object sender, EventArgs e)
            {
                ts.Complete();
                ts = new TransactionScope();
            }
     
            //Tout annuler
            private void buttonAnnuler_Click(object sender, EventArgs e)
            {
                ts.Dispose();
                ts = new TransactionScope();
            }
        }
    Ça marche, c'est à dire que les points 1 et 2 de mon premier message sont satisfait, sauf que du moment ou ts.Complete() ou ts.Dispose() sont appelés, j'ai beau détruire et reinstancier ts, je ne peux plus insérer de ligne dans la table.

  5. #5
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Regarde le dernier paragraphe de cet article.
    Il explique comment mettre en place des transactions sans TransactionScope

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Méthode bourrin : Faire une copie de la BDD en début de session et travailler sur une BDD temporaire. Si l'utilisateur annule on supprime la BDD temporaire, sinon on remplace la BDD par la BDD temporaire ?
    Pourquoi pas monter une VM pour chaque utilisateur aussi!!!

    Je rêve...

    Pendant la session, insérez vos données dans des tables 'sessions'.

    S'il annule à la sortie... purgez vos tables, sinon lancez un batch (Procédure stockée) mettant à jour la base de données à partir des tables sessions puis purgez les.

    Mais le fonctionnement que vous recherchez me semble bien etrange...

Discussions similaires

  1. Restaurer une base de données
    Par Msysteme dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 29/06/2011, 07h38
  2. Comment restaurer une base de données ?
    Par CMagda dans le forum Débuter
    Réponses: 1
    Dernier message: 23/01/2009, 14h05
  3. Restaurer une base de données sous SQL Serveur
    Par TINAVONJ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/09/2008, 13h11
  4. [Débutant] Restaurer une base de données .Bak
    Par digital prophecy dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/08/2006, 14h14
  5. Réponses: 2
    Dernier message: 22/12/2005, 10h05

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