Y a-t-il un moyen de tracerlog le sql en utilisant Dapper?

y a-t-il un moyen de décharger le sql généré dans le journal de débogage ou quelque chose comme ça? Je l'utilise dans une solution winforms pour que l'idée du mini-profileur ne marche pas pour moi.

25
demandé sur Mladen Mihajlovic 2013-08-30 13:50:18

4 réponses

j'ai eu le même problème et j'ai implémenté du code après avoir fait quelques recherches mais n'ayant pas de truc prêt à l'emploi. Il y a un paquet sur nuget Miniprofileur.Intégrations je voudrais partager.

Mise À Jour V2: il supporte de travailler avec d'autres serveurs de base de données, pour MySQL il nécessite d'avoir Miniprofileur.Intégration.MySql

Voici les étapes à suivre pour travailler avec SQL Server:

1.Instancier l' connexion

var factory = new SqlServerDbConnectionFactory(_connectionString);
using (var connection = DbConnectionFactoryHelper.New(factory, CustomDbProfiler.Current))
{
 // your code
}

2.Après tous les travaux effectués, écrivez toutes les commandes à un fichier si vous voulez

File.WriteAllText("SqlScripts.txt", CustomDbProfiler.Current.ProfilerContext.BuildCommands());
20
répondu hazjack 2016-08-31 06:52:36

Dapper n'a pas actuellement de point d'instrumentation ici. Cela est peut-être dû, comme vous le constatez, au fait que nous (en tant qu'auteurs) utilisons un mini-profileur pour gérer cela. Cependant, si cela aide, les parties centrales de mini-profileur sont en fait conçues pour être neutres sur le plan de l'architecture, et je connais d'autres personnes qui l'utilisent avec winforms, wpf, wcf, etc. - ce qui vous donnerait accès à l'enveloppe de connexion profiling / tracing.

En théorie, il serait parfaitement possible d'ajouter certains couverture de capture de point, mais je suis préoccupé par deux choses:

  • (principalement) sécurité: puisque dapper n'a pas de concept de contexte, ce serait vraiment facile pour le code malign de s'attacher tranquillement à renifler tout le trafic sql qui passe par dapper; Je n'aime vraiment pas le son de cela (ce n'est pas un problème avec l'approche "decorator", car l'appelant possède la connexion, d'où le contexte de journalisation)
  • (secondaire) performance: but... en vérité, il il est difficile de dire qu'une simple vérification de délégué (qui serait probablement null dans la plupart des cas) aurait autant d'impact

bien sûr, l'autre chose que vous pouvez faire est: voler le code d'enveloppe de connexion de mini-profileur, et remplacer le truc de profileur-contexte avec juste: Debug.WriteLine etc.

9
répondu Marc Gravell 2013-08-30 10:58:05

ceci n'est pas exhaustif et est essentiellement un peu de hack, mais si vous avez votre sql et que vous voulez initialiser vos paramètres c'est utile pour le débogage de base.

public static class DapperExtensions
    {
        public static string ArgsAsSql(this DynamicParameters args)
        {
            var sb = new StringBuilder();
            foreach (var name in args.ParameterNames)
            {
                var pValue = args.Get<dynamic>(name);

                var type = pValue.GetType();

                if (type == typeof(DateTime))
                    sb.AppendFormat("DECLARE @{0} DATETIME ='{1}'\n", name, pValue.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                else if (type == typeof(bool))
                    sb.AppendFormat("DECLARE @{0} BIT = {1}\n", name, (bool)pValue ? 1 : 0);
                else if (type == typeof(int))
                    sb.AppendFormat("DECLARE @{0} INT = {1}\n", name, pValue);
                else if (type == typeof(List<int>))
                    sb.AppendFormat("-- REPLACE @{0} IN SQL: ({1})\n", name, string.Join(",", (List<int>)pValue));
                else
                    sb.AppendFormat("DECLARE @{0} NVARCHAR(MAX) = '{1}'\n", name, pValue.ToString());
            }

            return sb.ToString();
        }
    }

Vous pouvez alors simplement l'utiliser dans les fenêtres immédiates ou regarder pour saisir le SQL.

2
répondu MrEdmundo 2016-10-14 15:15:20

juste pour ajouter une mise à jour ici puisque je vois que cette question encore obtenir est pas mal de hits - ces jours j'utilise l'un ou l'autre Aperçu ou Stackify Prefix qui ont toutes les deux des capacités de recherche de commandes sql.

ce n'est pas exactement ce que je cherchais quand j'ai posé la question originale mais résoudre le même problème.

1
répondu Mladen Mihajlovic 2018-01-03 16:21:34