Codesign: Что такое незапечатанное содержимое?

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

Однако вы все равно можете использовать параметризованные SQL в этой ситуации. Решение состоит в том, чтобы перебирать список значений, которые у вас есть, добавив маркер параметра в SQL и параметр в список параметров для каждого значения.

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

 //AValues is an array of variant values
 //SQLCommand is some TDataSet component with Parameters.
 for I := Low(AValues) to High(AValues) do
 begin

    if ParamString = '' then
       ParamString = '?'
    else
      ParamString = ParamString + ', ?';

    SQLCommand.Parameters.Add(AValues[I]);

  end

  SQLCommand.CommandText = 
     'SELECT * FROM MyTable WHERE KeyValue IN (' + ParamString + ')';

Это приведет к инъекции - безопасный параметризованный запрос.

16
задан codingFriend1 20 September 2014 в 15:50
поделиться