Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/103: Рейтинг темы: голосов - 103, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 3
Builder 6

Обновление записи в таблице

26.09.2018, 17:57. Показов 20527. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пишу курсовую в универе, приходится пользоваться билдером
Задание сделать базу данных, редактирование, добавление записей, поиск, сортировка
Работает все, за исключением редактирования
Расположено все на двух формах, редактирование и добавление записи происходит со второй формы в таблицы (DBGrid), расположенные на первой.
Проблема первая:
Не обновляются данные!
Хотя, я практически уверена в правильности запроса
Проблема вторая:
Запись добавляется, но после перезапуска, возможно есть работающие примеры с обновлением данных сразу же после добавления?
Пробовала ADOQuery->Refresh(), добавлять sql запрос на выборку всех данных из бд

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if (Form2->ShowModal()== mrOk){
         ADOQuery1->Close();
         ADOQuery1->SQL->Clear();
         ADOQuery1->SQL->Add("UPDATE Students SET Nm = :p1, Ln = :p2, Ln2 = :p3, Gr = :p4, Adr = :p5, Tel = :p6 WHERE Id = :p7");
         ADOQuery1->Parameters->ParamByName("p1")->Value = Form2->Edit1->Text;
         ADOQuery1->Parameters->ParamByName("p2")->Value = Form2->Edit2->Text;
         ADOQuery1->Parameters->ParamByName("p3")->Value = Form2->Edit3->Text;
         ADOQuery1->Parameters->ParamByName("p4")->Value = StrToInt(Form2->Edit6->Text);
         ADOQuery1->Parameters->ParamByName("p5")->Value = Form2->Edit4->Text;
         ADOQuery1->Parameters->ParamByName("p6")->Value = StrToInt(Form2->Edit5->Text);
         ADOQuery1->Parameters->ParamByName("p7")->Value = StrToInt(Form1->ADOQuery1->FieldByName("Id")->AsInteger);
         ADOQuery1->ExecSQL();
         ADOQuery2->Close();
         ADOQuery2->SQL->Clear();
         ADOQuery2->SQL->Add("UPDATE Uspevaemost SET Lastn = :s1, pred1 = :s2, pred2 = :s3, pred3 = :s4, pred4 = :s5, pred5 = :s6, pred6 = :s7, pred7 = :s8 WHERE ID = :s9");
         ADOQuery2->Parameters->ParamByName("s1")->Value = Form2->Edit2->Text;
         ADOQuery2->Parameters->ParamByName("s2")->Value = StrToInt(Form2->Edit7->Text);
         ADOQuery2->Parameters->ParamByName("s3")->Value = StrToInt(Form2->Edit8->Text);
         ADOQuery2->Parameters->ParamByName("s4")->Value = StrToInt(Form2->Edit9->Text);
         ADOQuery2->Parameters->ParamByName("s5")->Value = StrToInt(Form2->Edit10->Text);
         ADOQuery2->Parameters->ParamByName("s6")->Value = StrToInt(Form2->Edit11->Text);
         ADOQuery2->Parameters->ParamByName("s7")->Value = StrToInt(Form2->Edit12->Text);
         ADOQuery2->Parameters->ParamByName("s8")->Value = StrToInt(Form2->Edit13->Text);
         ADOQuery2->Parameters->ParamByName("s9")->Value = StrToInt(Form1->ADOQuery2->Fields->FieldByName("ID")->AsInteger);
         ADOQuery2->ExecSQL();
 
         }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.09.2018, 17:57
Ответы с готовыми решениями:

Обновление столбца в таблице
Ещё такой вопросик, есть 3 таблицы... в них есть связующие поля по которым они связаны :ONE.ID_PERSON, TWO.ID_PERSON1, THREE.ID_PERSON2... ...

Изменить записи в таблице
Возникли затруднения с написанием кода для кнопки изменить (PopupMenu) При нажатии на кнопку проекты высвечивается таблица, кликая...

Обновление записи в БД Access
Здравствуйте, помогите с обновление записи в БД. есть главная форма,на ней DbGrid, выбираю строчку и перехожу на другую форму,где в edit...

5
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
26.09.2018, 18:50
Цитата Сообщение от Skodelario Посмотреть сообщение
редактирование и добавление записи происходит со второй формы в таблицы (DBGrid), расположенные на первой.
Вот это уже не верная формулировка! И от незнания теории - косяк в практике! Добавление и редактирование происходят в каком-то наборе данных (НД). А этот самый НД только отображается в DBGrid. Поэтому после внесения любых изменений в НД, Ваш DBGrid необходимо актуализировать...
Вот сами подумайте...
1. При старте программы Вы сделали запрос, чтобы в Вашем DBGrid отобразились какие-то данные из таблицы БД.
2. Запрос выполнился и данные отобразились в Вашем DBGrid
3. Вы выполнили запрос для добавления/изменения данных в НД
4. Запрос выполнился, данные успешно внесены/изменены в таблице БД
5. НО! В DBGrid ничего не изменилось, т.к. он отображает только те данные, которые в него были переданы при старте программы
6. Снова выполняем запрос на выбор всех данных, которые должны отображаться в DBGrid
7. Voila - мы видим то, что добавили/изменили..
1
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 3
26.09.2018, 22:35  [ТС]
Спасибо!
Это я исправила (вроде как)
По-крайней мере, при добавлении новой записи DBGrid показывает ее сразу
Но проблема с обновлением не исчезла
Теперь он ругается на
C++
1
 ADOQuery1->Parameters->ParamByName("p7")->Value = Form1->ADOQuery1->FieldByName("Id")->AsInteger;
И идентичную строку для ADOQuery2
Пишет, что не может найти поле Id, хотя оно есть и написано правильно
Проблема может быть в том, что это ключевое поле в access?
Когда поменяла на
C++
1
ADOQuery1->Parameters->ParamByName("p7")->Value = Form1->ADOQuery1->Fields->FieldByNumber(0);
Ругаться перестал, но обновления данных не происходит
После каждого добавления/редактирования данных дописала
C++
1
2
3
 ADOQuery2->SQL->Clear();
         ADOQuery2->SQL->Add("SELECT * FROM [Uspevaemost]");
         ADOQuery2->Open();
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
27.09.2018, 04:29
Лучший ответ Сообщение было отмечено Skodelario как решение

Решение

маленькое замечание, не особо относящееся к вопросу, но на будущее: у Вас запрос умещается в одну строку (описание параметров не учитываем). Так зачем же использовать 2 строки кода,
C++
1
2
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("UPDATE Students SET Nm = :p1, Ln = :p2, Ln2 = :p3, Gr = :p4, Adr = :p5, Tel = :p6 WHERE Id = :p7");
когда одной достаточно...
C++
1
ADOQuery1->SQL->Text = "UPDATE Students SET Nm = :p1, Ln = :p2, Ln2 = :p3, Gr = :p4, Adr = :p5, Tel = :p6 WHERE Id = :p7";
Теперь по теме: вот в этой строке:
C++
1
ADOQuery1->Parameters->ParamByName("p7")->Value = Form1->ADOQuery1->FieldByName("Id")->AsInteger;
ADOQuery1 и Form1->ADOQuery1 это разные вещи? Если разные, то
1. Дайте Вы им разные имена: сами же через неделю в своем коде запутаетесь...
2. Вы проверяли, запрос Form1->ADOQuery1 выполнен? И там есть только одна запись, из которой будем брать значение поля ID?
3. А как выглядит текст запроса в Form1->ADOQuery1? Поле ID в него вообще включается?
4. Попробуйте разделить этот шаг присвоения параметра на 2 этапа:
Сначала:
C++
1
2
3
4
Form1->ADOQuery1->Open();
int MyID = Form1->ADOQuery1->FieldByName("Id")->AsInteger;
ShowMessage(MyID); //Для самопроверки, что значение поля ID действительно получено, потом, естественно, убрать
...
Потом:
C++
1
2
...
ADOQuery1->Parameters->ParamByName("p7")->AsInteger = MyID;
1
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 3
27.09.2018, 19:29  [ТС]
Ура! Обновление заработало.
Не особо поняла, что конкретно ему не нравилось до этого, но теперь все работает, спасибо!
(Если вдруг нужно будет кому-то, то вот работающий вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
if (Form2->ShowModal()== mrOk){
         int MyID = ADOQuery1->FieldByName("Id")->AsInteger;
         int HerID = ADOQuery2->FieldByName("ID")->AsInteger;
         ADOQuery1->Close();
         ADOQuery1->SQL->Clear();
         ADOQuery1->SQL->Add("UPDATE Students SET Nm = :p1, Ln = :p2, Ln2 = :p3, Gr = :p4, Adr = :p5, Tel = :p6 WHERE Id = :p7");
         ADOQuery1->Parameters->ParamByName("p1")->Value = Form2->Edit1->Text;
         ADOQuery1->Parameters->ParamByName("p2")->Value = Form2->Edit2->Text;
         ADOQuery1->Parameters->ParamByName("p3")->Value = Form2->Edit3->Text;
         ADOQuery1->Parameters->ParamByName("p4")->Value = StrToInt(Form2->Edit6->Text);
         ADOQuery1->Parameters->ParamByName("p5")->Value = Form2->Edit4->Text;
         ADOQuery1->Parameters->ParamByName("p6")->Value = StrToInt(Form2->Edit5->Text);
         ADOQuery1->Parameters->ParamByName("p7")->Value = MyID;
         ADOQuery1->ExecSQL();
         ADOQuery1->Close();
         ADOQuery1->SQL->Clear();
         ADOQuery1->SQL->Add("SELECT * FROM [Students]");
         ADOQuery1->Open();
         ADOQuery2->Close();
         ADOQuery2->SQL->Clear();
         ADOQuery2->SQL->Add("UPDATE Uspevaemost SET Lastn = :s1, pred1 = :s2, pred2 = :s3, pred3 = :s4, pred4 = :s5, pred5 = :s6, pred6 = :s7, pred7 = :s8 WHERE ID = :s9");
         ADOQuery2->Parameters->ParamByName("s1")->Value = Form2->Edit2->Text;
         ADOQuery2->Parameters->ParamByName("s2")->Value = StrToInt(Form2->Edit7->Text);
         ADOQuery2->Parameters->ParamByName("s3")->Value = StrToInt(Form2->Edit8->Text);
         ADOQuery2->Parameters->ParamByName("s4")->Value = StrToInt(Form2->Edit9->Text);
         ADOQuery2->Parameters->ParamByName("s5")->Value = StrToInt(Form2->Edit10->Text);
         ADOQuery2->Parameters->ParamByName("s6")->Value = StrToInt(Form2->Edit11->Text);
         ADOQuery2->Parameters->ParamByName("s7")->Value = StrToInt(Form2->Edit12->Text);
         ADOQuery2->Parameters->ParamByName("s8")->Value = StrToInt(Form2->Edit13->Text);
         ADOQuery2->Parameters->ParamByName("s9")->Value = HerID;
         ADOQuery2->ExecSQL();
         ADOQuery2->Close();
         ADOQuery2->SQL->Clear();
         ADOQuery2->SQL->Add("SELECT * FROM [Uspevaemost]");
         ADOQuery2->Open();
0
0 / 0 / 0
Регистрация: 24.04.2021
Сообщений: 27
29.04.2021, 19:38
Цитата Сообщение от Skodelario Посмотреть сообщение
Ура! Обновление заработало.
Не особо поняла, что конкретно ему не нравилось до этого, но теперь все работает, спасибо!
(Если вдруг нужно будет кому-то, то вот работающий вариант
а мне до сих пор ничего не понятно
Но, хочу обновить через Button после поиска данные таблицы, точнее вернуть в исходное положение,
Например я нашла одну запись, к примеру удалила, хочу искать следующую запись, но в таблице ничего не отображается

ADOQuery->Refresh;

или

ADOQuery->Cancel

не помогает...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.04.2021, 19:38
Помогаю со студенческими работами здесь

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

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

При удалении одной строки в таблице удаляются все записи
Всем доброго времени суток. В процессе написания оболочки на С++ builder под базу Firebird возникла такая ситуация: в базе две таблицы -...

Обновление записи в таблице
Надо сделать:при нажатии на кнопку в приложении в таблице "Покупатели" в столбе "Имя" к каждому имени приписывалось слово...

Обновление записи в таблице
Доброго дня. Нужна небольшая помощь. Задача: выбирается 2 случайных числа(не равных), затем пользователю предоставляется выбор какое...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru