2013-12-11 2 views
1

Я использую компонент CheckListEdit в Delphi, который позволяет одновременно выбрать более одного элемента. Когда вы извлекаете с помощью CheckListEdit1.Text, я получаю выбранные элементы в формате String, например [item1, item2, item3], который я урезал дальше, чтобы отбросить первый и последний символы, чтобы получить окончательную строку как «item1, item2, item3».Как создать SQL-запрос с элементами item1, item2, item3 в Delphi?

Мой код выглядит следующим образом

glist := CheckListEdit1.Text; 
glistindex := Length(glist); 
Delete(glist,glistindex,1); 
Delete(glist,1,1); 

// Здесь я получаю GList = 'item1, item2, item3 ..' и т.п ..

Теперь я хочу, чтобы выбрать из данных из таблицы, где группа, как item1, item2, item3 и т.д ..

Мой SQL запросов выглядит следующим образом

UniTable1.SQL.Text := Select * from emp where group like (:grp); 
UniTable1.Params.ParamByName('grp').Value := glist; 

Но выше SQL возвращает ошибку, поскольку «как item1, item2, item3» не является надлежащим форматом, есть ли какой-либо альтернативный способ создания SQL-запроса, чтобы он возвращал данные из выбранной группы в CheckListEdit?

+1

Это, к сожалению, один случаев, когда вы должны построить свой запрос без использования параметров ... – whosrdaddy

+0

Оператор Like не поддерживает несколько аргументов. Я не думаю, что оператор «В» подойдет вашим потребностям? –

+0

Здесь [в один конец] (http://stackoverflow.com/a/5401777/800214), чтобы решить эту проблему: – whosrdaddy

ответ

2

Вместо того, чтобы строить строку как «item1, item2, item3», вам нужно построить ее как «(item1, item2, item3)». Тогда ваш запрос станет

Select * from emp where group in (item1, item2, item3) 

Как указал whosrdaddy, вам нужно будет построить запрос как конкатенированную строку; невозможно передать список значений в качестве параметра.

+0

Когда я писал UniTable1.SQL.Text: = 'Выберите * из emp где pgroup in (офицер, менеджер, клерк)' ... он дает ошибку, например «No Such Column: officer». –

+0

Если я написал что-то вроде этого, он работает UniTable1.SQL.Text: = 'Выберите * из emp где pgroup in (' 'officer' ',' 'manager' ', clerk' ')' –

+1

Это зависит от вашей базы данных. Обычно я использую целые числа (т.е. ключи) в таком запросе ('где pgroup in (1,2,3)'). Я бы подумал, что буквенно-цифровые значения должны быть переданы в одинарные кавычки, а не в два раза, что означало бы, что в вашей программе вам придется писать две одинарные кавычки до и после каждого значения. Лучше сначала проверить запрос с помощью инструмента командной строки. –

2

Использование параметра в операторе IN не correct.You следует либо использовать список параметров IN (: р1, р2, ...,: Pn) или использовать макросы:

UniQuery.SQL.Text := 'Select * from emp where group in (&grp)'; 
UniQuery.MacroByName('grp').AsString := glist; 
UniQuery.MacroByName('grp').Active := true; 
+0

получение ошибки 'UniQuery1: Macro grp not found ' –