111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|||||||||||
1 | |||||||||||
Как вы делаете Update данных в БД (при использовании DataGridView, DataSet, DataAdapter)22.02.2012, 12:04. Показов 15508. Ответов 31
Метки нет (Все метки)
Доброго дня, форумчане.
Отдельный привет знакомым форумчанам. Решил поднять я старую наболевшую тему про DGV и DS. Тыщу лет назад я уже об этом спрашивал, более того подискутировал на эту тему (здесь). В прошлый раз я вывернулся и избежал спорных моментов в этом вопросе. Но вот опять прихожу к тому же. Итак суть: Преамбула: Создаю подключение к БД руками в коде, использую DataAdapter, DataSet. К DataGridView цепляется таблица DataSeta (все как "по учебнику") Хочу при нажатии на строки грида вызывать форму (т.н. карточку-документа) из которой добавлять или изменять строки в гриде. С добавлением строк в грид (в ДатаСет и потом в БД) никаких проблем нет - создаю объекты DataRow, добавляю их в DataTable и.т.д. А вот с банальным обновлением (читай изменением\Update'ом) - всё крайне сложно. Известно, что если изменить строку в гриде и проапдейтить ДатаСет, данные обновятся и в БД (то есть нет надобности лезть в ДатаСет, ворочать его объекты DataRow) Интересно то, что если в одну процедуру (например нажатия на кнопку) толкать изменение строк грида и обновление ДатаСета, то данные не попадают в БД. Если эти функции разбить (например по разным кнопкам) - все замечательно работает. Чтобы не быть голословным... Вот код который работает (два действия на разных кнопках):
Испробовал все доступные мне методы. Все как об стену. P.S. Подразумеваю это может быть связано с событиями Validated и Validating для DataGridView (хз как, но остается грешить только на это) P.P.S. МУЖИКИ, ВСЕХ С НАСТУПАЮЩИМ!
0
|
22.02.2012, 12:04 | |
Ответы с готовыми решениями:
31
Волнует скорость DataSet и DataAdapter.Update Запись данных в базу данных mdb с использованием DataAdapter и DataSet Обновление базы данных dataadapter.Update Работа с Datagridview, Dataset, Update |
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|
22.02.2012, 13:28 [ТС] | 2 |
Ну или зайдем с другой стороны - как вы делаете Update данных в БД (при условии использования DataGridView, DataSet, DataAdapter...)?
Заранее спасибо.
0
|
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|
24.02.2012, 06:01 [ТС] | 3 |
Неужели никто не делает так?
В книгах тактично обходят этот вопрос. А вопрос то на самом деле бытовой...
0
|
24.02.2012, 10:01 | 5 |
теоретически все написано правильно, за исключением вот этой строки:
а ты проверял, сколько строк затронул метод Update? каким способом ты проверяешь произошли или нет изменения?
1
|
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
|
|
24.02.2012, 10:29 | 6 |
А зачем программно менять содержимое DGV, коли он привязан к данным? Работайте с BindingSource.
По ошибке х/з что сказать. Надо вскрытие производить, искать где косяк и почему. Раз не попадают в ДБ, значит строка не помечается как измененная, либо помечается, а потом что-то сбрасывает метку.
0
|
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|
24.02.2012, 11:12 [ТС] | 7 |
Ну тут название темы модераторы подкорректировали. Как делать подключение и тому подобное я в курсе, и делаю сам все это в коде. Меня интересует именно Апдейт ДатаСета из ДатаГридВью.
0
|
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|
24.02.2012, 11:30 [ТС] | 8 |
Я исходил из тех соображений, что если Грид привязан к ДатаСету, то и изменения из грида попадают в Датасет (опытным путем установлено). С bindingSource эксперементировал - но по мне он как пятое колесо.
Интересно просто, все-таки это моя ошибка или какой-то баг. Вот приложу проект проверочный. Сами убедитесь. Вариант 1 (рабочий): [Загрузить БД] --> (выбрать строку) --> [Добавить] --> [Сохранить] --> [Загрузить БД] (просто чтобы перечитать данные) Вариант 2 (НЕ работает): [Загрузить БД] --> (выбрать строку) --> [Добавить и Сохранить] --> [Загрузить БД]
0
|
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
||||||
24.02.2012, 11:36 [ТС] | 9 | |||||
nio
Я проверял корректность составления АпдейтКоманды. А сколько строк изменено проверял так:
0
|
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
|
|
24.02.2012, 12:15 | 11 |
0
|
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|
24.02.2012, 17:01 [ТС] | 12 |
Если работать напрямую с ДатаСетом - то мне надо определять какая строка выделена в гриде, находить ключ и потом выводить данные в форму.... что согласитесь намного дольше. Если не разберусь в этом вопросе - буду напрямую в ДатаСет ковыряться.
А кто-нибудь проверил тестовую прогу выше? Правильно хоть я говорю? А то, может, мой подход неверный. P.S. Спасибо всем отвечающим.
0
|
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
|
||||||
24.02.2012, 17:39 | 13 | |||||
А ничего не понял. Данные связаны "двусторонне", при изменении в гриде - изменяется таблица и наоборот.
Для вашего кода будет что-то вроде:
0
|
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
|
|
24.02.2012, 17:49 | 14 |
У меня тоже были проблемы с гридом! Я их не решил, а посему "заковырял" датасет до победного конца. Язык был только "немного" другой! C# заместо VB. Грид я использовал только для чтения данных и отображения их на форме по двойному клику. Для записи я использовал TableUdapter с его методом Update. Если меня не устраивал стандартный Update, то писал свой (в дизайнере типизированного датасета это делать легко).
Если честно, то меня тоже немного удивило, что как-то уж очень замысловато все с этим DataGridViwe. До сих пор думаю, что удобнее всего (но не быстрее с точки зрения производительнсои) работать только гридом. До сих пор интересно ознакомится с кодом который не только добавит данные в грид, но и обновит этими данными базу. Интереснее всего как заставить грид обновить совой источник данных...
1
|
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|
24.02.2012, 18:26 [ТС] | 15 |
serg42
Поскольку связь двусторонняя - я и говорю хочу решить эту проблему, делаю аналогично - но не выходит. Мне уже не важно на каком языке будет написано - C# или VB - суть не изменится. Я говорю, почему-то данные обновляются корректно только когда функции заполнения грида и обновления разделены (находятся в разных процедурах - скажем, на разных кнопках "Изменить" и "Сохранить"). Если их положить в одну функцию - то данные отображаются в гриде, но в ДатаСет не уходят... _katon_ Кажется мне придется тоже ковырять ДатаСет, а не грид. А так - в обновлении ДатаСета из грида ничего особенного нет - все так же делается через da.update(ds)
0
|
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
|
|
24.02.2012, 18:53 | 16 |
Что конкретно не выходит?
В ДатаСет они не уходят видимо потому, что должена вызываться функция типа RefreshEdit , или UpdateCellValue, или чё-нить в этом духе. Но я всё не рекомендую таким извращенным способом вносить данные в ДатаСет.
1
|
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|
24.02.2012, 21:31 [ТС] | 17 |
serg42
Я просто думал что кто-то кроме меня сталкивался с такой проблемой. Кажется, придется варганить что-нибудь с BindingSource или напрямую лезть в DataSet. Может кто подскажет "типовой" вариант?
0
|
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
|
||||||
02.03.2012, 18:19 | 19 | |||||
Я разобрался как обновлять данные из грида в базу при использовании типизированного датасета. Дело в том, что запись добавленная в грид моментально синхронизируется с myDataTable назначеной в качестве источника данных. А это означает, что вопрос стоит только в том, когда выполнить метод Update для адаптора.
Для типизированного датасета метода Update уже сгенерирован и перегружен для всех случаев, а это означает, что добавление/обнавление/удаление данных происходит одним и тем же способом:
Кроме этого если к гриду цеплять навигатор, то необходимо в качестве источника данных указывать BindignSource. Maden, я думаю что основная проблемма это недопонимание принципов работы объектов связанных c гридом.
1
|
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
|
|
02.03.2012, 19:57 [ТС] | 20 |
_katon_
принципы я понимаю. Кроме того знаю различные подходы к обновлению данных. Я лишь не понимаю что за баг это такой с гридом. Если не трудно, скачай проект на 1й странице в моем посте - и убедись, как реализован один из подходов. ------------------- Еще раз поясню что мне не понятно Известно что если к гриду подцепить DataSet (или BindingSource, или впринципе - таблицу), то все изменения двусторонне направлены (изменяем грид -> меняется DataSet и наоборот (при выполенении DataAdapter.Update(ds))). Утверждение верно? Верно. Мне не понятно почему если на две кнопки поместить функции 1. Изменение грида 2. Апдейт - то все прекрасно работает. А вот если все это действие закрепить за одной кнопкой типа "Изменить и сохранить" - то ничего не работает (или работает через раз и вообще нестабильно) ...
0
|
02.03.2012, 19:57 | |
02.03.2012, 19:57 | |
Помогаю со студенческими работами здесь
20
Пакетная передача обновлений (Insert) в базу данных посредством DataAdapter.Update Как правильно сделать update с посредством dataadapter Обновление данных в Datagridview из БД при использовании BackgroundWorker Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |