Есть ли способ сбросить сгенерированный sql в журнал Debug или что-то еще? Я использую его в решении winforms, поэтому идея мини-профайлера не будет работать для меня.
Есть ли способ отслеживать \log sql с помощью Dapper?
Ответ 1
Я получил ту же проблему и реализовал некоторый код после выполнения некоторого поиска, но не имея готового к использованию материала. На nuget есть пакет MiniProfiler.Integrations, которым я хотел бы поделиться.
Обновление V2: он поддерживает работу с другими серверами баз данных, для MySQL требуется наличие MiniProfiler.Integrations.MySql
Ниже приведены шаги для работы с SQL Server:
1. Установите соединение
var factory = new SqlServerDbConnectionFactory(_connectionString);
using (var connection = DbConnectionFactoryHelper.New(factory, CustomDbProfiler.Current))
{
// your code
}
2. После всех выполненных работ запишите все команды в файл, если хотите
File.WriteAllText("SqlScripts.txt", CustomDbProfiler.Current.ProfilerContext.BuildCommands());
Ответ 2
В настоящее время у Dapper нет контрольной точки. Это, возможно, связано с тем, что мы (как авторы) используем мини-профилировщик для обработки этого. Однако, если это помогает, основные части мини-профайлера на самом деле предназначены для нейтральной архитектуры, и я знаю других людей, использующих его с winforms, wpf, wcf и т.д. - что даст вам доступ к обертке профилирования/трассировки соединения.
В теории было бы вполне возможно добавить какую-то скрытую точку захвата, но меня беспокоят две вещи:
- (прежде всего) безопасность: поскольку dapper не имеет понятия контекста, было бы очень легко для злоумышленного кода подключиться тихо, чтобы обнюхать весь SQL-трафик, проходящий через dapper; Мне действительно не нравится звук этого (это не проблема с подходом "декоратор", поскольку вызывающий пользователь имеет соединение, следовательно, контекст ведения журнала)
- (вторичная) производительность: но... по правде говоря, трудно сказать, что простая проверка делегирования (которая, предположительно, была бы
null
в большинстве случаев) имела бы большое влияние
Конечно, другая вещь, которую вы могли бы сделать, это: украсть код оболочки подключения из мини-профилировщика и заменить материал профайлера-контекста просто: Debug.WriteLine
и т.д.
Ответ 3
Это не является исчерпывающим и, по сути, немного взломанным, но если у вас есть свой sql и вы хотите инициализировать свои параметры, это полезно для базовой отладки.
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();
}
}
Затем вы можете просто использовать это в непосредственных или просмотренных окнах, чтобы захватить SQL.
Ответ 4
Просто добавьте обновление здесь, так как я вижу, что этот вопрос по-прежнему получает довольно много хитов - в наши дни я использую Glimpse или Stackify Prefix, которые имеют возможности командной строки sql.
Это не совсем то, что я искал, когда задавал оригинальный вопрос, но решал ту же проблему.