Существует ли способ получить полный sql текст назад от SqlCommand после замены параметрического усилителя?

Кроме того:

if( jQuery('#elem').get(0) ) {}
5
задан pjp 10 August 2009 в 13:57
поделиться

3 ответа

Нет, потому что на самом деле подстановки не происходит. Запрос передается на сервер как есть, а параметры передаются отдельно.

Однако вы можете написать метод для замены заполнителей параметров фактическими значениями параметров ... это то, что я сделал в одном из моих приложений, я Я опубликую код, как только смогу.


Вот код, который я использую, но он предназначен для базы данных 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();
    }
4
ответ дан 14 December 2019 в 13:43
поделиться

Что ж, вы можете увидеть весь запрос в SQL Profiler (по общему признанию, это после , он был отправлен в базу данных), но он дает вам простой способ скопировать и вставить оператор, чтобы вы можете выполнить отладку в Management Studio.

Просто добавьте новую трассировку,

2
ответ дан 14 December 2019 в 13:43
поделиться

Я просто перечитал ваш вопрос перед тем, как опубликовать это. Хотя этот метод, вероятно, не может быть напрямую применен к .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,

0
ответ дан 14 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: