![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запрос не получается [D7, Access]
Tanya © (2014-05-09 03:53:00)На форме у меня расположено три компонента ADO: Query, Connection, и Data Source. В свойстве SQL прописала так
SELECT x, Lx
FROM Таблица
WHERE x=:xv AND x=:xv+n
xv, n -это параметры. То есть в итоге я должна получить значения -два столбца x, Lx и две строки значения.
В коде на кнопку прописала
ADOQuery1.Close;
ADOQuery1.Parameters.ParamByName('xv').Value:=Edit1.text;
ADOQuery1.Parameters.ParamByName('n').Value:=Edit2.text;
ADOQuery1.Open;
DataSource1.DataSet:=ADOQuery1;
И тут у меня ошибка с параметром возникла не находит Параметр n как это исправить??
Дмитрий (2014-05-15 16:18:00) [1]В смысле, инъекцию через параметры.
Дмитрий (2014-05-15 16:18:00) [2]Если вы перечитаете, то про SQL-инъекцию я не настаиваю.
Кщд (2014-05-15 10:51:00) [3]>Дмитрий (14.05.14 20:38) [29]
sql-injection при работе с параметрами невозможна
то, что Вы не умеете признать свою ошибку, Ваша и только Ваша проблема
Дмитрий (2014-05-14 20:38:00) [4]Удалено модератором
Примечание: Правила читаем и уважаем
sniknik (2014-05-14 17:37:00) [5]не переводи "стрелки". тебя исправляли по "sql-инъекции" (и продолжают про него) и по необходимости "приведения типа" вместо access-а. про параметр "n" никто не "заикался", все верно по нему написано.
Дмитрий (2014-05-14 16:47:00) [6]Где у меня написано про замену параметра куском текста?
У меня написано конкретно: в тексте запроса параметр "n" не обозначен двоеточием, поэтому не обнаруживается и генерит ошибку.
Соответствующий пример изменения текста запроса у меня дан.
Inovet (2014-05-14 16:32:00) [7]> [25] Inovet © (14.05.14 16:31)
> Параметр :Prm1
Присвоение значения параметру :Prm1
Inovet (2014-05-14 16:31:00) [8]> [24] Дмитрий (14.05.14 16:16)
> развейте мои заблуждения
Параметр :Prm1 не то же самое, что замена в тексте запроса куска ":Prm1" на текст присваиваемого значения.
Дмитрий (2014-05-14 16:16:00) [9]развейте мои заблуждения
sniknik (2014-05-14 08:00:00) [10]> Вы хотите сказать, что и пользовательская ошибка не возможна?
хотели бы сказали бы. не думай за нас.
а вот теперь говорю -
что страшного в пользовательской ошибке? они всегда ошибаются, и что? обработанная ошибка от ввода юзера это нормально. на каком этапе ее обработать... да плевать, пусть будет самим присвоением параметров. допустим это выполняется в try except (а даже и нет его) введут число текстом в числовой параметр будет приведение типа (само без ваших действий), запрос сработает как задумывалось, будет текст символами, а не число (а тип переменной число) будет юзеру сообщение о неправильно введенном параметре... повторюсь, и что? разве это неправильное поведение программы, разве не у всех так?
> Хотя бы проводите преобразование к нужному типу данных во избежание.
я бы тебе советовал, не писать о том в чем не разбираешься, во избежание.
Дмитрий (2014-05-13 17:14:00) [11]Я пробовал
Раньше
turbouser (2014-05-13 16:48:00) [12]
> Дмитрий (13.05.14 16:43) [20]
>
> любая
> текст вместо числа
Ну, попробуй :)
Дмитрий (2014-05-13 16:43:00) [13]любая
текст вместо числа
Inovet (2014-05-13 16:37:00) [14]> [18] Дмитрий (13.05.14 16:18)
Какая именно?
Дмитрий (2014-05-13 16:18:00) [15]Вы хотите сказать, что и пользовательская ошибка не возможна?
Ega23 (2014-05-13 10:10:00) [16]
> Однако, подставлять напрямую текст из боксов чревато запустить
> юзерскую ошибку, либо sql-инъекцию от злоумышленника.
Не болтайте ерундой.
sniknik (2014-05-12 16:47:00) [17]> либо sql-инъекцию от злоумышленника.
sql-инъекция через параметры запроса не возможна. только при сборке запроса из частей.
Дмитрий (2014-05-12 16:16:00) [18]SELECT x, Lx
FROM Таблица
WHERE x=:xv1 or x=:xv2 + :n
ADOQuery1.Parameters.ParamByName('xv1').Value:= Edit1.text;
ADOQuery1.Parameters.ParamByName('xv2').Value:= Edit1.text;
ADOQuery1.Parameters.ParamByName('n').Value:= Edit2.text;
Однако, подставлять напрямую текст из боксов чревато запустить юзерскую ошибку, либо sql-инъекцию от злоумышленника.
Хотя бы проводите преобразование к нужному типу данных во избежание.
Дмитрий (2014-05-12 16:08:00) [19]
> SELECT x, Lx FROM Таблица WHERE x=:xv AND x=:xv+nxv, n -
> это параметры. То есть в итоге я должна получить значения
> -два столбца x, Lx и две строки значения.В коде на кнопку
> прописала ADOQuery1.Close;ADOQuery1.Parameters.ParamByName('xv').
> Value:=Edit1.text;ADOQuery1.Parameters.ParamByName('n').
> Value:=Edit2.text;
У вас в запросе параметр ":xv" используется дважды.
Параметр "n" - ни разу, т.к. не обозначен двоеточием.
Поэтому, при подстановке, "n" не будет найден вообще,
":xv" будет присвоен только один раз, поскольку будет воспринят парсером как два параметра с одинаковым именем.
Для него либо используйте два разных имени передавая одну величину, либо ищите в цикле все параметры с названием "xv".
turbouser (2014-05-09 20:27:00) [20]
> Tanya (09.05.14 18:41) [12]
> 'ADOQuery1: Parameter 'n' not found. Process stoped.
Зайди еще раз в список параметров ADOQuery1. Бывает что после изминения запроса не схватывает.