Есть ли способ получить CommandText после замены значений параметров программно? - PullRequest
2 голосов
/ 23 января 2011

Есть ли способ получить CommandText после программной замены значений параметров в .NET?

Предположим, у нас есть команда:

let cmd = conn.CreateCommand()
cmd.CommandText <- "select * from smsqueue where smsqueueid=:pid"
cmd.CommandType <- CommandType.Text
cmd.Parameters.Add("pid", 0)

Я хочу получить подготовленный текст команды; что было бы так:

select * from smsqueue where smsqueueid=0

Существуют профилировщики для получения этой информации, но я хочу сделать это явно в коде (например, F # или C #).

Ответы [ 3 ]

5 голосов
/ 23 января 2011

Замена, вероятно, не будет выполнена в тексте - на самом деле это будет более хлопотно. Зачем беспокоиться о том, как экранировать строки, представлять даты в определенном текстовом формате и т. Д., Если драйвер может передавать их отдельно в предварительно запланированном двоичном формате?

Какую цель вы пытаетесь достичь? Если это с целью регистрации, я бы просто записал текст команды и параметры отдельно. Помимо упрощения, это прояснит ситуацию, если вы столкнетесь с проблемой: вы сможете определить, правильно ли был параметризован SQL.

2 голосов
/ 23 января 2011

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

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

1 голос
/ 27 мая 2013

Код ниже должен быть добавлен перед command.execute, чтобы вы получили печать запроса, который может быть выполнен в SQL.

for (int x = 0; x < cmd.Parameters.Count; x++)
{    
if (cmd.Parameters[x].SqlDbType.ToString() == "VarChar" || cmd.Parameters[x].SqlDbType.ToString() == "Char")
    {
        Response.Write("<BR><BR>Declare " + cmd.Parameters[x].ToString() + " as " + cmd.Parameters[x].SqlDbType.ToString() + "(" + cmd.Parameters[x].Size + ")");
    }
    else
    {
        Response.Write("<BR><BR>Declare " + cmd.Parameters[x].ToString() + " as " + cmd.Parameters[x].SqlDbType.ToString());
    }

    Response.Write("<BR>SET " + cmd.Parameters[x].ToString() + " = '" + cmd.Parameters[x].SqlValue.ToString() + "'");
}
Response.Write("<BR>" + cmd.CommandText.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...