|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Передать параметр типа динамический массив в Sql-запрос
Есть запрос:
select * from table1 where id IN (:MasId) в проге: var MasId : array of integer; begin setlength(MasId,lengthMasId); ADODataSet1.Parameters.ParamByName('MasId').Value := MasId; И ошибка! |
#2
|
|||
|
|||
Если массив содержит последовательные значения, то запрос составляется просто, например:
select * from table1 where id >= 2 and id <= 10 Если массив содержит не регулярную последовательность значений, то без цикла не обойтись, в котором и составляется условие поиска для WHERE. Если, конечно, массив не гигантский. Код:
function CreateParam(MasId : array of Integer) : string; var I : INteger; begin Result := ''; if Length(MasId) = 0 then Exit; Result := ' id IN ('+IntToStr(MasId[0]); for I := 1 to High(MasId) do Result := Result + ','+IntToStr(MasId[i]); Result := Result + ')'; end; И в первом варианте и во втором параметр должен быть строкового типа. А запрос должен выглядеть несколько иначе: select * from table1 where :MasId Первый вариант: Код:
if Length(ArrayId) > 0 then ADODataSet1.Parameters.ParamByName('MasId').Value := 'id>='+IntToStr(ArrayId[0])+' and id<='+IntToStr(ArrayId[High(ArrayId)]); Второй: Код:
S := CreateParam(ArrayId); if S <> '' then ADODataSet1.Parameters.ParamByName('MasId').Value := S; И в первом случае можно обойтись вторым вариантом. Будет создана строка типа: ' id in (1,2,3,4,5,6)'. Последний раз редактировалось san-46, 03.05.2008 в 01:12. |