Как отлаживать параметризованный SQL-запрос - PullRequest
4 голосов
/ 24 декабря 2008

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

Ответы [ 4 ]

4 голосов
/ 10 декабря 2013

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

string debugSQL = cmd.CommandText;

foreach (SqlParameter param in cmd.Parameters)
{
    debugSQL = debugSQL.Replace(param.ParameterName, param.Value.ToString());
}
3 голосов
/ 17 января 2018

SQL Server

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

SQL Profiler

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

Trace

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

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

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

0 голосов
/ 24 января 2018

Ответ от 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);
}
0 голосов
/ 24 декабря 2008

Использование флага debug вашей библиотеки часто является самым простым решением. Но вы зависите от библиотеки, которая может лгать вам или, по крайней мере, скрывать некоторые вещи, которые она будет делать (например, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...