2012-01-16 3 views
8

Я новичок в Delphi и получил следующий фрагмент кода (левый некоторые нерелевантные части), для которого я пытаюсь понять, что он делает:Что произойдет, если я вызову ParamByName для параметра, который не существует?

object SelectCosts: TIBQuery 
    SQL.Strings = (
     'SELECT * FROM costs ' 
     'WHERE code = :code') 
    ParamData = < 
     item 
     DataType = ftUnknown 
     Name = 'code' 
     ParamType = ptUnknown 
     end> 
    end 

В другом файле, используется этот запрос , но добавляется параметр, который не задан в запросе.

DM_HRV.SelectCosts.ParamByName('part').Value := 1; 

ли этот параметр 'part' изменить что-либо о выборе сделал? Другими словами: SQL-запрос автоматически изменяется на следующее?

'SELECT * FROM costs ' 
    'WHERE code = :code' 
    'AND part = :part' 
+2

Я настоятельно рекомендую динамически настраивать SQL, установка его в компоненте подвержена многим будущим ошибкам. – ComputerSaysNo

+0

@DorinDuminica это не мой собственный код, но код мне нужно просмотреть, чтобы проверить, что он делает. Спасибо за информацию, хотя это может быть полезно в будущем! – Maza89

+1

@DorinDuminica: Не заметил, что до сих пор! Тем не менее, я понимаю, что я все еще могу столкнуться с ними в будущем. В связи с этим было бы действительно интересно услышать даже несколько «возможных» возможных ошибок, о которых вы говорите. –

ответ

8

Это означает, что оператор SQL может быть изменен во время выполнения. поэтому, когда этот запрос используется, SQL уже содержит AND part = :part.

Если оператор SQL не содержит этот дополнительный параметр part, при назначении возникает исключение.

Я предполагаю, что вы не смущали SelectCosts ссылку (которая находится в DM_HRV, а не другом DM).

+1

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

+0

@kobik Спасибо, что я уже думал. @AndriyM Хотя это казалось менее вероятным для вас, я обнаружил, что он действительно изменился в совершенно другом месте. Текст запроса был заменен на «SELECT * FROM costs» WHERE code =: code AND part =: part AND year =: year'' – Maza89

+0

@ Maza89: Хорошо, что понял! –

0

Добавление нового параметра не изменяет запрос. Вы должны сделать это сами.

4

следующее заявление в своем сообщении не добавить параметр, он устанавливает свое значение:

DM_HRV.SelectCosts.ParamByName('part').Value := 1; 

Для добавления параметра во время выполнения, используйте CreateParam следующим образом:

if DM_HRV.SelectCosts.Params.FindParam('Part') = nil then 
    DM_HRV.SelectCosts.Params.createParam(ftString, 'Part', ptInput); 

Запрос Безразлично 't получить изменен автоматически, вы должны сделать это самостоятельно.

В вашем первом оттиске ParamType и InputType не определены, вы можете изменить это в IDE, просмотрев редактор свойств списка параметров (Params) и обновив эти значения.

Смежные вопросы