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 :

Abandon/Stop requete linQ to SQL


Sujet :

Linq

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 47
    Points
    47
    Par défaut Abandon/Stop requete linQ to SQL
    Bonjour,

    Je cherche le moyen d'abandonner une requete linQ to Sql en cours ??

    Exemple de problème :
    Je lance une série de requêtes (qui peut prendre pas mal de temps) à partir d'un thread dans mon application ( backgroundworker), j'abandonne mon thread puis je le relance très peu de temps après.. --> Erreur de linQ !

    Différentes peuvent m'arriver :
    - La requête contient des références a des élements définis dans un autre contexte de données.
    - Opération non valide. La connexion est fermée.
    - Un DataReader associé à cette Command est déjà ouvert. Il doit d'abord être fermé.

    Sincerement la j'essaie de bidouiller, je suis à la rue..

    Il faut savoir que mes requêtes sont lancées les une après les autres, j'ouvre et ferme la connexion à chaque fois, les requêtes se trouvent dans différentes fonctions qui sont utilisés à plusieurs endroits dans mon application (j'ai une classe static contenant toutes mes fonctions avec mes requetes vers la BDD).

    Lorsque j'annule l'action de mon thread, dois-je tuer mon objet de connexion à la base, me reconnecter ?
    Si vous pouvez m'éclaircir un peu...

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Si la version de ton Framework.NET est au minimum à 4, je te conseille fortement d'oublier les classes "BackgroundWorker" et "Thread" et je te conseille d'utiliser à la place la classe "Task". De plus si tu es en version 4.5 du Framework, les mots clés "async" et "await" pourraient bien t'aider.

    Pourquoi utiliser "Task" plutôt que "Thread" est mieux? Parce que, entre autres, la classe "Task" permet une annulation propre des tâches asynchrones en permettant à la tâche lancée de décider à quel moment précis la tâche peut s'annuler, alors que pour la classe "Thread", on "tue" le thread ce qui n'est pas terrible, surtout pour des opérations critiques. A ce sujet, cherche avec Google sur les mots clés "Task", "async", "await", "cancellationtoken" et regarde la gestion des tâches et le système de jetons d'annulation.

    Donc, du coup, avec le Framework 4.5, les classes SQL de Microsoft se voient ajouter de nouvelles méthodes terminées avec "Async" (exemple : "OpenAsync", "ExecuteReaderAsync") qui permettent d'exécuter les méthodes correspondantes d'une manière asynchrone et en permettant l'arrêt "propre" de la requête grâce au système de jeton d'annulation que j'ai mentionné.

    Après, tu vas me dire, oui mais avec Linq To SQL alors, où vais-je mettre mon jeton d'annulation? C'est vrai que c'est la partie la plus compliquée. Cela dit, j'ai trouvé une page qui, à partir du "IQueryable" de ta requête Linq To SQL permet de retrouver l'objet "SqlCommand". Après, il n'y a plus qu'à exécuter cette commande en asynchrone en lui passant le jeton d'annulation.
    Cette page est ici. Tu la consulteras bien après t'être documenté sur la classe "Task", le "Task asynchronous pattern" et les jetons d'annulation.

    En tous cas, c'est la meilleure solutions si, à l'arrivée, tu veux avoir quelque chose de propre. Car, comme tu peux le constater, faire la même chose avec juste la classe "Thread" c'est galère (sans compter en plus les remontées d'exceptions qui restent sur son thread!...)

    [EDIT] Bon, j'ai été un peu fort en disant d'oublier aussi la classe "Thread" car DonQuiche me dirait qu'il y a des scénarios dans lesquels c'est quand même utile...
    Dernière modification par Invité ; 02/04/2014 à 09h19.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Merci beaucoup pour ton aide et ton orientation !

    En ce qui concerne mon Framework je suis en version 4, je n'aurais donc pas accès aux mots clé 'async', 'await'. Mais je ne connais pas cette classe 'Task', je vais donc me documenter dessus d'ici quelques jours !
    Je n'ai pas accès au lien non plus depuis mon environnement de travail, je regarderais ça chez moi !

    Mais la méthode 'CancelAsync()' du backgroundworker peut permettre aussi de tuer proprement la tâche asynchrone lancée ? Sauf que cela fonctionne seulement que si le traitement de cette tâche est effectuée dans la méthode 'doWork()' du backgroundwork.. Donc pour une tâche lancé avec linQ to sql ce n'est pas évident ! Mais du coup je vais regarder ton lien qui peut m'aider sur ce problème !

    Encore merci, je répondrais d'ici quelques jours.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour NazOok,

    C'est vrai que la classe "BackgroundWorker" possède aussi un système d'annulation. Mais cependant, comme je le disais sur d'autres posts, il est très difficile de dissocier proprement les parties IHM / partie logique métier / persistance.

    Par contre, je viens de me rendre compte que si tu n'as pas accès à la version 4.5 du Framework ça va impossible de mettre les appels BDD en asynchrones avec gestion d'annulation car les classes ADO.NET n'ont ces extensions asynchrones qu'à partir du Framework 4.5...
    Cela dit, il est quand même possible d'appeler les méthode "BeginXXX" et "EndXXX" pour les classe "SqlClient*" uniquement. Et il y a aussi la méthode "Cancel" pour l'arrêter...

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 47
    Points
    47
    Par défaut
    Ce qui veut dire du coup, qu'il faudrait que j'abandonne LinQ to SQL et passer mes requetes directement par SqlClient ? :O

  6. #6
    Invité
    Invité(e)
    Par défaut
    Si tu utilises Linq To SQL, normalement ça utilise derrière un provider basé sur les classe "SqlCommand", "SqlDataReader", etc...

Discussions similaires

  1. [Débutant] Requete linq to sql faire un genre de distinct
    Par Vannessa Sindy dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 15/09/2014, 01h56
  2. [Débutant] requete Linq To sql
    Par chlebta*tsotsi dans le forum Linq
    Réponses: 6
    Dernier message: 11/05/2012, 08h01
  3. Requete Linq SQL
    Par snay13 dans le forum Linq
    Réponses: 7
    Dernier message: 01/09/2011, 23h15
  4. Requete Linq (traduire une requete sql en linq)
    Par punakanta dans le forum Linq
    Réponses: 6
    Dernier message: 07/07/2011, 09h42
  5. Réponses: 10
    Dernier message: 27/05/2010, 16h53

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