Как добавить запись в access delphi

от admin

Работа с базой данных Access в Delphi

В данной статье рассмотрим как можно реализовать программу, которая сможет работать с данными, размещенными в файле СУБД MS Access. Программе необходимо подключиться к внешнему файлу БД. Затем, в ней должна быть реализована форма, в которой пользователь сможет просматривать записи из таблицы БД, добавлять новые записи, удалять или редактировать их.

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

Чтобы организовать работу программы с БД, потребуется следующие компоненты:

ADOConnection – используется для подключения к БД (закладка палитры ADO, в некоторых версиях dbGO);

ADOTable – связывается с конкретной таблицей БД (закладка ADO);

DataSource – компонент, используется как связка данных из таблиц, с отображающими и управляющими компонентами Delphi (закладка Data Access);

DBGrid – таблица, позволяющая вывести содержимое таблицы БД на пользовательскую форму (закладка Data Controls);

DBNavigator – кнопочная панель, способная управлять данными в привязанной к ней таблице (закладка Data Controls).

После того, как все компоненты установлены на форму, можно приступить к их настройке. Для решения нашей задачи никакого программного кода не потребуется. Только настройка свойств компонентов:

Свойство ConnectionString компонента ADOConnection

Свойство ConnectionString удобно настраивается в специальных окнах. Открываем редактор свойства ConnectionString в инспекторе объектов кнопкой «…» . В появившемся окне оставляем все настройки как они были по умолчанию и нажимаем кнопку «Build…» .

Получаем еще одно окно с несколькими закладками.

В первой закладке ;Поставщик данных» выбираем в списке «Microsoft.Jet.OLEDB.4.0» и жмем «Далее >>» .

Во второй закладке «Соединение ; в поле «1. Выберете или введите имя базы данных:» жмем «…» и привычным окном выбираем нужный файл БД. Здесь стоит отметить, что при выборе адреса, будет указан полный путь, начиная от корневой директории. При таком указании директории, становится неудобно использование программы на другом компьютере, так как приходится создавать все директории, что и на компьютере, где была создана программа. Чтобы не сталкиваться с такой проблемой, удобней указать относительный путь. Если в этом поле указать только имя файла БД, то программа будет открывать ее из той же директории, где она находится, в какую бы директории ее не разместили. Естественно файл БД должен находиться в той же папке, куда вы сохраняете свой проект Delphi.

Снова видим предыдущее окно, но уже с заполненной строкой. Снова нажимаем «ОК» . Все, настройка свойства ConnectionString завершена.

Свойство LoginPrompt компонента ADOConnection

Это свойство логического типа определяет, будет ли при подключении к БД запрашиваться пароль. Пока никакие пароли не нужны, поэтому, чтобы оно не мешало при работе с программой ставим ему значение False.

Свойство Connected компонента ADOConnection

Свойство определяет, выполнено ли подключение в данный момент. Чтобы не подключаться к БД программно после запуска приложения, указываем True. Если после присвоению свойству значения True, Delphi не вывел никаких сообщений об ошибках, значит, все выполнено правильно. В случае ошибок, стоит проверить, правильно ли указано имя файла БД или «Поставщик данных».

Свойство Connection компонента ADOTable

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

Свойство TableName компонента ADOTable

Выбираем из списка необходимую таблицу из БД.

Свойство Active компонента ADOTable

Свойство, определяющее режим работы компонента. Указываем значение True. Если сообщений об ошибках нет, все нормально. Если есть, проверьте предыдущие два свойства.

Свойство DataSet компонента DataSource

Из списка выбираем нужную таблицу, если их несколько. Обычно для удобства каждой таблице в БД соответствует своя пара ADOTable + DataSource.

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

Свойство DataSource компонентов DBGrid и DBNavigator

Свойство настраивается выбором из списка нужного компонента DataSource.

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

Рисунок: Подключение Delphi с БД Access

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

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

  • вместо Active мы будем использовать ExecSQL
  • ну и конечно же будем использовать запросы

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

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

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

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

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

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

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

id — типа integer, не забудьте объявить.

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

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

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

Читать:
Не открывается gimp на виндовс 10 почему

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

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

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

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

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

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

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

  • Работа с ADO в Delphi. Часть 11. Получение информации набора данных
  • Работа с ADO в Delphi на примере БД MS Excel. Часть 2
  • Работа с ADO в Delphi. Часть 1
  • Работа с ADO в Delphi. Часть 2
  • Работа с ADO в Delphi. Часть 6. Вычисляемые поля

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

1 При удалении записей они все-таки остаются в таблице, так как размер файла базы не уменьшается, записи как то можно увидеть с пометкой «удалено»?
2 фактически при добавлении записей , данные в файл добавлены не будут, пока не закроется само приложение. Где хранятся тогда данные? Это вроде называется принудительным сбросом кеша на диск?)

почему же? все добавляется и удаляется, у Вас какая версия 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:= ‘Омск…’;

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

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

Похожие статьи