Другие языки программирования и технологии

В Delphi не работает SQL запрос.

Сразу прошу извинить за детский вопрос. Раньше работал с FoxPro. Там все по-другому. Теперь вот осваиваю Delphi. Работаю с БД Access-2016. Там есть таблицы "Школы" и "Ученики". В Form1 вывожу в DBGrid таблицу "Школы". Выбираем там школу и присваиваем переменной "x" значение текстового поля "Название" (например, "Школа №3"). Иду в Form2, наследницу Form1 (uses Form1). Там в DBEdit1 вывожу значение переменной "x". Все ok - "Школа №3". Далее в Form2 пытаюсь в DBGrig вывести список всех учеников Школы №3. Для этого в ADOQuery1, в SQL создаю запрос: SELECT * FROM Ученики WHERE Школа= '+DBEdit1.AsString'. Компилирую, не ругается, но в Grid-е ничего не выводит, а точно известно, что в таблице "Ученики" есть записи со значением поля "Школа" = "Школа №3". ??
в компонентах класса Qyery есть параметры. Пробовали работать через них?
запрос выглядит
"select * from Ученики where Школа=:param1"

далее, в свойстве Params этот параметр появляется сам. определяйте ему тип и так далее
Efefff .
Efefff .
12 465
Лучший ответ
Диман Мосолов Подскажите, пожалуйста, где и как нужно сформировать :param1? Просто назначить, как переменную?
типа:
:param1=Form1.ADOQuery1.FieldByName.[Школа]. AsString; ???
1. Связь между таблицами лучше всего осуществлять при помощи числовых синтетических ключей.
2. Динамическое формирование запроса - это тоже моветон и дыра для SQL injection
3. Скопируй получившийся текст запроса в твою RDBMS и запусти. Там он тоже не пройдет, я гарантирую это.
4. Почитай что-нибудь умное про master-detail в дельфи. Там ничего сложного, но вот прямо тут на пальцах не объяснить.
Мурат Отунчиев
Мурат Отунчиев
88 956
Приводят весь код, желательно на pastebin.com
и сюда ссылку.
А так, мне вот странно это кажется:
SELECT * FROM Ученики WHERE Школа= '+DBEdit1.AsString'
Почему в одинарных кавычках + и остальное... а в начале это нет.
Все должно быть в виде строки и ввод для запроса вообще достаточно в обычном Edit.Text
А так разберите готовый проект и будет ясно.
Ну, как минимум, Школа №3 в кавычки забыл взять. Но могут быть и другие ошибки, т. к. код программы никто не читал
Victor Rodionov
Victor Rodionov
15 185
попробуйте так:
ADOQuery1.SQL.Text:='SELECT * FROM Ученики WHERE Школа= '+QuotedStr(DBEdit1.AsString);
Диман Мосолов Попробовал. И просто копировал строку, и попытался обыграть:
ADOQuery1.Close;
ADOQuery1.SQL.Text:='SELECT * FROM Ученики WHERE Школа= '+'QuotedStr(DBEdit1.AsString)';
ADOQuery1.Open;
нет, пока не заработало....
И все же: - "Спасибо большое вам и всем, кто откликнулся за отклик и участие! ".
SELECT * FROM Ученики WHERE Школа= '+DBEdit1.AsString'
как и сказали выше, - надо добавить кавычки! (двойная кавычка, одинарная кавычка)
ТекстЗапроса = 'SELECT * FROM Ученики WHERE Школа="' + DBEdit1.AsString + '"'
ADOQuery1.чтототам. ТекстЗапроса := ТекстЗапроса;
Иван Ткачук
Иван Ткачук
7 579