Delphi XE7. DBExpress. Основные операции (вставка, редактирование, удаление и др.) в БД из Delphi…

В данном посте соединим пример, написанный про подключение к MySQL из Delphi,

4

и пример про решение проблемы нескольких одновременных SQL инструкций.

3

вкладку Simple SQL Requests назовем DBGrid, удалим на левой панели все, что ниже кнопки “Показать таблицу”, вместо этого добавим кнопки “Добавить запись” “Редактировать запись” и “Удалить запись”… и другие кнопки…

1

По сути – создадим свой DBNavigator для лучшего понимания взаимодействия Delphi кода и сервера MySQL. Будем использовать тестовую БД test_db, которую создали в одном из предыдущих постов. Единственное, добавил к ней таблицу MyTable и 5 записей, для простоты… MyRecordN

Скрипт для программы-сервера MySQL для создания БД и таблиц для экспериментов….


Как работать с записями БД из DELPHI?

Общий принцип такой, вы обращаетесь к множеству (например, simpledataset.insert), далее, делаете что-то программно, либо ожидаете действий пользователей, далее отправляете результаты в физическую базу данных инструкциями (simpledataset.post; simpledataset.applychanges(-1);), далее обновляете множество (simpledataset.refresh)


Шаг 1 Обращаемся к множеству

Шаг 2 Подтверждаем действия, отправляем подтверждение в физическую БД

Шаг 3 (не обязательный) Обновляем множество


Всегда закрывайте методом Post инструкции insert /append / edit / delete так как delphi от вас этого ждет)) Иначе возможны ошибки.


Как вставить запись в середину таблицы (INSERT) ?

Подробно об этом я написал здесь.

Но в данном абзаце скажу об основных моментах. Я экспериментировал со связкой MySQL Delphi (DBExpress)

Факт. Если Вы выполняете insert на множестве, например на simpledataset, то при отображении в DBGrid запись вставится туда, где Вы её поставили, но как только Вы сохраните её в физическую БД, то она почти всегда добавится в конец, и если вы выполните обновление множества (например, таким способом SimpleDataSet.refresh), то и в DBGrid, она у Вас окажется в конце;

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

Факт. Если Вам для себя или клиента нужно отобразить вставку как вставку, то есть, показать, что вставка произошла в текущей позиции, то создайте вторую колонку Sort, и отправляйте инструкцию select*from tableneame order bySort. Подробно об этом я писал здесь.


 

Как добавить запись в конец (APPEND)

 Подробно о добавлении записей я писал здесь.  Но если вкратце, нужен “цикл”. На примере множества simpledataset…


Как отредактировать запись?


Как удалить запись?


Как сохранить изменения в физическую БД?

Если у Вас открыт один из методов


Как обновить множество и данные в DBGrid?

Если компоненты соединены друг с другом и множество уже отображается в DBGrid, то очень просто


Как перевести курсор СУБД на следующую запись?


Как перевести курсор СУБД на предыдущую запись?


Как отменить последнее изменение?


Как программно перейти к конкретной записи? Перевести курсор?

На одном из сайтов нашёл классную информацию по методу locate…

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

Locate(const KeyFields: string; const KeyValues: Variant; Options:

TLocateOptions): Boolean;

Первый параметр это список полей разделяемых “точкой с запятой” либо одно поле. Второй параметр это значения, которым должны быть равны поля указанные в первом параметре если полей много то во втором параметре должен быть массив из Variant. Если указано несколько полей то переход осуществляется, только если каждое поле, указанное в первом параметре равно значению, указанному во втором параметре. Если переход прошёл успешно, то функция возвращает True. Для того чтобы получить массив из Variant можно использовать функцию VarArrayOf. Вот примеры использования метода Locate:

……
If not ClientDataSet1.Locate(‘LastName’,Edit1.text,[]) then
MessageDlg(‘ ” ‘+Edit1.text+’ ” не найдено’, mtError, [mbOK], 0);
…..

…..
ClientDataSet1.Locate(‘LastName;FirstName’, VarArrayOf( [‘Иванов’, ‘Иван’] ), []);
….

Если нужно перейти к записи, зная лишь часть строкового поля можно использовать опцию loPartialKey в третьем параметре.

ClientDataSet1.Locate(‘Address’,’Mosk’,[loPartialKey]); Часть значения не может быть где-то посередине поля она может составлять лишь несколько символов сначала.


Исходники примера статьи

Кому пригодится – 52 DBEXPRESS Insert_Copy. Там есть лишнее, это так сказать черновики. Но есть и кое-что полезное, чтобы разобраться в теме. Чтобы программа работала нужен установленный mysql с пользователем root и паролем masterkey.

В остальном – дополнительных требований нет.

Удачи в обучении программированию.

This entry was posted in DBExpress, Delphi, Без рубрики. Bookmark the permalink.