2012-03-02 3 views
3

Nous avons une application winforms qui utilise Dapper pour les lectures de base de données.Annuler Dapper Query à long terme

Dans une forme, nous avons une requête longue (possible) sur un thread d'arrière-plan.

Les utilisateurs veulent pouvoir annuler la requête, j'ai donc besoin d'accéder au DbCommand Dapper pour créer et appeler Annuler, s'il est en cours d'exécution, depuis un autre thread.

Quelle serait la meilleure façon d'exposer cette DbCommand de Dapper?

+0

Ce n'est actuellement exposé, et je ne peux pas penser à des * moyens faciles * de l'ajouter, à court de passage dans une interface qui fait la publicité un événement ... Je suppose que cet exemple particulier est l'exception plutôt que la norme? Peut-être code * juste celui-ci * manuellement? –

+0

Je pensais que je me suis enfin débarrassé des trucs manuels de datareader ... Ne croyez pas. Mais encore, j'aime Dapper. – Rik

+0

si vous avez des idées particulières à ce sujet, je suis tout ouïe ... mais .... je ne vois pas de moyen * facile * = –

Répondre

0

C'est l'heure du marteau. Casser des choses.

using (var reader = connection.ExecuteReader(query)) { 

.... maintenant annuler

var wrappedReaderType = typeof (Dapper.CommandDefinition) 
         .Assembly.GetType("Dapper.WrappedReader"); 
var field = wrappedReaderType 
      .GetField("cmd", BindingFlags.NonPublic | BindingFlags.Instance); 
if (field != null) 
{ 
    var command = field.GetValue(reader) as IDbCommand; 
    if (command != null) 
    { 
     command.Cancel(); 
    } 
} 
Questions connexes