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.
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());
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.
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.
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.