Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для GR3YVAC
2 / 2 / 3
Регистрация: 28.03.2016
Сообщений: 45

Подтверждение изменений в базе

28.07.2016, 10:46. Показов 2316. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, Уважаемая администрация и пользователи форума!

Помогите разобраться в такой ситуации:
Есть Form1 - на ней лежит Edit1 и 2 BitBtn ("Add" и "Show").
При нажатии на кнопку "Add" - добавляем в БД данные введенные в Edit1.
Код кнопки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
//соединение с бд
DataModule1->IBDatabase1->Connected = false;
DataModule1->IBDatabase1->Connected = true;
DataModule1->IBDataSet1->Close();
DataModule1->IBDataSet1->Open();
 
//ставим новую запись в конец 
if (DataModule1->IBDataSet1->RecordCount>0)
    {
        DataModule1->IBDataSet1->First();
    }
 
//добавляем данные из Edit1 в столбец P_NAME
DataModule1->IBDataSet1->Insert();
DataModule1->IBDataSet1->FieldByName("P_NAME")->AsString = Edit1->Text;
DataModule1->IBDataSet1->Post();
 
//после добавления очищаем Edit1
Edit1->Text=" ";
 
}
После добавления введенного текста в БД, нажимаем кнопку "Show", открывается Form2 с компонентом DBGrig, в которой отображаются данные введенные в БД.
При двойном клике мыши по строчке в DBGrid - открывается Form3, на которой находится DBEdit и кнопка "Save".
В DBEdit уже находится текст из строки в DBgrid по которой нажали двойным щелчком.

Соединение с БД установлено так: IBDataBase/IBTransaction/DataSource/IBDataSet

Вопрос:
Какой код необходимо написать в обработчике событий кнопки "Save", чтобы при изменении текста в DBEdit перезаписывалось значение в БД.
Спасибо, за ранее благодарен!
с Уважением, gr3yvac
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2016, 10:46
Ответы с готовыми решениями:

Выдавать подтверждение на сохранение изменений только при их наличии
На кнопке закрытия: Private Sub Закрыть_Click() If MsgBox(Сохранить изменения?", vbYesNo) = vbNo Then Me.Undo ...

Запросить у пользователя подтверждение при записи изменений в открытый файл
Я создал примитивный текстовой редактор! И стоит задача: запросить у пользователя подтверждение при записи изменений в открытый файл. Как...

История изменений в базе данных
Всем привет. Разработал отчёт по подключению услуги Интернета. И есть такой момент... "Старый тарифный план" Суть в том, что...

8
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.07.2016, 10:54
Думаю что в этой теме найдете ответ на вопрос
Добавление информации в базу данных через ADOQuery вводимый через Edit
1
 Аватар для GR3YVAC
2 / 2 / 3
Регистрация: 28.03.2016
Сообщений: 45
28.07.2016, 12:26  [ТС]
Почтальон, Спасибо, но я читал эту тему. Не нашел ответа на мой вопрос.

Добавлено через 6 минут
При изменении содержимого в DBEdit - значение сразу же изменяется в DBGrid... Но при закрытии и открытии формы с DBGrid - изменения не остаются.

Простите, я новенький в этом деле, но мне кажется, данные просто изменяются в приложении и никак не отправляются в базу для перезаписи.
Пробовал Post() - аналогичная ситуация.

Добавлено через 1 час 21 минуту
Может еще подскажете, какую литературу почитать для данного направления - Работа с Interbase и с++ builder?
Взялся за книгу: Interbase и C++ bulder на примерах, но столкнулся с трудностями по SQL запросам. Можете посоветовать хорошую(где все доступным языком написано) книгу по SQL?
Спасибо.
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
28.07.2016, 12:31
Цитата Сообщение от GR3YVAC Посмотреть сообщение
При двойном клике мыши по строчке в DBGrid - открывается Form3, на которой находится DBEdit и кнопка "Save".
Код вызова формы 3??
1
 Аватар для GR3YVAC
2 / 2 / 3
Регистрация: 28.03.2016
Сообщений: 45
28.07.2016, 17:11  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
Сообщение от GR3YVAC
При двойном клике мыши по строчке в DBGrid - открывается Form3, на которой находится DBEdit и кнопка "Save".
Код вызова формы 3??
C++
1
2
3
4
void __fastcall TForm2::DBGrid1DblClick(TObject *Sender)
{
Form3->Show();
}
DBEdit настроен на тот же DataSource, что и DBGrid.

Добавлено через 5 минут
У Архангельского написано: ...изменения в таком случае сохраняются свойством "Modified".
Написал - DBEdit->Modified. Никаких изменений.

Добавлено через 1 час 52 минуты
Переделал, убрав DBEdit с Form3.
Поставил просто Edit.

C++
1
2
3
4
5
6
7
8
9
10
//---------------------------------------------------------------------------
void __fastcall TForm3::FormShow(TObject *Sender)
{
 
//Загружаем данные из DBGrid в Edit1
 
Edit1->Text = DataModule1->IBDataSet1->FieldByName("P_NAME")->AsString;
 
}
//---------------------------------------------------------------------------
Код кнопки "Save":
C++
1
2
3
4
5
6
7
8
9
10
11
12
//---------------------------------------------------------------------------
void __fastcall TForm3::BitBtn1Click(TObject *Sender)
{
 
DataModule1->IBDataSet1->Edit();
 
DataModule1->IBDataSet1->FieldByName("P_NAME")->AsString = Edit1->Text;
DataModule1->IBDataSet1->Post();
 
Form3->Close();
}
//---------------------------------------------------------------------------
Итог тот же, что и при DBEdit добавляет изменения в DBGrid, но при закрытии/открытии формы с DBGrid`om не оставляет изменения.

Как быть?

Добавлено через 1 час 53 минуты
Для проверки поставил на Form3 DBNavigator, через него так же не изменяются данные.
Я правильно понимаю? - Не срабатывает метод Post()?
т.к. данные изменяются в DBGrid, пока я не сделаю
C++
1
IBDataSet->Active = false /true
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
Код кнопки "Save":
 
//---------------------------------------------------------------------------
void __fastcall TForm3::BitBtn1Click(TObject *Sender)
{
 
DataModule1->IBDataSet1->Edit(); // Если здесь поставить Insert() - то собственно Post() работает, т.к. идет добавление новой записи.
 
DataModule1->IBDataSet1->FieldByName("P_NAME")->AsString = Edit1->Text;
DataModule1->IBDataSet1->Post();
 
Form3->Close();
}
//---------------------------------------------------------------------------

Добавлено через 42 минуты
Тема актуальна.
Надеюсь кто-нибудь откликнется на помощь...
Спасибо.
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
29.07.2016, 04:19
Лучший ответ Сообщение было отмечено GR3YVAC как решение

Решение

Цитата Сообщение от GR3YVAC Посмотреть сообщение
т.к. данные изменяются в DBGrid, пока я не сделаю
Ты наверное сравниваешь с таблицей в БД, да?
Транзакция, что такое в курсе?
Когда ты открываешь IBDataSet у тебя стартует транзакция и пока ты его не закрыл все твои изменения "не видны" в БД.
Закрыл IBDataSet, транзакция зафиксировалась (Commit) и все твои изменения будут "видны" в БД.

Добавлено через 3 минуты
Можно и все ручками делать. Пример (самый первый, который попался) из хелпа (очень нужная, понимаешь, вещь )
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.ApplyButtonClick(Sender: TObject);
 
begin
  IBDatabase1.Open;
  IBTransaction1.StartTransaction;
  Table1.Insert;
  Table1.FieldByName('QUANTITY').AsInteger := StrToInt(Edit1.Text);
  Table1.Post;
  IBTransaction1.Commit;
end;
2
 Аватар для GR3YVAC
2 / 2 / 3
Регистрация: 28.03.2016
Сообщений: 45
29.07.2016, 15:57  [ТС]
Bit_Man, да, с таблицей сравнивал. Транзакция? - читал)) Получается, при каждом обращении к БД ( добавлении/изменении/удалении) необходимо открывать dataset и закрывать?
Спасибо за ответ! Попробую!
Ушел )) отпишу))

Добавлено через 3 часа 25 минут
Bit_Man, Я так и делал как у тебя в примере при Insert() все работает, все добавляет.
А как сделать редактирование?
- Есть 2 Edit`a - которые получают поля из бд "P_NAME" и "P_SURNAME" соответственно. Я хочу изменить к примеру только фамилию и потом нажать кнопку "Save".

Изменил код по аналогии с Insert(), только поставил Edit();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//---------------------------------------------------------------------------
void __fastcall TForm3::BitBtn1Click(TObject *Sender)
{
 
DataModule1->IBDataSet1->Open();
 
// Если поставить здесь: DataModule1->IBTransaction1->StartTransaction();
 
DataModule1->IBDataSet1->Edit();
DataModule1->IBDataSet1->FieldByName("P_NAME")->AsString = Edit1->Text;
DataModule1->IBDataSet1->Post();
 
// А здесь: DataModule1->IBTransaction1->Commit();
 
Form3->Close();
}
//---------------------------------------------------------------------------
1. Код без комментариев - работает так же как и раньше(в программе меняются данные, но в базу не заносятся).
2. Код с комментариями - тот же результат, только транзаксия и ibdataset становиться active = false и данные в DBGrid пропадают;
Поставил после Form3->Close() - IBDataSet->Active = true; Данные появились, но изменения опять же не остались

Добавлено через 5 часов 26 минут
Сделал! Выход - добавил 2 транзакции.

код кнопки "Add":
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
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
DM->IBDatabase1->Connected = false;
DM->IBDatabase1->Connected = true;
DM->IBDataSet1->Close();
 
DM->IBDataSet1->Transaction = DM->Write_Transaction;
 
DM->IBDataSet1->Transaction = DM->Write_Transaction;
if (!(DM->Write_Transaction->InTransaction))
{
    DM->Write_Transaction->StartTransaction();
}
DM->IBDataSet1->Open();
DM->IBDataSet1->Insert();
DM->IBDataSet1->FieldByName("P_NAME")->AsString = Edit1->Text;
DM->IBDataSet1->FieldByName("P_SURNAME")->AsString = Edit2->Text;
DM->IBDataSet1->Post();
DM->IBDataSet1->Transaction->Commit();
 
DM->IBDataSet1->Close();
DM->IBDataSet1->Transaction = DM->Read_Transaction;
DM->IBDataSet1->Open();
 
}
Теперь при редактировании на кнопке "Save" все данные передаются и записываются в базу, только есть одно НО! Измененные данные не перезаписываются в той же строчки, а добавляется новая запись в измененном виде.

Код кнопки "Save":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DM->IBDataSet1->Close();
 
DM->Write_Transaction->StartTransaction();
 
DM->IBDataSet1->Open();
DM->IBDataSet1->Edit();
DM->IBDataSet1->FieldByName("P_NAME")->AsString = Edit1->Text;
DM->IBDataSet1->FieldByName("P_SURNAME")->AsString = Edit2->Text;
DM->IBDataSet1->Post();
DM->Write_Transaction->Commit();
 
DM->IBDataSet1->Close();
DM->IBDataSet1->Open();
}
В этом месте надо что-то поменять? -
C++
1
DM->IBDataSet1->Edit();
, чтобы текущая запись просто перезаписалась?
Спасибо.
0
 Аватар для GR3YVAC
2 / 2 / 3
Регистрация: 28.03.2016
Сообщений: 45
29.07.2016, 16:14  [ТС]
Помогите, пожалуйста.
Вот выкладываю проект:
Мне просто осуществить условие, которое написано в топике. Спасибо!
База в архиве с проектом.
с Уважением, gr3yvac
Вложения
Тип файла: rar test.rar (8.31 Мб, 1 просмотров)
0
 Аватар для GR3YVAC
2 / 2 / 3
Регистрация: 28.03.2016
Сообщений: 45
31.07.2016, 13:21  [ТС]
Я не знаю, что это за мистика)))
Но после добавления кнопки "Удалить" с кодом:
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm4::BitBtn2Click(TObject *Sender)
{
 
DM->IBDataSet1->Delete();
 
DM->IBDataSet1->Close();
DM->IBDataSet1->Open();
 
}
У меня появилась возможность редактирования записей)))
Кнопка "Save":
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm4::BitBtn1Click(TObject *Sender)
{
 
DM->IBDataSet1->Open();
 
DM->IBDataSet1->Edit();
DM->IBDataSet1->FieldByName("P_NAME")->AsString = Edit1->Text;
DM->IBDataSet1->FieldByName("P_SURNAME")->AsString = Edit2->Text;
DM->IBDataSet1->Post();
DM->IBDataSet1->Close();
DM->IBDataSet1->Open();
Спасибо большое Bit_Man за оказанную помощь! Можно считать его ответ Лучшим.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.07.2016, 13:21
Помогаю со студенческими работами здесь

Откат изменений в базе данных
Возможно ли откатить изменения (delete и update) в БД ? На какой период ?

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

Отслеживание изменений в базе Access
Необходимо отслеживать все изменения в базе Access: добавление,изменение,удаление записей; изменение структур таблиц; изменение...

Сохранение изменений в Базе Данных
Всем доброго времени суток! Есть проблема, не могу сохранить изменения в базе данных. На форме есть datagridview, по нажатию кнопки выходит...

Контроль изменений записей в базе данных
Добрый день. Тема не столько по программированию, сколько по логике организации базы данных. Есть база данных, которой, естественно,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru