2011-05-09 2 views
1

мне нужно добавить еще одно условие для моей, где причина нижеИспользование QuotedStr в SQL

SQL.Add('where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=:DaysParam)'); 

Мне нужно добавить

и (cmcl_bank_cleared <> TO_DATE ('01/01/2011' , ' мм/дд/гггг '))

проблема заключается в одинарные кавычки

я могу сделать следующее?

SQL.Add('where (cmcl_bank_cleared is not null) AND '); 
SQL.Add('(cmcl_bank_cleared <> to_date(' + QuotedStr(01/01/2011) + ', ' + QuotedStr('mm/dd/yyyy') + ')'); 
SQL.Add('((cmcl_bank_cleared - check_date) >=:DaysParam)'); 
+1

Да, вы можете это сделать, но еще раз проверьте синтаксис SQL, потому что вам не хватает 'AND', и вы должны указывать строковые литералы или строковые переменные. – RRUZ

+4

Есть ли причина, по которой вы используете параметры для ': DaysParam', но не для диапазона дат? i.e 'cmcl_bank_cleared <>: DateParamName); ParamByName ('DateParamName'). AsDateTime: = EncodeDate (2011, 01, 01) ' –

+0

Джерри прав. Связанные переменные делают код более безопасным и могут ускоряться (последний зависит от использования SQL) –

ответ

8

Вы можете использовать QuotedStr для создания запросов, но это не лучшая идея. Если какой-либо вход поступает от пользователя, они могут теоретически enter strange things that would end up having unwanted effects on your database. Это известно как SQL Injection и является серьезной проблемой безопасности для многих веб-сайтов.

Правильный и безопасный способ вставки значений в середину такого запроса - использовать параметризованные запросы. Посмотрите документацию по свойству Params вашего набора данных, чтобы узнать, как это работает.

+1

+1 для использования параметризованных запросов. – RRUZ

+0

Я не использовал QuotedStr, так как изучал, как использовать Params. Это более безопасный подход (и, проще говоря, в конце), и вы можете использовать такие вещи, как AsString, AsInteger и AsDateTime (очень удобно). – Sam

+0

Иногда есть причина * не использовать * параметры. Datawarehouse-подобные запросы (сложные, с большим временем выполнения, а не часто выполняются) с базами данных с использованием оптимизаторов на основе затрат * могут * получить лучший план выполнения без параметров, поскольку оптимизатор имеет больше данных для анализа при жестком анализе SQL-запроса , и * может * избегать повторного использования плана, который может оказаться неэффективным для данных параметров. Конечно, если не использовать код параметров, он должен быть «безопасным» против инъекции. Не существует «одного размера для всех решений». Программист должен знать свою прикладную среду и данные. –

1

Да, это будет работать нормально. Помните, что QuotedStr(S) избегает любых кавычек в S, удваивая их. Поскольку у вас нет ни одной кавычки в вашей строке, вы в порядке.

Предполагаете, вы имеете в виду QuotedStr('01/01/2011'), а не QuotedStr(01/01/2011). Вы тоже пропустили AND.

1

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

SQL.Add('(cmcl_bank_cleared <> to_date(''01/01/2011'', ''mm/dd/yyyy'')) AND'); 

Вы бы использовать QuotedStr, если у вас переменные (или константы), содержащие строки, которые вы хотели включить в SQL. Например:

const 
    ExcludedDate = '01/01/2011'; 
    DateFormat = 'mm/dd/yyyy'; 

SQL.Add(Format('(cmcl_back_cleared <> to_date(%s, %s)) AND', 
       [QuotedStr(ExcludedDate), QuotedStr(DateFormat)])); 
Смежные вопросы