Конференция "Начинающим" » запрос не получается [D7, Access]
 
  • Tanya (09.05.14 03:53) [0]
    На форме у меня расположено три компонента 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 как это исправить??
  • Tanya (09.05.14 05:06) [1]
    а ну  DBGrid
  • turbouser © (09.05.14 05:09) [2]
    WHERE x=:xv AND x=:xv+n
    тут ошибка.
    если n - это должен быть параметр, тогда
    WHERE x=:xv AND x=:xv+:n
    но!
    такой запрос при n<>0 не вернет ничего
  • turbouser © (09.05.14 05:18) [3]
    вместо AND должен быть OR, если уж
    > в итоге я должна получить значения -два столбца x, Lx и
    > две строки значения
  • Tanya (09.05.14 05:24) [4]
    Спасибо вам   сейчас попробую
  • Tanya (09.05.14 05:31) [5]
    Все равно не находит параметр n ((
  • Tanya (09.05.14 05:45) [6]

    > но!такой запрос при n<>0 не вернет ничего

    то есть n больше, меньше 0? не поняла эту запись
  • Tanya (09.05.14 05:50) [7]
    а знак равносильности.   Исправила не получается.Может у меня все дело в параметрах ?
  • Tanya (09.05.14 06:57) [8]
    Если убрать второй параметр вообще, то с легкостью работает :(
  • sms (09.05.14 11:01) [9]
    что такое n?
  • Inovet © (09.05.14 12:43) [10]
    > [0] Tanya   (09.05.14 03:53)
    > xv, n -это параметры. То есть в итоге я должна получить
    > значения -два столбца x, Lx и две строки значения.

    Точно? Не диапазон (x-n, x+n)?
  • turbouser © (09.05.14 13:33) [11]
    Долго можно гадать :)

    > Tanya

    Текст ошибки сюда скопируй
  • Tanya (09.05.14 18:41) [12]
    только зашла
    Поясняю значит, я хочу чтобы в результате моего запроса отображалась два поля x и Lx, в первой строке отображалось значение  поля Lх по х столбцу, с введенным параметром  x=:xv, а во второй строке значение  поля Lх по х с веденным параметром x=:xv+:n, где xv и n параметрические переменные введенные в edit-ах. Например отображается x и Lx при х=40 и х=40+10 то есть 50.
    Текст ошибки: Project1.exe raised exception class EDatabase Error with message 'ADOQuery1: Parameter 'n' not found. Process stoped.
  • turbouser © (09.05.14 20:27) [13]

    > Tanya   (09.05.14 18:41) [12]


    >  'ADOQuery1: Parameter 'n' not found. Process stoped.

    Зайди еще раз в список параметров ADOQuery1. Бывает что после изминения запроса не схватывает.
  • Дмитрий (12.05.14 16:08) [14]

    > 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".
  • Дмитрий (12.05.14 16:16) [15]
    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-инъекцию от злоумышленника.
    Хотя бы проводите преобразование к нужному типу данных во избежание.
  • sniknik © (12.05.14 16:47) [16]
    > либо sql-инъекцию от злоумышленника.
    sql-инъекция через параметры запроса не возможна. только при сборке запроса из частей.
  • Ega23 © (13.05.14 10:10) [17]

    > Однако, подставлять напрямую текст из боксов чревато запустить
    > юзерскую ошибку, либо sql-инъекцию от злоумышленника.


    Не болтайте ерундой.
  • Дмитрий (13.05.14 16:18) [18]
    Вы хотите сказать, что и пользовательская ошибка не возможна?
  • Inovet © (13.05.14 16:37) [19]
    > [18] Дмитрий   (13.05.14 16:18)

    Какая именно?
  • Дмитрий (13.05.14 16:43) [20]
    любая
    текст вместо числа
  • turbouser © (13.05.14 16:48) [21]

    > Дмитрий   (13.05.14 16:43) [20]
    >
    > любая
    > текст вместо числа

    Ну, попробуй :)
  • Дмитрий (13.05.14 17:14) [22]
    Я пробовал
    Раньше
  • sniknik © (14.05.14 08:00) [23]
    > Вы хотите сказать, что и пользовательская ошибка не возможна?
    хотели бы сказали бы. не думай за нас.

    а вот теперь говорю -
    что страшного в пользовательской ошибке? они всегда ошибаются, и что? обработанная ошибка от ввода юзера это нормально. на каком этапе ее обработать... да плевать, пусть будет самим присвоением параметров. допустим это выполняется в try except (а даже и нет его)  введут число текстом в числовой параметр будет приведение типа (само без ваших действий), запрос сработает как задумывалось, будет текст символами, а не число (а тип переменной число) будет юзеру сообщение о неправильно введенном параметре... повторюсь, и что? разве это неправильное поведение программы, разве не у всех так?

    > Хотя бы проводите преобразование к нужному типу данных во избежание.
    я бы тебе советовал, не писать о том в чем не разбираешься, во избежание.
  • Дмитрий (14.05.14 16:16) [24]
    развейте мои заблуждения
  • Inovet © (14.05.14 16:31) [25]
    > [24] Дмитрий   (14.05.14 16:16)
    > развейте мои заблуждения

    Параметр :Prm1 не то же самое, что замена в тексте запроса куска ":Prm1" на текст присваиваемого значения.
  • Inovet © (14.05.14 16:32) [26]
    > [25] Inovet ©   (14.05.14 16:31)
    > Параметр :Prm1

    Присвоение значения параметру :Prm1
  • Дмитрий (14.05.14 16:47) [27]
    Где у меня написано про замену параметра куском текста?
    У меня написано конкретно: в тексте запроса параметр "n" не обозначен двоеточием, поэтому не обнаруживается и генерит ошибку.
    Соответствующий пример изменения текста запроса у меня дан.
  • sniknik © (14.05.14 17:37) [28]
    не переводи "стрелки". тебя исправляли по "sql-инъекции" (и продолжают про него) и по необходимости "приведения типа" вместо access-а. про параметр "n" никто не "заикался", все верно по нему написано.
  • Дмитрий (14.05.14 20:38) [29]
    Удалено модератором
    Примечание: Правила читаем и уважаем
  • Кщд (15.05.14 10:51) [30]
    >Дмитрий   (14.05.14 20:38) [29]
    sql-injection при работе с параметрами невозможна
    то, что Вы не умеете признать свою ошибку, Ваша и только Ваша проблема
  • Дмитрий (15.05.14 16:18) [31]
    Если вы перечитаете, то про SQL-инъекцию я не настаиваю.
  • Дмитрий (15.05.14 16:18) [32]
    В смысле, инъекцию через параметры.
 
Конференция "Начинающим" » запрос не получается [D7, Access]
Есть новые Нет новых   [134427   +38][b:0][p:0.001]