Précédent   Forum des professionnels en informatique > Dotnet > Accès aux données > Linq
Linq Forum d'entraide sur la manipulation de données avec Linq
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/10/2011, 08h56   #1
Membre du Club
 
Inscription : août 2004
Messages : 216
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 216
Points : 44
Points : 44
Par défaut Linq To Sql - Rollback

Bonjour,
je débute avec Linq to SQL, et j'ai une question au sujet du Rollback.
J'insère des données en base que j'ai besoin d'utiliser immédiatement.
Donc pour ça je fais :
Code :
1
2
MaTable.InsertOnSubmit(UneNouvelleLigne);
MaTable.SubmitChanges();
Mais y a-t-il un moyen de revenir en arrière, une sorte de Rollback.
Sinon, existe-t-il une autre solution pour insérer des données en bases, les utiliser et annuler les changements ?
flzox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 09h10   #2
Membre Expert
 
Avatar de GuruuMeditation
 
Homme Olivier Matis
Software Architect
Inscription : octobre 2010
Messages : 767
Détails du profil
Informations personnelles :
Nom : Homme Olivier Matis
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Software Architect
Secteur : Conseil

Informations forums :
Inscription : octobre 2010
Messages : 767
Points : 1 577
Points : 1 577
Envoyer un message via MSN à GuruuMeditation
Si tu veux faire un rollback, tu dois utiliser les transactions. Exemple :

Code c# :


Code :
1
2
3
4
using (TransactionScope scope = new TransactionScope()) 
{ 
...
}
__________________
Microsoft MVP : Visual C#

MCPD - Windows Developer 4
MCPD - Web Developer 4
MCTS - Silverlight 4, Development

“If debugging is the process of removing bugs, then programming must be the process of putting them in.”
(Edsger W. Dijkstra)
GuruuMeditation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 09h22   #3
Membre du Club
 
Inscription : août 2004
Messages : 216
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 216
Points : 44
Points : 44
Merci pour la réponse,
je vais regarder du côté de TransactionScope alors.
flzox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h56   #4
Membre du Club
 
Inscription : août 2004
Messages : 216
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 216
Points : 44
Points : 44
J'essaye d'utiliser le transactionScope mais j'ai un problème.
Je vois partout qu'il s'utilise de cette manière :

Code :
1
2
3
4
5
6
7
 
using (TransactionScope scope = new TransactionScope()) 
{ 
   MaTable.InsertOnSubmit(UneNouvelleLigne);
   MaTable.SubmitChanges();
   scope.complete();
}
Donc en gros il y a rollback si une exception est levée dans le bloc TransactionScope.
Seulement mon bloc TransactionScope n'est pas local mais global à l'application. Le commit se fait lorsque l'utilisateur clique sur "enregistrer" et il y a rollback s'il fait "annuler les modifications".

Donc j'ai plutôt fait ça :

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
 
 public class MaClasse:Form
    {
        ...
        //Déclaration d'un TransactionScope global à l'application
        TransactionScope ts;
        ...
 
        public MaClasse()
        {
            InitializeComponent();
 
            ts = new TransactionScope();
            ...
        }
 
        private void buttonEnregistrer_Click(object sender, EventArgs e)
        {
            ts.Complete();
            ts = new TransactionScope();
        }
 
        private void buttonAnnuler_Click(object sender, EventArgs e)
        {
            ts.Dispose();
            ts = new TransactionScope();
        }
    }
Ça ne marche pas car 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.
flzox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 09h32   #5
Membre du Club
 
Inscription : août 2004
Messages : 216
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 216
Points : 44
Points : 44
Personne n'a déjà été confronté a cette problématique ?
Je me demande si le transactionScope est le bon objet à utiliser ...
flzox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 11h25   #6
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 352
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 352
Points : 9 745
Points : 9 745
Citation:
Envoyé par flzox Voir le message
Personne n'a déjà été confronté a cette problématique ?
A vrai dire, presque personnes n'utilise Link2Sql, ses inconvénients dépassant largement ses bénéfices.

Citation:
Je me demande si le transactionScope est le bon objet à utiliser ...
Avec Linq To Entities en tout cas, c 'est ce qui est utilisé habituellement.
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 30/11/2011, 13h03   #7
Membre du Club
 
Inscription : août 2004
Messages : 216
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 216
Points : 44
Points : 44
Que faut-il que j'utilise alors ?

Mon besoin est très simple, je développe une application de gestion de budget, et j'ai donc besoin, entre autre, de stocker les opérations, de faire des requêtes, de tout annuler à n'importe quel moment, etc, bref les manipulations classiques de ce genre d'application.

Avec LinqToSql j'arrive à faire tout ça, sauf le rollback "global" dont je parle dans ce sujet.
J'ai regardé Linq To Entities, mais ça m'a eu l'air compliqué à mettre en place pour mon besoin et surtout, si c'est l'objet TransactionScope qui utilisé le problème reste le même.

Edit :
La solution serait peut-être de ne pas faire de submitChanges tant que l'utilisateur n'a pas cliqué sur "sauvegarder", et pour les requêtes, d'utiliser les opération sauvegardée en base + celles contenues dans DataContext.GetChangeSet();

Ou alors travailler sur une copie de la BDD tout simplement.

Qu'en penez vous ? J'ai l'impression de faire du bricolage et qu'une solution plus "élégante" existe.
flzox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 22h00   #8
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Citation:
Envoyé par flzox Voir le message
La solution serait peut-être de ne pas faire de submitChanges tant que l'utilisateur n'a pas cliqué sur "sauvegarder", et pour les requêtes, d'utiliser les opération sauvegardée en base + celles contenues dans DataContext.GetChangeSet();
Ou alors travailler sur une copie de la BDD tout simplement.
Vu que les modifications successives sont susceptibles d'être annulées alors autant les stockées en mémoire et les enregistrées que si l’utilisateur clique sur le bouton valider. Le bouton annuler quant à lui fera appel juste à la méthode Refresh de ton contexte pour annuler les modifications en mémoire et remplacer les valeurs par celles de la base de données.
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 11h00   #9
Membre du Club
 
Inscription : août 2004
Messages : 216
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 216
Points : 44
Points : 44
Citation:
Envoyé par h2s84 Voir le message
Vu que les modifications successives sont susceptibles d'être annulées alors autant les stockées en mémoire et les enregistrées que si l’utilisateur clique sur le bouton valider. Le bouton annuler quant à lui fera appel juste à la méthode Refresh de ton contexte pour annuler les modifications en mémoire et remplacer les valeurs par celles de la base de données.
Tu aurais un exemple parce que ça m'a l'air intéressant mais j'ai du mal à comprendre ?

Edit :
J'arrive à annuler des modif avec un objet DbTransaction global, mais après un Transaction.Rollback(); les clés primaires des objet "rollbackés" sont a priori gardé en mémoire car il m'est impossible de les insérer de nouveau, j'obtiens une exception lors du submitChanges() :
Impossible d'ajouter une entité avec une clé déjà en cours d'utilisation.
flzox est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h30.


 
 
 
 
Partenaires

Hébergement Web