Нет, потому что на самом деле подстановки не происходит. Запрос передается на сервер как есть, а параметры передаются отдельно.
Однако вы можете написать метод для замены заполнителей параметров фактическими значениями параметров ... это то, что я сделал в одном из моих приложений, я Я опубликую код, как только смогу.
Вот код, который я использую, но он предназначен для базы данных Oracle Lite, поэтому потребуется некоторая адаптация, чтобы использовать его с другой СУБД.
public void Log(IDbCommand cmd)
{
StringBuilder sb = new StringBuilder(cmd.CommandText);
for (int i = 0; i < cmd.Parameters.Count; i++)
{
int pos = sb.ToString().IndexOf("?");
if (pos > 0)
sb.Replace("?", FormatParameter(cmd.Parameters[i]), pos, 1);
}
Log(sb.ToString());
}
private string FormatParameter(object prm)
{
IDbDataParameter p = prm as IDbDataParameter;
if (p.Value == null || p.Value == DBNull.Value)
return "NULL";
switch (p.DbType)
{
case DbType.AnsiString:
case DbType.AnsiStringFixedLength:
case DbType.String:
case DbType.StringFixedLength:
string s = p.Value as string;
return string.Format("'{0}'", s.Replace("'", "''"));
case DbType.Binary:
byte[] b = p.Value as byte[];
return HexString(b);
case DbType.Date:
case DbType.DateTime:
case DbType.DateTime2:
DateTime d = (DateTime)p.Value;
return string.Format("to_date('{0}', 'dd/mm/yyyy hh24:mi')", d.ToString("dd/MM/yyyy HH:mm"));
default:
return p.Value.ToString();
}
}
private string HexString(byte[] bytes)
{
StringBuilder sb = new StringBuilder();
for (int i=0; i < bytes.Length; i++)
sb.AppendFormat("{0:X2}", bytes[i]);
return sb.ToString();
}
Что ж, вы можете увидеть весь запрос в SQL Profiler (по общему признанию, это после , он был отправлен в базу данных), но он дает вам простой способ скопировать и вставить оператор, чтобы вы можете выполнить отладку в Management Studio.
Просто добавьте новую трассировку,
Я просто перечитал ваш вопрос перед тем, как опубликовать это. Хотя этот метод, вероятно, не может быть напрямую применен к .net, вы могли бы разработать что-то подобное. Итак:
Мне недавно пришлось выполнять много динамического кодирования на T-SQL, и я придумал следующую процедуру. Предположим, у вас есть такой фрагмент кода:
DECLARE
@Command nvarchar(max)
,@SearchFor int
SET @Command = 'SELECT * from MyTable where PrimaryKey = @SearchFor'
SET @SearchFor = 1
EXECUTE sp_executesql
@Command
,N'@SearchFor int'
,@SearchFor
Это, конечно, очень упрощенно - если вам нужно выполнить динамический код, у вас будут сложные или чрезвычайно сложные запросы, и, как вы обнаружили, может быть очень сложно отладить. Вот как я бы переписал приведенный выше код:
DECLARE
@Command nvarchar(max)
,@SearchFor int
,@Debug int
-- 0 = Run it
-- 1 = Run and display it
-- 2 = Display it
SET @Command = 'SELECT * from MyTable where PrimaryKey = @SearchFor'
SET @SearchFor = 1
SET @Debug = 1
IF @Debug > 0
-- Show the command that would be run
PRINT replace(@Command, '@SearchFor', cast(@SearchFor as varchar(10)))
IF @Debug < 2
-- Run it
EXECUTE sp_executesql
@Command
,N'@SearchFor int'
,@SearchFor
Это дополнительный код для написания и отладки, но когда он размещен и работает, он может оказаться бесценным в ситуациях отладки. Если это часть хранимой процедуры, сделайте @Debug параметром, который по умолчанию равен 0, и убедитесь, что если установлено значение 2,