Как я могу получить строковое представление SqlParameter, не отправляя оператор SQL на сервер? - PullRequest
3 голосов
/ 10 сентября 2011

Как я могу преобразовать параметризованную строку, такую ​​как "(@ param1, @ param2, @ param3)", в обычный оператор SQL (например, если бы я должен был выполнить запрос)?

Это было бы полезно для прямой замены набора параметров их значениями в пакетном (очень длинном) запросе вставки, где можно повторно использовать те же имена параметров.

Мне известны следующие вопросы, но они не дают правильного ответа (за исключением утверждения, что именно сервер выполняет преобразования из параметров, которые он получил отдельно):

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Не уверен, что это то, что вы ищете, но я создал метод расширения для SqlCommand с именем ToSql(), который объявляет все параметры, устанавливает буквальные значения, а затем использует CommandText для генерации автономного SQL заявление. Затем я могу скопировать и вставить инструкцию в SSMS и продолжить отладку оттуда.

Хотел бы я поделиться с вами кодом, но это собственность моего работодателя. Кроме того, это было довольно легко написать, и это забавное упражнение. Я просто опишу, как это работает.

Например:

var command = new SqlCommand(@"
    SELECT * 
    FROM Table 
    WHERE 
        Column1 = @Param1 
    AND Column2 = @Param2
");
command.Parameters.AddWithValue("@Param1", 555);
command.Parameters.AddWithValue("@Param2", "StackOverflow's cool");
...

Теперь, во время отладки, я просто добавляю часы для command.ToSQL() и получаю следующий текст:

DECLARE @Param1   INT            SET @Param1   = 555
DECLARE @Param2   VARCHAR(MAX)   SET @Param2   = 'StackOverflow''s cool'
SELECT *
FROM Table
WHERE
    Column1 = @Param1
AND Column2 = @Param2

Для хранимых процедур результат выглядит следующим образом:

DECLARE @Param1   INT            SET @Param1   = 555
DECLARE @Param2   VARCHAR(MAX)   SET @Param2   = 'StackOverflow''s cool'
EXECUTE Some_Stored_Procedure
    @Param1 = @Param1
   ,@Param2 = @Param2

Я бы не рекомендовал использовать этот код в рабочей среде, и он может быть небезопасен против атак с использованием SQL-инъекций, но это невероятно полезный инструмент отладки!

0 голосов
/ 10 сентября 2011

Я только что нашел что-то подобное для SQLite:

SQLiteCommand cmd = new SQLiteCommand("INSERT INTO `" + rolesTable + "`" +
                " (Rolename, ApplicationName) " +
                " Values($Rolename, $ApplicationName)", conn);

        cmd.Parameters.Add("$Rolename", DbType.String, 255).Value = rolename;
        cmd.Parameters.Add("$ApplicationName", DbType.String, 255).Value = ApplicationName;
...