Все комментарии Кена Уайта верны. Поскольку вы, очевидно, боретесь с тем, как претворить в жизнь то, что мы сказали, на практике, вот пример проекта, который настолько прост, насколько возможно, который показывает, как правильно использовать параметры в запросе Sql. Для этого:
Создайте новый Delphi проект VCL и добавьте в его форму
- AdoConnection1, для которого ConnectionString установлено подключение к вашему Sql сервер
- AdoQuery1, который использует AdoConnection1
- DataSource1 со свойством DataSet, установленным в AdoQuery1
- DBGrid1, свойство DataSource которого установлено в DataSource1
- Две кнопки с именем btnCreateTable и btnApplyFilter с обработчиками событий, как показано в приведенном ниже коде.
Измените форму проекта, включив в нее код, показанный ниже.
Скомпилируйте и запустите проект.
Нажмите btnCreateTable. Sql, который он выполняет, написан для сервера Microsoft Sql, поэтому может работать некорректно на 100%, если вы используете сервер другого типа. Если какой-либо из операторов sQl создает исключение, редактируйте константы sCreateTable и / или sInsertRows, пока оба не будут выполнены правильно. Если это слишком много проблем, просто создайте таблицу отелей вручную и вставьте строки вручную.
Как только у вас появится таблица отелей со строками данных в ней ...
Нажмите btnApplyFilter
Сетка должна отображать только строки 3 и 4. Если это не так, вы сделали что-то не так, так что проверьте все, исправьте все ошибки и попробуйте снова.
Теперь внимательно изучите код в процедуре TForm1.ApplyFilter.
Константа Filter Sql указывает параметризованный запрос Sql, параметры которого являются требуемое минимальное и максимальное количество звездочек: эти параметры: Min и: Max.
После того, как фильтр Sql был предоставлен AdoQuery1, код устанавливает для AdoQuery1.Prepared значение True; для этого нужно отправить запрос на сервер Sql, чтобы проанализировать его и настроить запрос на выполнение; на самом деле он не выполняет запрос. Запрос, который готовит сервер, включает значения Min и Max в качестве «заполнителей», и сервер ожидает получения значений этих параметров, прежде чем он фактически выполнит запрос. Это то, что в строках
AdoQuery1.Parameters.ParamByName('Min').Value := MinStars;
AdoQuery1.Parameters.ParamByName('Max').Value := MaxStars;
Наконец, вызов
AdoQuery1.Open
говорит серверу фактически выполнить запрос, и, как только сервер это сделает, AdoQuery1 считывает результаты с сервера и отображает их в сетке.
код
const
sCreateTable = 'create table Hotels(ID Int primary key, Name NVarChar(20), Stars int)';
sInsertRows = 'insert Hotels(ID, Name, Stars) values(1, ''One'', 1)'
+ ' insert Hotels(ID, Name, Stars) values(2, ''Two'', 5)'
+ ' insert Hotels(ID, Name, Stars) values(3, ''Three'', 3)'
+ ' insert Hotels(ID, Name, Stars) values(4, ''Four'', 2)';
procedure TForm1.ApplyFilter(MinStars, MaxStars : Integer);
const
FilterSql = 'select * from Hotels where Stars between :Min and :Max';
begin
if AdoQuery1.Active then
AdoQuery1.Close;
AdoQuery1.Sql.Text := FilterSql;
AdoQuery1.Prepared := True;
AdoQuery1.Parameters.ParamByName('Min').Value := MinStars;
AdoQuery1.Parameters.ParamByName('Max').Value := MaxStars;
AdoQuery1.Open;
end;
procedure TForm1.btnApplyFilterClick(Sender: TObject);
begin
ApplyFilter(2, 3);
end;
procedure TForm1.btnCreateTableClick(Sender: TObject);
begin
AdoConnection1.Execute(sCreateTable);
AdoConnection1.Execute(sInsertRows);
end;