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





Использование флага «отладка» вашей библиотеки часто является самым простым решением. Но вы зависите от библиотеки, которая может лгать вам или, по крайней мере, скрывать некоторые вещи, которые она будет делать (например, 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());
}
debugSQL.ParameterName и debugSQL.Value должны быть param.ParameterName и param.Value.
@JoeHz Ах! небольшая опечатка. Спасибо!
SQL Server
Для SQL Server вы можете использовать SQL Server Profiler:
Запустите новый сеанс трассировки, и вы увидите все, что выполняется. Вы также можете его отфильтровать.
Дополнительная информация здесь.
Все остальное
В общем, вы ищете профилировщик запросов. Вы можете поискать <RDBMS NAME> query profiler и найти что-нибудь полезное.
Спасибо (проголосуйте за), но означает ли это, что C# просто придерживается замененного запроса и не позволяет мне его вообще увидеть?
Параметр будет отправлен на SQL-сервер как «переменная». Не существует такой концепции, как замена строки запроса sql перед ее отправкой на сервер sql. Если вам что-то нужно на сайте C#, это очень зависит от библиотеки, которую вы используете. Для простого ADO.NET посмотрите ответ Equisde. Может быть, вы могли бы сделать что-нибудь необычное с DebugDisplayAttribute
Ответ от 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);
}
Вы можете создать метод расширения:
public static string ToSQL(this IDbCommand Cmd) { ... }и поместить указанный выше код в {...}. Вы захотите отформатироватьdebugSQL.Valueдля вывода строк, специфичных для типов в вашей БД.