Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
-3 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 13

Удалить выбранную строку в DBGrid из БД

28.04.2016, 00:44. Показов 9118. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла необходимость удалить выбранную строку в DBGrid из БД. Соединение к бд через ADOQuery. Методы Query1.Delete;, DBGrid1.SelectedRows.Delete;, DBGrid1.DataSource.DataSet.Delete; - не работают, выдают ошибку:
При Query1.Delete : Project Project1.exe raised exception class EOleException with message "Недостаточно сведения о ключевом столбце для обновления". Process stopped. Use step or Run to continue.
При DBGrid1.SelectedRows.Delete : вообще ничего не пишет и ничего не происходит
При DBGrid1.DataSource.DataSet.Delete тоже самое, что и при Query1.Delete
Подскажите, как удалять эти грёбаные строки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2016, 00:44
Ответы с готовыми решениями:

Удалить выбранную строку
Доброго времени суток, уважаемые форумчане! Подскажите, как решить проблему: Есть БД, из которой по запросу заполняется dataGridView, вот...

Удалить выбранную строку в datagridview из бд
в datagridview выведена таблица из базы данных с помощью bindingsource. Как сделать удаление через кнопку выделенной строки в...

Удалить выбранную в DGV строку из БД
Помогите пожалуйста как задать условие чтобы удалилась строка которую я выбираю, то-есть выделенная строка. Private Sub...

19
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,611
28.04.2016, 01:27
Цитата Сообщение от Geakkas Посмотреть сообщение
Возникла необходимость удалить выбранную строку в DBGrid
Чёрт тебя попутал. Или твоя неграмотность.
Невозможно удалить строку в DBGrid. Их там просто нет!
0
-3 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 13
28.04.2016, 01:39  [ТС]
Никто никого не путал)
Я в том смысле, что в DBGrid выбираем строку, которую нужно удалить, после чего нажимаем на кнопочку и вуаля, данная запись удаляется из базы данных, в этом смысле)
0
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
28.04.2016, 04:12
Цитата Сообщение от Geakkas Посмотреть сообщение
данная запись удаляется из базы данных, в этом смысле)
В этом смысле удаление из базы данных осуществляется при помощи SQL запросов DELETE.
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
28.04.2016, 04:25
Вам система выдала сообщение: "Недостаточно сведения о ключевом столбце для обновления" вот и решайте эту проблему. Ключевое поле для таблицы не задано, а если его нет, то и запрос на удаление может привести к непредсказуемым результатам.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
28.04.2016, 10:04
Цитата Сообщение от Geakkas Посмотреть сообщение
Недостаточно сведения о ключевом столбце для обновления
Скорее всего, когда делал выборку данных, не выбрал PK (Primary Key). А с его помощью можно однозначно идентифицировать, какую строку удалять.
0
-3 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 13
28.04.2016, 11:05  [ТС]
Цитата Сообщение от ZfoxAK Посмотреть сообщение
В этом смысле удаление из базы данных осуществляется при помощи SQL запросов DELETE.
Не подскажете ли, как правильно написать такой SQL запрос? Чтобы удалилась ровно 1 выбранная в DBGrid'e запись

Добавлено через 2 минуты
Цитата Сообщение от Пытливый Посмотреть сообщение
Вам система выдала сообщение: "Недостаточно сведения о ключевом столбце для обновления" вот и решайте эту проблему. Ключевое поле для таблицы не задано, а если его нет, то и запрос на удаление может привести к непредсказуемым результатам.
Та это я знаю, я и спрашиваю, как это исправить. Дело в том, что есть простые таблицы или же SQL запросы одной таблицы, тогда всё спокойно удаляется, а вот когда происходит связь нескольких таблиц, и неважно, все поля там или не все, через ADOTable или через ADOQuery, везде пишется эта ошибка, т.е. не может удалить запись, в которой имеется подстановка из другой таблицы

Добавлено через 4 минуты
Цитата Сообщение от Grossmeister Посмотреть сообщение
Скорее всего, когда делал выборку данных, не выбрал PK (Primary Key). А с его помощью можно однозначно идентифицировать, какую строку удалять.
Ключевое поле той таблицы, откуда надо удалять эту запись, точно имеется
Вот просто там в одной таблице содержится несколько таблиц, к примеру, как в Access'e сделать запрос, в котором содержатся несколько таблиц одновременно (INNER JOIN, все дела). Однако в этом запросе данные спокойно удаляются, а вот в Delphi так спокойно ничего не получается)
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
28.04.2016, 11:47
Цитата Сообщение от Geakkas
Вот просто там в одной таблице содержится несколько таблиц
Видимо в выборке несколько таблиц, а не в "одной таблице".

Цитата Сообщение от Geakkas
к примеру, как в Access'e сделать запрос, в котором содержатся несколько таблиц одновременно (INNER JOIN, все дела). Однако в этом запросе данные спокойно удаляются, а вот в Delphi так спокойно ничего не получается)
Вот это я не понял. Приведи запрос, которым ты выбираешь данные и запрос на удаление (или хотя бы назови таблицу, из которой нужно удалить).

Добавлено через 6 минут
Кстати, здесь была похожая тема
Удаление из базы данных
0
5972 / 4548 / 1094
Регистрация: 29.08.2013
Сообщений: 28,167
Записей в блоге: 3
28.04.2016, 11:58
своим мегазапросом не удаляй данные, просто получи ID нужных строк
и далее уже удаляй

что типа
SQL
1
DELETE FROM T WHERE id IN (SELECT * JOIN JOIN JOIN JOIN)
0
-3 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 13
28.04.2016, 12:22  [ТС]
Цитата Сообщение от Grossmeister Посмотреть сообщение
Видимо в выборке несколько таблиц, а не в "одной таблице".
Криво пишу, прошу прощения, в запросе имеются сразу несколько таблиц, связанные между собой. Всё это отображается в DBGrid. Когда отображал в DBGrid данные только одной таблицы, то всё нормально удалялось, но стоило добавить хотя бы 1 поле из другой таблицы, неважно какое, то сразу же выдаёт эту ошибку

Цитата Сообщение от Grossmeister Посмотреть сообщение
Вот это я не понял. Приведи запрос, которым ты выбираешь данные и запрос на удаление (или хотя бы назови таблицу, из которой нужно удалить).
Ну, к примеру, подобное: " SELECT Сотрудники.[Код сотрудника], Сотрудники.[Фамилия сотрудника], Сотрудники.[Имя сотрудника], Сотрудники.[Отчество сотрудника], Сотрудники.Телефон, Должность.[Наименование должности], Должность.[Заработная плата]
FROM Должность INNER JOIN Сотрудники ON Должность.[Код должности] = Сотрудники.[Код должности];"
Пробовал вместо "Должность.[Наименование должности]" оставить "Сотрудники.[Код должности]", тоже самое - выдаёт ошибку
0
5972 / 4548 / 1094
Регистрация: 29.08.2013
Сообщений: 28,167
Записей в блоге: 3
28.04.2016, 12:27
Цитата Сообщение от Geakkas Посмотреть сообщение
выдаёт ошибку
кто выдает
какую ошибку
когда
???
0
-3 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 13
28.04.2016, 12:35  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
кто выдает
какую ошибку
когда
???
Delphi! Выдаёт! Ошибку! Которую! Я! Написал! В! Начале! Вопроса!!!
p.s. "Project Project1.exe raised exception class EOleException with message "Недостаточно сведения о ключевом столбце для обновления". Process stopped. Use step or Run to continue."
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
28.04.2016, 12:54
Цитата Сообщение от Geakkas Посмотреть сообщение
к примеру, подобное
ОК. Значит у тебя там данные 2-х таблиц. Когда ты выдаешь команду Delete, то Delphi должен создать запрос на удаление. Какую строку он должен удалить? Из таблицы Сотрудники? Из таблицы Должности? Из обеих?
0
5972 / 4548 / 1094
Регистрация: 29.08.2013
Сообщений: 28,167
Записей в блоге: 3
28.04.2016, 12:59
Цитата Сообщение от Geakkas Посмотреть сообщение
Delphi! Выдаёт! Ошибку! Которую! Я! Написал! В! Начале! Вопроса!!!
если не умеете так как делаете, то делайте так как я написал

SQL
1
DELETE FROM T WHERE id IN (SELECT * JOIN JOIN JOIN JOIN)
0
-3 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 13
28.04.2016, 13:36  [ТС]
Цитата Сообщение от Grossmeister Посмотреть сообщение
ОК. Значит у тебя там данные 2-х таблиц. Когда ты выдаешь команду Delete, то Delphi должен создать запрос на удаление. Какую строку он должен удалить? Из таблицы Сотрудники? Из таблицы Должности? Из обеих?
Из таблицы Сотрудники, т.е. удаляем самого сотрудника, а должности по-прежнему остаются, их вообще не трогаем

Добавлено через 1 минуту
Цитата Сообщение от qwertehok Посмотреть сообщение
если не умеете так как делаете, то делайте так как я написал
Я пытался сделать по-другому, снова безрезультатно, сейчас попробую сделать так, как вы сказали)

Добавлено через 10 минут
Цитата Сообщение от qwertehok Посмотреть сообщение
DELETE FROM T WHERE id IN (SELECT * JOIN JOIN JOIN JOIN)
Не совсем понял, как правильно записать SQL запрос. Если на примере предыдущего запроса, то как-то так должен выглядеть этот SQL запрос?
DELETE FROM Сотрудники WHERE [Код сотрудника] IN (SELECT * FROM Должность INNER JOIN Сотрудники ON Должность.[Код должности] = Сотрудники.[Код должности]);
0
5972 / 4548 / 1094
Регистрация: 29.08.2013
Сообщений: 28,167
Записей в блоге: 3
28.04.2016, 13:54
SQL
1
DELETE FROM Сотрудники WHERE [Код сотрудника] IN (SELECT * FROM Должность INNER JOIN Сотрудники ON Должность.[Код должности] = Сотрудники.[Код должности]);
вместо * в запросе SELECT нужно указать ключевое поле
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
28.04.2016, 14:43
Цитата Сообщение от Geakkas Посмотреть сообщение
Из таблицы Сотрудники, т.е. удаляем самого сотрудника
Если выбираемый Сотрудники.[Код сотрудника] - это PK, то все просто
SQL
1
2
3
DELETE
FROM Сотрудники
WHERE [Код сотрудника] = <Здесь [Код сотрудника] выбранной строки>
0
-3 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 13
28.04.2016, 16:22  [ТС]
Спасибо за ответы, постараюсь что-нибудь другое придумать потом, ну или это получше понять, на "свежую голову"
0
5972 / 4548 / 1094
Регистрация: 29.08.2013
Сообщений: 28,167
Записей в блоге: 3
28.04.2016, 16:34
покажи код, не запроса, а весь обработчик
0
-3 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 13
10.05.2016, 01:39  [ТС]
Прошу прощения, не ответил на ваши сообщения, да и давно сюда не заходил, были дела, да и работы полно)
Тогда не долго мучился с этим и сделал, но времени зайти сюда не было
Пишу, как сделал для тех, кому может понадобиться это - делал через параметр, всё тоже самое, что и писали люди, только в конце =: par
Пример:
Delphi
1
2
3
4
5
par:=StrToInt(Edit1.Text);
DM.SQLDel.SQL.Clear;
DM.SQLDel.SQL.Add('DELETE FROM Сотрудники WHERE [Код сотрудника]=:par');
DM.SQLDel.Parameters[0].Value:=par;
DM.SQLDel.ExecSQL;
Ещё раз прошу прощения за долгий ответ)
И спасибо всем, кто помогал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2016, 01:39
Помогаю со студенческими работами здесь

Удалить выбранную строку в StringGrid
здравствуйте, подскажите пожалуйста как удалить выбранную строку в StringGrid. вот мой код: procedure TForm3.Button3Click(Sender:...

Удалить выбранную строку из ListBox
Здравствуйте,как удалить из строки,к которой привязаны данные ? имею &lt;ListBox Name=&quot;PListBox&quot; Grid.Row=&quot;1&quot;...

Как удалить выбранную строку из БД?
таблица называется автомобили - (код(ключ),марка,модель,год, пробег, цена) как удалить выбранную строку в datagridview из базы данных...

Как удалить выбранную строку из ListBox?
Есть ListBox со строками содержащие пути файлов (в принципе не важно): можно как-то удалить выделенную строку по клавише Del или...

Как удалить выбранную строку из datagridview и бд
Помогите разобраться с кодом private void buttondelete_Click(object sender, EventArgs e) { if...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru