Как отлаживать параметризованный SQL-запрос

Я использую C# для подключения к базе данных, а затем специальный SQL для получения данных. Этот простой SQL-запрос очень удобен для отладки, поскольку я могу регистрировать строку SQL-запроса. Если я использую параметризованную команду запроса SQL, есть ли способ записать строку запроса sql для целей отладки?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
5 337
4

Ответы 4

Использование флага «отладка» вашей библиотеки часто является самым простым решением. Но вы зависите от библиотеки, которая может лгать вам или, по крайней мере, скрывать некоторые вещи, которые она будет делать (например, psycopg незаметно изменяет уровень изоляции по умолчанию).

На стороне СУБД вы всегда можете активировать логирование. Хорошая вещь в том, что вы получите точный SQL-запрос, что бы ни делала ваша клиентская библиотека. В этом отношении он лучше, чем флаг «отладка» библиотеки. Но в некоторых СУБД операторы журналирования могут быть очень медленными (как в случае с PostgreSQL).

Другое решение - использовать сниффер в сети, если у вас есть достаточные права. Wireshark может декодировать протоколы многих СУБД и представлять фактический запрос SQL.

На PostgreSQL активация журналирования в postgresql.conf выполняется:

log_statement = 'all'                   # none, ddl, mod, all

Обычно я также использую:

log_connections = on
log_disconnections = on
log_duration = on
log_hostname = on

Я думаю, это об этом. Поместите этот код туда, где вы настроили команду запроса, и вы получите в debugSQL инструкцию SQL, которая будет выполнена.

string debugSQL = cmd.CommandText;

foreach (SqlParameter param in cmd.Parameters)
{
    debugSQL = debugSQL.Replace(param.ParameterName, param.Value.ToString());
}

Вы можете создать метод расширения: public static string ToSQL(this IDbCommand Cmd) { ... } и поместить указанный выше код в {...}. Вы захотите отформатировать debugSQL.Value для вывода строк, специфичных для типов в вашей БД.

laifukang 22.04.2014 11:42

debugSQL.ParameterName и debugSQL.Value должны быть param.ParameterName и param.Value.

JoeHz 24.04.2017 09:13

@JoeHz Ах! небольшая опечатка. Спасибо!

ɐsɹǝʌ ǝɔıʌ 28.04.2017 14:05

SQL Server

Для SQL Server вы можете использовать SQL Server Profiler:

SQL Profiler

Запустите новый сеанс трассировки, и вы увидите все, что выполняется. Вы также можете его отфильтровать.

Trace

Дополнительная информация здесь.

Все остальное

В общем, вы ищете профилировщик запросов. Вы можете поискать <RDBMS NAME> query profiler и найти что-нибудь полезное.

Спасибо (проголосуйте за), но означает ли это, что C# просто придерживается замененного запроса и не позволяет мне его вообще увидеть?

NH. 17.01.2018 18:59

Параметр будет отправлен на SQL-сервер как «переменная». Не существует такой концепции, как замена строки запроса sql перед ее отправкой на сервер sql. Если вам что-то нужно на сайте C#, это очень зависит от библиотеки, которую вы используете. Для простого ADO.NET посмотрите ответ Equisde. Может быть, вы могли бы сделать что-нибудь необычное с DebugDisplayAttribute

Christian Gollhardt 17.01.2018 19:13

Ответ от equisde был полезен, но для обработки типов bool и char мне понадобился этот вариант:

string debugSQL = dbCommand.CommandText;
foreach (SqlParameter param in dbCommand.Parameters)
{
    string val = param.Value.ToString();
    switch (param.DbType)
    {
        case System.Data.DbType.AnsiString:
                val = "'" + val + "'";
            break;
        case System.Data.DbType.Boolean:
            val = (val == "True" ? "1" : "0");
            break;
    }
    debugSQL = debugSQL.Replace("@" + param.ParameterName, val);
}

Другие вопросы по теме