adoquery delphi запросы с параметром

Запросы на выборку из БД в Delphi с использованием компонента ADOQuery

В этой статье рассмотрим задачу выборки записей из БД, применив компонент ADOQuery. Подключение и взаимодействие с базой данных уже рассмотрено в одной из предыдущих статей. Поэтому здесь на этом останавливаться не будем.

Для работы с запросами в Delphi по технологии ADO используется компонент ADOQuery. Что касается подключения компонента, работа с ним подобна работе с ADOTable. Ему так же необходимо указать ADOConnection, подключенный к БД (можно так же настроить свойство подключения к БД ConnectionString). Для отображения на форме данных ему так же нужен компонент DataSource, подключаемый к компонентам отображения и управления данными из закладки палитры Data Controls (DBGrid, DBEdit и другие).

В отличие от ADOTable, запрос не содержит свойств для выбора таблицы, которую он будет отображать. Вместо этого он имеет поле SQL, которое должно содержать текст SQL-запроса к БД для выбора необходимых данных.

Статический запрос

Для получения содержимого таблицы следует указать следующие поля ADOQuery:

Connection – выбрать из списка настроенное подключение к БД.

SQL – ввести текст любого SQL-запроса, например: «SELECT * FROM mytable».

Active – присвоить значение True.

Если при присвоении свойству Active, сведений об ошибках не было выведено, значит все выполнено правильно и далее можно пользоваться ADOQuery, как обычной таблицей для вывода его данных (вывод осуществляется аналогично таблице через компонент DataSourcе, например, в DBGrid).

Плюс запроса в том, что в нем можно сформировать нужную выборку сразу из нескольких таблиц. Здесь можно так же применить сортировку и группировку данных.

Динамическое изменение запроса во время исполнения программы

Если в процессе работы программы, текст SQL-запроса нужно переписывать, как, например, при указании условия выборки, то можно просто программно управлять режимом исполнения запроса и содержимым его поля SQL.

Для этого применяется следующий код:

Программная работа с результатами запроса

Если результат запроса нужно не просто вывести, а выполнять с ним какую-то работу непосредственно в коде, то обратится к ним через свойство Fields. Например, код:

выведет во всплывающем окне содержимое первого поля текущей записи.

Fields[номер поля] – указывает номер столбца в сформированной запросом таблице. Самое первое будет нулевое.

AsString – указывает, что тип возвращаемого значение будет строковый. Аналогично можно указать AsInteger, чтобы получить числовое значение.

Перемещение по записям выполняется аналогично программному переходу в таблицах:

Источник

Работа с ADO в Delphi. Часть 2

Далее на кнопку «Добавить» я написал следующий код

Исходный код

На кнопку «Удалить» я написал следующий код

Исходный код

Здесь метод Delete, то есть с помощью него мы удаляем запись из таблицы на которой стоит указатель, мы конечно можем удалить с помощью запроса, но тогда нам придется получать уникальный номер записи, но это мы посмотрим в следующем уроке по базам данных.

На кнопку «Редактировать» я написал следующий код

Исходный код

Здесь самое главное это метод Edit, который ставит текущую строку в режим редактирование, а дальше точно также как и с добавлением, редактирование и добавление также можно написать с помощью запросов, что мы и рассмотрим в следующей статье.

Исходный код

Здесь почти точно также как и в добавлении, только мы делаем все наооборот, присваиваем значения из таблицы в наши поля.

На кнопку «Вниз» я написал следующий код

Исходный код

Метод Last означает, что мы переместимся на последнюю запись нашей таблицы

На кнопку «Обновить» я написал следующий код

Исходный код

Метод Refresh означает, что мы обновляем данные в таблице и соответственно они обновляются и перед нами

На кнопку «Вверх» я написал следующий код

Исходный код

Метод First означает, что мы перейдем на первую запись в нашей таблице

На кнопку «Далее» я написал следующий код

Исходный код

Метод Next означает, что мы будем проходить последовательно по записям вниз

На кнопку «Назад» я написал следующий код

Исходный код

Метод Prior означает, что мы будем проходиться последовательно по записям нашей таблицы вверх

Далее после редактирования, добавления данных нам необходимо их сохранить, вот поэтому и существует у нас кнопку «Сохранить» на событие OnClick, которой я написал следующий код

Исходный код

Здесь все просто метод Post сохраняет все измененные данные в нашей таблице.

Далее идут у нас кнопку с небольшими запросами, на кнопке «Вывести всех с оценками 10» по событию OnClick я написал следующий код

Читайте также:  Vacation надпись на холодильнике что означает
Исходный код

Далее на кнопке «Вывести все фамилии, в которых присуствует Иван» я написал следующий код

Исходный код

Здесь у нас уже новенькое в SQL-синтаксисе LIKE и конструкции %%, да именно эта конструкция и ищет совпадения Иван в поле fio во всех записях. И наконец выводим все записи нашей таблиц для этого достаточно написать следующий код

Исходный код

Также во вкладке ADO есть хороший компонент TADOTable, который работает по такому же принципу как и TADOQuery, но в TADOTable нельзя формировать SQL-запросы, поэтому я предпочитаю TADOQuery. В следующей статьи про БД я напишу как добавлять, редактировать и удалять данные с помощью SQL-запросов. Исходник данной статьи Вы сможете скачать на странице Исходники

Источник

Работа с ADO в Delphi. Часть 3

Как и обещал и не долго думая написал пару запросов к БД MS Access, через которые можно добавлять данные в нашу БД, редактировать, удалять. Да конечно через запросы делать может немного сложнее для кого-то, но не для нас правда? Просто через запросы это все дело происходит быстрее. Например, чтобы удалить все данные нам из таблицы без запросов, то нам необходимо пройти все это дело циклом, а это время, а если записей в БД 200000, а через запрос, если это все дело организовать, то будет на много приятнее, красивее и конечно же быстрее, что немаловажно для нас. Здесь отличия у нас будут следующие:

Кто забыл как мы добавляли, редактировали, удаляли и так далее записи в БД MS Access в Delphi через технологию ADO, сможет посмотреть вот в этой статье.

Все тоже самое, расположите нужные компоненты на форму, что мы уже проходили раньше и начнем писать нам нужные процедурки, обработчики и так далее. Начнем все с вывода наших данных при первоначальном запуске программы нашей. Для этого на событие нашей главной формы OnCreate напишем следующее

Здесь ничего нового для Вас нету, мы это уже делали в прошлой статье по Базам данных, так что комментировать тут ничего не буду, мы просто делаем запрос на все записи в таблице нашей — Student.

Далее мы добавим данные с помощью запроса, для этого на событие кнопки OnClick напишем следующий код

Здесь у нас новый вид запроса INSERT INTO. Здесь мы указываем таблицу, в которую будем добавлять данные, а затем в скобках перечисляются поля, в которые будем вставлять данные, а затем VALUES и в скобках такое же количество данных, сколько указали и полей. Как видите ничего не сложно. И потом ExecSQL мы просто выполняем наш запрос, так как такие запросы надо выполнять, Active здесь не «прокатит«. Запрос делаем мы затем на вывод всех данных, в связи с тем, что после добавление, редактирования, удаления наш DBGrid не хочет обновляться, видно «глючность» ADO поэтому я решил на время решить эту проблему именно так.

Затем удалим выделенную строку в нашей таблицы, для этого, нам нужно получить уникальное число этой строки, чтобы удалять именно ее, а не что другое. Для этого я создал в нашей таблице поле id и задал ей тип Счетчик.

Далее на событие DBGrid OnCellClick я написал следующее

Здесь мы получаем это самое уникальное поле, а уникальное оно будет всегда потому, что у id в таблице тип Счетчик и он соответственно никогда не будет повторяться.

Так когда мы получили уникальное поле, теперь можно и удалить нам нужную запись

Здесь мы запросом DELETE удаляем запись по условию id=:pid. А pid мы присваиваем значение, которое получаем по клику на наш DBGrid. Здесь немного поясню в TAdoQuery есть свойство Parametrs, там нам необходимо добавить параметр новый, указать его имя и тип, в данном случае я выбрал тип — ftInteger. Затем после запроса мы этот параметр заполняем, а в самом запросе используем, то есть чтобы удалили именно текущую запись, удаляем по условию где задаем с помощью WHERE.

Удалить все данные еще проще

Здесь мы не указываем никаких параметров ничего просто удаляем все записи, вот про что я говорил, что запросом удалить все записи намного быстрее чем через цикл.

И наконец отредактируем данные вот так

Здесь используется конструкция UPDATE SET, указываем таблицу где обновлять данные через SET указываем поля, которые обновляем и сразу через «=» задаем им новые значения, ничего сложного, ну и конечно нам надо отредактировать именно выделенную запись (текущую), поэтому также задаем условие WHERE id мы один раз на OnCellClick получаем, поэтому он у нас в любом случае будет чему-то равняться. Ну что как видите ничего сложного. Дальше мы рассмотрим как работать в ADO с BLOB-полями, их преимущества и многое другое.

Читайте также:  миньян в иудаизме что это
Кстати, хочу заметить, что если у Вы надумали создать свое предприятие, а точнее общество с ограниченной ответственностью (ООО), то Вам необходимо будет обязательно иметь устав. Вы можете взять за основу образец устава ООО planbusiness.ru, без него Вы просто-напросто не сможете зарегистрировать ООО.

Исходники статьи качаем тут

Похожие записи

К записи “Работа с ADO в Delphi. Часть 3” оставлено комментариев: 90.

почему же? все добавляется и удаляется, у Вас какая версия Delphi и Access?

Вот есть вопрос такого характера вот если добавляем через запрос новую запись
//procedure TForm1.Button1Click(Sender: TObject);
//begin
//try
//ADOQuery1.SQL.Clear;
//ADOQuery1.SQL.Add(‘INSERT INTO Student(fio,oz) VALUES(»Иванов Иван Иванович»,10)’);
//ADOQuery1.ExecSQL;
//ADOQuery1.SQL.Clear;
//ADOQuery1.SQL.Add(‘SELECT * FROM Student’);
//ADOQuery1.Active:=True;
//except
//on e:Exception do
//end;
//end;
То он добавляет строго «Иванов Иван Иванович» а как добовлять с класса Tedit Вот мой пример кода выдает ошибку

procedure TForm2.Button1Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(‘INSERT INTO Òîâàð(Name,Income,Price) VALUES (edit1.text,IntToStr(Edit2.text),IntToStr(Edit3.Text))’);
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(‘SELECT ¹,Name,Income,Price From Òîâàð’);
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

И да даже если добовлять через програамму записи строго указаные то почему то индексное поле в базе не последовательно а может после 2 записи считать сразу 5

У Вас запрос не правильный, должно быть, что-то вроде:
ADOQuery1.SQL.Add(‘INSERT INTO Òîâàð(Name,Income,Price) VALUES (‘+edit1.text’+,’+IntToStr(Edit2.text)+’,’+IntToStr(Edit3.Text)+’)’);

Спасиб буду дома проверю. А вот насчет счетчика базы даных че делать то?

может у тебя уже какие-то записи удалялись, а индексное поле не ведет счет сначала

Вот че он мне написал на этот листинг.

на какой именно? было бы неплохо, чтобы Вы скинули ваш проект

Скинуть не проблема. Куда скидывать?

на любой файлообменник, а сюда ссылку

Там на второй форме.

procedure TForm2.Button1Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(‘INSERT INTO Товар(Nam,income,price) VALUES (»’+edit1.text+»’,’+Edit2.text+’,’+Edit3.Text+’)’);
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(‘SELECT №,Nam,Income,Price From Товар’);
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

Вот Ваш код, и в базе необходимо поменять поле Name на Nam в таблицы Товар, Вы использете зарезервированное имя.

Спасибо заработало. Переименовал в таблице поле. и в запросах поправил только вот теперь когда добавляю запись все добовляетса но поле нам при это остаетса пустым.

Все разобралса спасиб большое

А как можно с вами связатса? необходима консультация по зазработке собственного класса В томже делфи. Прочел в двух книгах но результат отрицательный.

только по скайпу — andrey_z53

Вот еще вопрос. как правельно и где написать
(id:=ADOQuery1.Fields.Fields[0].AsInteger;) так как в events выдает ошибку.
пробовал так:
DBGrid1.OnCellClick(Id:=ADOQuery1.Fields.Fields[0].AsInteger);
Тож ошибку выдет.

id:=ADOQuery1.Fields.Fields[0].AsInteger
Это напишите на событие OnClick компоненте TDbGrid

Дык вот в это и упераюсь. два раза клацаю на DBGrid1 он не генерирует код а открывает редактор полей.
Пробовал писать так:
Procedure Tform2.dbgrid1.oncellclick(sender: Tobject);
Begin
id:=ADOQuery1.Fields.Fields[0].AsInteger;
end;

Но это тож ему не понравилось.

Потому что TDbgGrid необходимо выставить свойство Options-dgEditing в False и данный код заменить на:
id:=ADOQuery1.Fields.Fields[0].AsInteger;
ShowMessage(IntToStr(id));
И это событие у Вас одинарного клика, а не двойного, поэтому два раза жать бесполезно, оно возникнет на первый щелчок

Я так и не понял в какой части кода надо печатать: id:=ADOQuery1.Fields.Fields[0].AsInteger;

А в листинге можно? Для особо тупых. ПЛЗ.

Procedure Tform2.dbgrid1.oncellclick(sender: Tobject);
Begin
id:=ADOQuery1.Fields.Fields[0].AsInteger;
ShowMessage(IntToStr(id));
end;
и в TDbgGrid необходимо выставить свойство Options-dgEditing в False

Выдает вот такую ошибку…

Build
[Error] Unit2.pas(84): Declaration of ‘dbgrid1′ differs from previous declaration
[Error] Unit2.pas(86): Undeclared identifier: ‘ADOQuery1′
[Error] Unit2.pas(86): Missing operator or semicolon
[Fatal Error] Project1.dpr(6): Could not compile used unit ‘Unit2.pas’
Это на всяк случай
http://files.mail.ru/FF689B295. 146CF85D38

а код какой написали?

Который вы дали. Ссыль но программу дал.

Потому что у Вас событие не то, посмотрите внимательно!

procedure TForm2.DBGrid1CellClick(Column: TColumn);
begin
id:=ADOQuery1.Fields.Fields[0].AsInteger;
ShowMessage(IntToStr(id));
end;

Поменял теперь пишет вот такое:
[Error] Unit2.pas(84): Undeclared identifier: ‘DBGrid1CellClick’
[Error] Unit2.pas(84): ‘;’ expected but ‘(‘ found
[Error] Unit2.pas(86): Undeclared identifier: ‘ADOQuery1′
[Error] Unit2.pas(86): Missing operator or semicolon
[Fatal Error] Project1.dpr(6): Could not compile used unit ‘Unit2.pas’

у Вас событие нет такого понимаете? Вы обработчик создайте, перейдите в список событие и найдете его, затем нажмите двойным щелчком и напишите тот код, что дал Вам!

Еврика заработало только теперь при нажатие клавиши дает ошибку:
Project Project.exe raised exception class EDatabaseError with message ‘DOQuery1: Parameter ‘pid’ not found’. Ну и отстановка процесса.
В свойства.параметры добавил один с именем pid и типом переменной Integer.
http://files.mail.ru/9162EE33D. 5251F30376

Читайте также:  малахит или нефрит что дороже

а можно вопрос, в последнем типе запроса,на обновление,ниже строчка у вас
ADOQuery1.Parameters.ParamByName(‘pid’).Value:=id;
что она делает? непонятно

здесь мы добавляем параметр, по которому в условии будем отбирать записи

Эх, поздновато я эти статьи начал читать… А то бы применил TADOQuery вместо TADOTable.

Андрей, может быть подскажете, как в случае TADOTable копировать строки в базе данных, с одновременной заменой данных в некоторых полях. Нужно что-то аналогичное вашему:

«ADOQuery1.SQL.Add(‘INSERT INTO Student(fio,oz) VALUES(»Иванов Иван Иванович»,10)’);»

Например, в базе данных есть поля ‘Фамилия’, ‘Имя’, ‘Адрес’. Проживающие (несколько человек) по одному из адресов переехали в другой город, и мне нужно оставить существующие записи с адресом, а также добавить новые записи с новым адресом (тогда в базе будет список всех адресов, по которым проживали эти люди).

Вот схема кода с выделенным непонятным местом. Надеюсь на вашу помощь.

procedure TForm1.FormCreate(Sender: TObject);
begin
ADOTable1.Active:=False;
ADOTable1.TableName:=’AddressBook’;
ADOTable1.Active:=True;
ADOTable1.First;
While not ADOTable1.eof do
begin
if (ADOTable1.fieldbyname(‘Address’).AsString = ‘Москва…’) then
begin
ADOTable1.Edit;
…………………// вот здесь непонятно, что делать
ADOTable1.Post;
end;
ADOTable1.Next;//переходим на следующую запись
end;
end;

У меня только один вариант, довольно громоздкий: скопировать неизменяемые данные полей записи в промежуточные переменные (varSurname, varName), затем выполнить

ADOTable1.Insert;
ADOTable1.fieldbyname(‘Surname’).AsString:= varSurname;
ADOTable1.fieldbyname(‘Name’).AsString:= varName;
ADOTable1.fieldbyname(‘Address’).AsString:= ‘Омск…’;

Есть сомнения в работоспособности такого кода (например, с какой записи пойдет дальнейший отсчет), но пока ничего лучше не придумал, увы. :-((

там где Вы делаете проверку, то сразу вставляейте новую запись, с новым адресом

Источник

Adoquery delphi запросы с параметром

Help me! В обычном TQuery параметры объявлял так:

А как объявляются параметры в TADOQuery?

Пробую так:
ADOQuery1.Parameters.ParamByName(«xxx»).Value := AlgId;

и так:
ADOQuery1.Parameters.ParamValues[«xxx»] := AlgId;

и так:
ADOQuery1.Parameters.CreateParameter(«xxx», ftInteger, pdInput, 10, nil);

но постоянно выходят ошибки типа: «Parameter object is improperly defined. Inconsistent or incomplete information was provided.»


Johnmen ( 2002-08-01 14:33 ) [1]


shubin ( 2002-08-01 14:33 ) [2]


nikolo ( 2002-08-01 14:41 ) [3]

Код примерно следующий:

ADOQuery1.Close;
ADOQuery1.SQL.Text := «Select * From Table1 Where Field1=:pmXXX»;
<1 вариант>
ADOQuery1.Parameters.ParamValues[«pmXXX»] := Var1;
<2 вариант>
ADOQuery1.Parameters.CreateParameter(«pmXXX», ftInteger,
pdInput, 10, OV);
<3 вариант>
ADOQuery1.Parameters.ParamByName(«pmXXX»).AsInteger := Var1;
<4 вариант>
ADOQuery1.Parameters.ParamByName(«pmXXX»).Value := Var1;

И ни один из этих вариантов не работает! В чем проблема-то? Напишите примерчик, как именно делается присваивание значений параметрам.


shubin ( 2002-08-01 14:46 ) [4]

присваивание текста запроса
.
adcvspom.Parameters.Clear;
adcvspom.parameters.addParameter.name:=»id»;
adcvspom.Parameters.ParamByName(«id»).DataType:=ftfixedchar;
adcvspom.Parameters.ParamByName(«id»).Attributes:=[paNullable];
adcvspom.Parameters.ParamByName(«id»).Value:=id;
Замеченые грабли: При использовании ADO+Jet4.0 Access после присваивания значения ыйд запроса он ИНОГДА неправильно определял сам количество и тип параметров отсюда adcvspom.Parameters.Clear и все создаем ручками.
При обращении по индексу он расставляет их не в порядке записи а в порядке следования в запросе


nikolo ( 2002-08-01 14:59 ) [6]

Все правильно, этот код у меня тоже работает, но! Вот какой код НЕ работает:

qry.Close;
qry.SQL.Text := «Select * From Table1 Where Field1=:par1»;
if BoolValue then
qry.SQL.Add(» and Field2=(Select Min(Field2) From Table1 Where Field1=:par1)»);
qry.Parameters.ParamByname(«par1»).Value := var;
qry.Open;

И вот тут-то такая ошибка:
«Parameter object is improperly defined. Inconsistent or incomplete information was provided.»


jonik pegas ( 2002-08-01 15:06 ) [7]

Текст ошибки тебе все вполне понятно обьясняет. Свойства параметра в ADO безглючней делать ручками


nikolo ( 2002-08-01 15:07 ) [8]

Кажется я понял. По всей видимости, в ADO нельзя один и тот же параметр повторять несколько раз. Надо писать так:

qry.Close;
qry.SQL.Text := «Select * From Table1 Where Field1=:par1»;
if BoolValue then
qry.SQL.Add(» and Field2=(Select Min(Field2) From Table1 Where Field1=:par2)»);
qry.Parameters.ParamByname(«par1»).Value := var;
qry.Parameters.ParamByname(«par2»).Value := var;
qry.Open;

Или я не прав? Может быть все-таки можно, но как-то иначе?


shubin ( 2002-08-01 15:11 ) [9]


nikolo ( 2002-08-01 15:22 ) [11]

Ну как? Что скажете?


nikolo ( 2002-08-01 15:24 ) [12]

А у меня вот не работает 🙁 Где патчи взять-то?


Lord Warlock ( 2002-08-01 15:27 ) [13]


nikolo ( 2002-08-01 15:35 ) [14]

qry.Parameters.AddParameter.Name := «par1»;
qry.Parameters.ParamByName(«pmAlgId»).Attributes:=[paNullable];
qry.Parameters.ParamByName(«pmAlgId»).DataType:=ftFixedChar;
qry.Parameters.ParamByName(«pmAlgId»).Direction := pdInput;
qry.Parameters.ParamByName(«pmAlgId»).Value := var1;

но все равно такая же ошибка!
Работаю я не с Access, а с MS SQL 2000.
2 параметра я делаю не одинаковые, а par1 и par2 соответственно.

Так что совершенно не понятно в чем заморочка, может действительно в патчах на Delphi5 и ADO?


KSergey ( 2002-08-01 17:30 ) [16]

Источник

Образовательный портал