Подтвердить что ты не робот

Есть ли способ отслеживать \log sql с помощью Dapper?

Есть ли способ сбросить сгенерированный sql в журнал Debug или что-то еще? Я использую его в решении winforms, поэтому идея мини-профайлера не будет работать для меня.

4b9b3361

Ответ 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.

Это не совсем то, что я искал, когда задавал оригинальный вопрос, но решал ту же проблему.