2010-09-02 2 views
4

У меня есть запрос с параметрами внутри Devart TMSQuery.SQL. Что-то вродеDelphi: Как получить запрос, который передается серверу при использовании параметров

select * from customers 
where customer = :CustomerID 

в коде я

// Delphi 
sqlcustomer.ParamByName('CustomerID').asinteger := 4; 
sqlcustomer.open; 

Я хочу отладки и увидеть точное команду SQL отправляется на сервер, если я пытаюсь использовать TMSQuery.sql я просто есть: CustomerID, в то время как я хотел бы, чтобы это:

select * from customers 
where customer = 4 

есть быстрый способ, чтобы это не прочитав все параметры и реконструкции manyally запроса?

Конечно у меня есть очень большой запрос с более чем 100 параметров, поэтому мне нужна эта

+0

два вопроса 1) с какой базой данных вы используете? 2) используете ли вы BDE? – RRUZ

+0

Нет. Я использую SQL SERVER с компонентами DevArt, я попросил TQUery, потому что он более глобально понятен. – LaBracca

+0

Вы должны предоставить такую ​​информацию в своем вопросе, это очень важно. Я редактировал ваши теги. – RRUZ

ответ

4

Фактическое заявление SQL параметризированного запроса, который посылается на сервер никогда не содержит текстовое представление значений параметров , Вместо этого он использует символы-заполнители, например. вопросительные знаки. В вашем примере это будет select * from customers where customer = ? Это готово на сервере, а значения параметров затем отправляются клиентом в отдельном вызове.

+0

Я не знал этого, так или иначе, я начал подозревать это, глядя на профилировщик sql-сервера. Я думал, что параметры - это всего лишь способ сделать текстовый поиск и замену, в то время как в соответствии с тем, что вы говорите, это означает, что есть что-то более глубокое ... В чем преимущество передачи параметров в звонках со свистом? в чем разница, если я просто просматриваю текст и отправляю текст перед выполнением запроса? – LaBracca

+1

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

+0

Сервер подготовит и повторно использует один и тот же подготовленный запрос, если вы дадите команду движку сделать это, типично с вызовом метода .Prepare или установкой true для свойства Prepared. Это значительно повысит эффективность, например, в циклах. С другой стороны, используя параметры, ваши приложения безопасны от атак SQL Injection. Наконец, в некоторых базах данных (например, оракул) двигатель повторно использует план сеанса другого, если тот же текстовый запрос поступает от разных клиентов, поэтому использование параметризованных запросов - это способ сократить время выполнения и нагрузку на сервер. – jachguate

3

Если вы используете компоненты Devart, у них есть компонент TMSSQLMonitor, который может помочь. Если вы подключаетесь через odbc, вы можете контролировать sql, включив трассировку на вкладке odbc.

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

+0

Здравствуйте, я попробовал TMSSQLMonitor, но в журнале у меня есть только китайские символы ... У меня есть Delphi 2009, может быть, у этого есть некоторые проблемы с unicode ?, это, например, то, что я получаю в окне журнала: 14 14.21.25兓 ⁌ 硅 捥 瑵 㩥 猠 汥 汥 捥 ⁴ 浯 丠 呇 呇 䅟 䕈 ⁅ ⁅ 甀 甀 甀 甀 甀 甀 甀 甀 – LaBracca

+0

Полезно, – Hidden