![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL: Parameter not found [D6, 2000, XP]
Fostr © (2006-10-12 12:41:00)Хелп! Есть запрос в котором несколько параметров, создающихся динамически. При выполнении запроса выплывает ошибка "PARAMETER 'P0' NOT FOUND". Прошу подсказать из-за чего (см. код ниже).
SetLength(A_SET,DataModule1.FindByQuery1.RecordCount); //Задается длина динамического массива
ForK:=0 TODataModule1.FindByQuery1.RecordCount-1 DO
A_SET[K]:=DataModule1.FindByQuery1.Fields[1].AsString;//Здесь значения в виде динамического массива, которые в дальнейшем присваиваются параметрам
{Пишу запрос - не говорите, что надо SQL.Text='', мне тут это не подходит}
DataModule1.FindByQuery2.Active:=False;
DataModule1.FindByQuery2.SQL.Clear;
DataModule1.FindByQuery2.SQL.Add('SELECT *');
DataModule1.FindByQuery2.SQL.Add('FROM MainTable');
DataModule1.FindByQuery2.SQL.Add('WHERE');
ForK:=0 TOLength(A_SET)-1 DO
DataModule1.FindByQuery2.SQL.Add('Key1 LIKE: P'+IntToStr(K)+','); //Вношу в запрос параметры
ForK:=0 TOLength(A_SET)-1 DO
DataModule1.FindByQuery2.Parameters.ParamByName('P'+IntToStr(K)+'').Value:=A_SET[K]; //Задаю значения параметрам ТУТ И ВЫДАЕТСЯ ОШИБКА!!!
Заранее спасибо за любую подсказку.
ЮЮ (2006-10-16 03:07:00) [1]Ввиду закрытия
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1160770982&n=18
отвечу здесь.
Необходимо выбрать из второй таблицы только людей из проекта 564,
Как видишь, параметр здесь только один. Просто запрос надо правильно писать:
SELECT *
FROM Perons
WHERE Key IN (SELECT LinkKey FROM ProjectPersons WHERE ProjectKey = :ProjectKey)
или
SELECT p.*
FROM
ProjectPersons pp
JOIN Perons p ON pp.LinkKey = p.Key
WHERE
pp.ProjectKey = :ProjectKey
MsGuns (2006-10-12 16:16:00) [2]>Sergey13 © (12.10.06 15:25) [11]
>Ты смайлик забыл поставить. 8-)
Не забыл. Ты и представить не можешь насколько тут все серьезно
MsGuns (2006-10-12 15:43:00) [3]Ну, не по "ф1", но есть.
Help->Delphi Tools->Local SQL
Sergey13 (2006-10-12 15:43:00) [4]> [12] Fostr (12.10.06 15:40)
Если это BDE, то ищи файд LocalSQL.hlp
Fostr (2006-10-12 15:40:00) [5]Друзья, а ну-ка скажите, где это в Delphi по "фэ1" есть help по синтаксису SQL?
Я стараюсь про эту заветную кнопочку не забывать, если я что-то там пропустил, то пардон.
Sergey13 (2006-10-12 15:25:00) [6]> [8] MsGuns © (12.10.06 15:19)
Ты смайлик забыл поставить. 8-)
> [9] Fostr (12.10.06 15:20)
Слушай, ну Ф1 то нажми хоть раз ради разнообразия.
MsGuns (2006-10-12 15:23:00) [7]>Fostr (12.10.06 15:20) [9]
>Как правильно?
BOL->Index->Select->Where||Join
Fostr (2006-10-12 15:20:00) [8]> Sergey13 © (12.10.06 15:11) [7]
> Т.е. задача сделать это именно через массив, который тут не нужен?
> Не верю! (с)
И правильно! Теперь знаю, что это можно сделать иначе.
>Сомневаюсь, хоть и не знаком с Аксесом. В запятой нет логики, а тут нужно именно логическое условие.
Как правильно?
MsGuns (2006-10-12 15:19:00) [9]>Sergey13 © (12.10.06 15:11) [7]
>Сомневаюсь, хоть и не знаком с Аксесом
Мелкомягкие недавно запатентовали новый секретный диалект T-SQL, в котором при перечислении условий в предикатах Where и Join разрешается использовать вместо OR, NOT и AND символа ",". Специальный встроенный реверпарсер разбирает всю эту тарабарщину, правильно вычисляя чего же все-таки хочет клиент.
Сделано для шифровки запросов секретными агентами. Бают, что сделано по личному заказу лидера "Хазболлы".
Sergey13 (2006-10-12 15:11:00) [10]> [5] Fostr (12.10.06 14:50)
> У!!! Если я сейчас начно говорить зачем перегонять записи
> первого Query в массив - это может надолго затянуться и
> запутать. Поверьте, стоит такая задача, и я ее выполняю.
Т.е. задача сделать это именно через массив, который тут не нужен?
Не верю! (с)
> Access (у мне именно эта база) врооде позволяет так делать.
Сомневаюсь, хоть и не знаком с Аксесом. В запятой нет логики, а тут нужно именно логическое условие.
MsGuns (2006-10-12 14:58:00) [11]Для "перегонки" параметров из "кверика" в "кверик" достаточно скопировать сиквель, а потом через Parametes нового "кверика" в цикле присвоить им значения старого, изменив "нужные" как надо.
Fostr (2006-10-12 14:50:00) [12]У!!! Если я сейчас начно говорить зачем перегонять записи первого Query в массив - это может надолго затянуться и запутать. Поверьте, стоит такая задача, и я ее выполняю.
А вот насчет условия WHERE:
На самом деле мне надо во втором Query выбрать те записи, в которых значения некоторого поля соответствуют значениям перечисляемых через запятую в условии WHERE параметров. Если я ошибаюсь в синтаксисе, то прошу указать как правильно сделать! Access (у мне именно эта база) врооде позволяет так делать.
Sergey13 (2006-10-12 13:17:00) [13]> [0] Fostr (12.10.06 12:41)
И зачем записи первого кверика перегонять в массив?
Desdechado (2006-10-12 13:13:00) [14]хм, условия WHERE через запятую?
это где такой синтаксис?
Fostr (2006-10-12 12:50:00) [15]Ну конечно же!!! Спасибо! Одна голова хорошо (одни глаза), а несколько - лучше! В упор не видел!
Рамиль (2006-10-12 12:45:00) [16]
> ('Key1 LIKE: P'+IntToStr(K)+','
('Key1 LIKE :P'+IntToStr(K)+','