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

Linq Discussion :

[LINQ to SQL] "select" sans les données ajoutées


Sujet :

Linq

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 59
    Points
    59
    Par défaut [LINQ to SQL] "select" sans les données ajoutées
    Bonjour,

    Je souhaite faire une suite de modifications via un DataContext (généré par SqlMetal). Au début du traitement, j'ajoute des enregistrements dans une des "tables". Plus avant dans le code, cette "table" est utilisée dans une jointure. Problème : à ce moment, la table ne contient PAS les données ajoutées. Pourtant le "select" est construit après les ajouts...

    Pour info :
    1) les ajouts sont réalisés via InsertOnSubmit()
    2) ca marche si je réalise un SubmitChanges() "entre deux", c'est à dire après les ajouts et avant de retravailler avec la "table" : cependant j'aimerais réaliser la totalité des opérations dans le cadre d'une transaction, afin de tout annuler en bloc au moindre problème...
    3) J'ai essayé de conserver les SubmitChanges intermédiaires et de placer tout le code dans un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using( var scope = new TransactionScope() ) { ... }
    mais je rencontre un autre problème lors de l'appel à une fonction d'une assembly : cette fonction n'a jamais posé de problème à ce jour, elle prend en parametre une connectionString et fait grosso-modo un bête select sur une table (non modifiée par le "code linq") : texte de l'erreur :
    L'accès réseau de MSDTC (Distributed Transaction Manager) a été désactivé
    Voyez-vous une solution à mon problème ?

    D'avance MERCI !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Essaie en utilisant une transaction explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    using (DbTransaction transaction = dataContext.Connection.BeginTransaction())
    {
        // ...
     
     
        transaction.Commit();
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 59
    Points
    59
    Par défaut
    Pas mieux

    Message d'erreur :
    ExecuteReader implique que la commande comporte une transaction lorsque la connexion attribuée à la commande se trouve dans une transaction locale en attente. La propriété Transaction de la commande n'a pas été initialisée.
    Extrait du code :

    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
     
    private DataContextBaseTest _db = null;
    ...
    _db = new DataContextBaseTest(<chaine de connexion>);
    ...
    _db.Connection.Open();
    using( var transaction = _db.Connection.BeginTransaction() )
    {
    var listeEnreg =
        _db.TableDeTravail
        .Where(s => s.ColonneTest != null && s.ColonneTest.Trim() != "")
        .Select(s => s.AutreColonne)
        .Distinct()
        .ToArray();
    // plantage du code ci-dessus
    }
    Aurais-tu une autre idée ?

    Pas moyen de demander à LINQ de travailler "en mémoire", quitte à "pré-charger" certaines "tables" ?

    Je suis surpris : mettre à jour un dataContext, puis faire un select avec prise en compte des mises à jour, ça doit être possible sans en passer par une "inscription dans la base" ? Ou au pire dans le cadre d'une transaction ?

    Toute aide bienvenue !

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Et si tu ajoutes ça au début du using ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _db.Transaction = transaction;

    Je suis surpris : mettre à jour un dataContext, puis faire un select avec prise en compte des mises à jour, ça doit être possible sans en passer par une "inscription dans la base" ?
    Non, le Select prend toujours ce qu'il y a en base... les modifications que tu as faites ne sont visibles qu'après le SubmitChanges

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 59
    Points
    59
    Par défaut
    Cela fonctionne !

    De façon un peu plus concise, on peut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    using( _db.Transaction = _db.Connection.BeginTransaction() )
    {
    ...
    _db.Transaction.Commit();
    }
    Merci beaucoup pour ton aide !

  6. #6
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Les transactions scope utilise le service msdtc qui est désactivé par défaut, il suffit de le lancer

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

Discussions similaires

  1. [SQL] une date mais sans les jours
    Par cyberps2 dans le forum Requêtes
    Réponses: 7
    Dernier message: 05/06/2008, 15h53
  2. Script sql recupérant la structure ET les données.
    Par __fabrice dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/01/2006, 14h17
  3. [SQL SERVER/ORACLE] Comment migrer les données?
    Par ducho dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 08/12/2005, 11h18

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