Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690

Как DataGridView синхронизировать с БД (dataGridView1 - Access)

24.09.2018, 21:49. Показов 5202. Ответов 3

Студворк — интернет-сервис помощи студентам
Проект находится в папке: c:\test\csharp\vs\prb\308\pr\rsh\GridAcc ess.sln
База данных находится в папке: c:\test\csharp\vs\prb\308\pr\rsh\db_Grid VAccess.accdb

dataGridView1 размещаю на форме;
dataGridView1. Меню "Выберите источник данных";
dataGridView1. Меню "Добавить источник данных проекта";
При подключении на вопрос "Копировать файл в проект и изменить подключение?" отвечаю "да" (см. скрин.)
Делаю кнопку "save".

C#
1
2
3
4
5
6
7
private void save_Click(object sender, EventArgs e)
{
    // Validate();
    treeEmailtblBindingSource.EndEdit();
    treeEmail_tblTableAdapter.Update(db_GridVAccessDataSet.TreeEmail_tbl);
    db_GridVAccessDataSet.AcceptChanges();
}
Описание проблемы.
Запускаю приложение.
Образуется две базы данных
..\rsh\rsh\db_GridVAccess.accdb
..\rsh\bin\Debug\db_GridVAccess.accdb
Отрывается окно с таблицей.
Вношу изменения.

Нажимаю "сохранить" ("save")
- Открываю базу данных (в Access)
..\rsh\bin\Debug\db_GridVAccess.accdb
изменения сохранились
- Открываю базу данных (в Access)
..\rsh\rsh\db_GridVAccess.accdb
изменения не сохранились

Закрываю приложение
- Открываю базу данных(в Access)
..\rsh\bin\Debug\db_GridVAccess.accdb
изменения сохранились
- Открываю базу данных
..\rsh\rsh\db_GridVAccess.accdb
изменения не сохранились

Запускаю приложение
Открывается таблица без изменений внесённых в предыдущем сеансе.

Вопросы
1. Как сделать чтобы изменения внесённые в "dataGridView1" сохранялись в БД?
2. Есть ли способы подключения "dataGridView1", чтобы автоматически формировалась синхронизация с базой данных, а не требовалось создавать отдельную кнопку?
3. Где можно изменить путь к файлу базы данных?
Я хотел бы сделать чтобы пользователь в окне прописал путь к базе данных и приложение работало с этой базой данных.
Миниатюры
Как DataGridView синхронизировать с БД (dataGridView1 - Access)   Как DataGridView синхронизировать с БД (dataGridView1 - Access)   Как DataGridView синхронизировать с БД (dataGridView1 - Access)  

Как DataGridView синхронизировать с БД (dataGridView1 - Access)  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2018, 21:49
Ответы с готовыми решениями:

Как синхронизировать две DataGridView?
Подскажите как сделать при вводе данных в одну таблицу, эти же данные отображались во второй таблице.

Как из Excel синхронизировать базу Access
Не могу найти, как програмно из EXCEL запустить синхронизацию БД ACCESS

Как занести данные с DataGridView в Access
Всем доброго дня! Вот как-то так у меня заполняется DataGridView данными void Get_Results () // метод для записи результатов в таблицу ...

3
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
26.09.2018, 06:46
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
2. Есть ли способы подключения "dataGridView1", чтобы автоматически формировалась синхронизация с базой данных, а не требовалось создавать отдельную кнопку?
Нет.

Я вам рекомендую не использовать мастеры Visual Studio, а делать всё вручную. Это сохранит за вами полный контроль за происходящим и сделает весь процесс работы с базой и контролом полностью прозрачным для вас.

У контрола DataGridView (как и у всех остальных контролов в WinForms) есть свойство DataSource, в которое можно передать объект коллекции разных типов (BindingSource, BindingList, DataTable, DataSet, IEnumerable, IList). Используя рефлексию, DGV вытащит данные и визуализирует их. Источник этих данных роли не играет (контролу всё равно откуда и как вы данные получили).

Так же, в зависимости от типа объекта переданного в DataSource, DGV может и редактировать (изменять, добавлять) строки.

Я вам предлагаю вытащить данные из базы вручную (OleDbConnection, OleDbCommand) в удобном для работы виде (DataTable или типизированную коллекцию) и запихать в DGV. Когда придёт время сохранять данные, вы просто пройдётесь по коллекции и записи с ненулевым ID обновите, а остальные добавите. Если данных очень много и предусмотрена возможность удаления, то удобнее будет использовать DataTable, так как там отслеживается состояние строк.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
26.09.2018, 09:48  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Я вам рекомендую не использовать мастеры Visual Studio, а делать всё вручную
Вы имеете в виду что-то в такое?

Кликните здесь для просмотра всего текста
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
DataTable dt;
BindingSource bs;
OleDbDataAdapter adapter;
 
private void button1_Click(object sender, EventArgs e)
        {
            string catBD = @"c:\test\csharp\vs\prb\308\pr\rsh\db_GridVAccess.accdb";
            string conBD = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", catBD);
 
            OleDbConnection connection = new OleDbConnection(conBD);
 
            connection.Open();
 
            string query1 = "SELECT * FROM TreeEmail_tbl"; 
            OleDbCommand cmd1 = new OleDbCommand(query1, connection);
 
            dt = new DataTable();
 
            adapter = new OleDbDataAdapter(cmd1);
            AccessCommandBuilder = new OleDbCommandBuilder(adapter);
 
            adapter.Fill(dt);
 
            dataGridView1.DataSource = dt;         
        }
 
        // сохранить 
        private void button2_Click(object sender, EventArgs e)
        {
            adapter.Update(dt);
        }


1. Если я правильно понял кнопка "button2" выполняет отправку нового "DataTable" в исходную таблицу базы данных.
Т.е. отправляет: изменение значений ячейки, удаление записи, добавление записи.

В выше при ведённом коде я не использую "BindingSource".
Вопрос 1: Как сделать обновление исходной таблицы базы данных если использовать "BindingSource"?
Я пытался разобраться, но что-то не работает.

2. С вопросом синхронизации типа: "dataGridView1"(1.изменили) -> БД.Таблица(2.обновили), более-менее понятно.
А как быть, если изменения происходят в БД.Таблица.
Т.е. схема: "dataGridView1"(2.обновили) <- БД.Таблица(1.изменили)
Например:
- БД.Таблица имеет большой размер
- изменения внесены не из приложения где находится "dataGridView1"(приложение_1), а из другого приложения(приложение_2).
или
- изменения внесены из приложения где находится "dataGridView1"(приложение_1) из другой формы(приложение_1).
Как в "dataGridView1" ("приложение_1") обновить только изменённые данные, а не выполнять заново подключение к БД.Таблица, что может занять некоторое время?

Вопросы:
2. Как в "dataGridView1" обновить данные только те, которые были изменены в БД.Таблица?
3. Какие дополнительные решение вы бы порекомендовали изучить по данному вопросу?
Подозреваю обновление данных в БД.Таблица должна отслеживать сама БД, а приложение должно эти данные забирать.
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
26.09.2018, 10:09
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
Вы имеете в виду что-то в такое?


Цитата Сообщение от Soft17 Посмотреть сообщение
Вопрос 1: Как сделать обновление исходной таблицы базы данных если использовать "BindingSource"?
Данный совершенно не обязательно использовать. Это удобная прослойка, но если вы без неё можете обойтись, то она вам и не нужна. По факту же, у BindingSource есть своё свойство DataSource.

СУБД не умеют извещать клиентов о изменении данных. И "хуков" тоже не навешать на базу. Вроде бы у Oracle есть какой-то такой механизм, но это не ваш случай.

Правильных решений тут два:
А) работать с СУБД не напрямую, а через собственноручно написанный сервер, который такие вещи (запросы на обновление от клиентов) будет отслеживать. Как вы извещения реализуете уже будет зависеть от вашей фантазии.
Б) пулить (Pull) таблицу в базе. Т.е. периодически опрашивать на наличие изменений. Это может быть сильно затратно. Поэтому в базе можно завести триггер или иной механизм, который при изменении данных в таблице может выставлять где-то метку (в другой таблице).

Я рекомендую внимательно изучить само требование содержания DGV в синхронном состоянии с таблицей в базе. Практической пользы от такой вещи очень мало, а сложностей много. Действительно ли это нужно?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2018, 10:09
Помогаю со студенческими работами здесь

Вывод информации в DataGridView в зависимости от выбора в другом DataGridView - C# Access
В 1м DataGridView У меня предприятия, при выборе какого-то 1 предприятия, во 2й DataGridView появляются все записи с тем же ключом. Общий...

Перенос строки из одной dataGridView в другой dataGridView с Access
Всем привет!!! Подскажите пожалуйста, как из dataGridView1( подключенной к Access) перенести выделенную строку в другую dataGridView с...

Как заполнить DataGridView данными из таблицы MC Access
Привет всем! Нужно заполнить таблицу DataGridView с помощью уже имеющейся информации. Не все столбцы нужно заполнить в связи с этим...

Как удалить строку из БД Access через DataGridView?
Добрый день! Подскажите как реализовать удаление строки из бд через datagridview. из самой datagridview удалить строку получается, а вот из...

Как добавить определённые строки в datagridview из Access?
Мне нужно вывести в datagridview только определённые строки из базы Access, например строки 1-10. База называется Mercedes.accdb. Она...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru