Delphi. Как добавить запись в конец БД?

В данном посте рассмотрим варианты добавления записи в БД MySQL. Для простоты будем использовать технологию DBExpress. Для других технологий и БД, думаю, принципы будут схожими.

Подготовительные работы

Для начала, воссоздадим пример подключения к БД, а также прочитаем таблицы БД. Для работы, будем использовать созданную нами БД test_db и таблицу Departments. Несколько изменим кнопки на вкладке DBGrid. Добавим кнопки “Добавить через SQL”, а также “Добавить через Append Post Refresh”

1_3

Итак, наша задача – различными способами добавить новую запись в DBGrid. На данном этапе я знаю о 2-х способах добавления записи – напрямую через SQL запрос и через Delphi, в процессе, может быть, обнаружится что-то ещё.

Как в Delphi  добавить запись через SQL запрос?

В нашей схеме есть следующие компоненты для работы с БД

SQLConnection

SimpleDataSet

DataSource

это необходимый минимум…., а также компонент SQLQuery, через него мы получали таблицы БД…

2

 

Самый простой способ – отправить SQL запрос через SQLConnection1.Execute(‘Text_of_SQL_Request’). Как делать сами запросы (в консольном клиенте MySQL) на добавление записей, можно посмотреть здесь.

Таким образом, в самом простом случае, в Delphi, я написал обработчик таким образом…

В подтверждение того, что запись отобразилась, можно посмотреть в консольном клиенте…

3

Действительно…  “New Record” есть под номером 6…

Далее, нам нужно как-то обновить отображение таблицы в Delphi… Для этого, я дополнил код таким образом…

Результат получился таким…

4

 

Этот способ, на мой взгляд, достаточно простой и надежный. Единственное, что нужно – уметь общаться с выбранной СУБД на языке SQL. Я на данный момент выбрал для себя MySQL – на мой взгляд достаточно простую СУБД. В процессе обучения работе с ней – написал цикл статей.

(КАК НЕ НУЖНО ДЕЛАТЬ) Вариация добавления записи через SimpleDataSet…

Когда мы отправляем запрос из simpledataset, да и вообще, из любого dataset, то delphi ожидает возвращения множества и курсора в нем… Поэтому, если запрос у Вас не связан с возвращением множества (например Select – возвращает множество, а insert не возвращает), тогда лучше запрос из dataset не отправлять…

Ошибочный код мог бы быть таким…

 

5

 

При этом, запись добавляется как нужно…. Просто будет выскакивать неприятная ошибка невозврата курсора…

6

 

Как ещё можно добавить запись через SQL запрос?

А очень просто – через специализированный компонент SQLQuery. Уж он то не ожидает возвращения курсора. Поэтому, направляем код добавления новой записи в него. Обратите внимание, что обновление DBGrid, мы производим, всё таки через SimpleDataSet…

7_1

 

Можно также добавлять записи через SQLTable.Insert или SQLTable.insertrecord… Но это уже тема для отдельного обзора.

Как добавить запись через Append Post ApplyUpdates Refresh?

Здесь интересные моменты получились – разобрался не сразу. Вот рабочий код…

Но, в процессе создания кода у меня произошел трабл.

 

ТРАБЛ

Изначально я создал код без строчки

А что это за строчка? Это главный ключ этой таблицы. Я наивно полагал, что раз поле автоинкрементное, то либо Delphi, либо MySQL, его обработают и добавят следующую запись. Но не тут-то было !!!

Оказалось, надо было всё делать “ручками”. Что же! Теперь мы об этом моменте знаем!!! Когда я добавил эту строчку – всё заработало как надо. То есть, иными словами, при этом методе, надо будет следить за этим автоинкрементным полем.

В случае, когда мы добавляем запись через запрос SQL, за нумерацией в автоинкрементном поле следит CУБД, поскольку, в предыдущем случае, мы добавляли всего одну строчку.

ДРУГОЕ РЕШЕНИЕ ТРАБЛА

Можно просто, при формировании таблицы на автоинкрементном поле убрать NOT NULL, и тогда всё встанет на место (не проверял сам, но должно работать)

Но, к слову сказать, на mysql.ru, очень рекомендуют ставить галочку NOT NULL. Говорят убирать её только в крайнем случае, если это действительно нужно. Думаю, это как раз такой случай.

This entry was posted in DBExpress, Delphi. Bookmark the permalink.