| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Глупый вопрос по работе с БД (DataGridView) |
| Автор: brother79 4.10.2010, 09:29 | ||
| Здравствуйте. На текущем этапе нужен простой вар-нт редактирования таблицы. Я использую DataGridView Нашёл где-то такой код:
Принципе работает, с некоторыми неточностями. Когда сохраняется последняя строка таблицы, которая новая - то при первом сохранении - сохраняется нормально, автоматически расчитывается id как автоинкремент, но в самой таблице в компоненте - id никак не обновляется и при повторном сохранении этой строки - срабатывает исключение. Как правильно сделать это простое сохранение результатов? |
| Автор: brother79 4.10.2010, 14:02 |
| Что-то порылся порылся очень даже не глупый вопрос получается :( Ghtдлагают делать через хранимую процедуру своё добавление с возвратом параметра. А других вар-ов нету? |
| Автор: jonie 4.10.2010, 18:43 |
| без хранимки можно, просто используя два sql statement для выполнения. Подробнее: http://msdn.microsoft.com/en-us/library/ks9f57t0.aspx |
| Автор: brother79 5.10.2010, 06:19 |
| Почитал, можно select добавить после insert только в этом дураском TableAdapter не могу найти куда свой запрос на добавление засунуть. И вообзе компоненту sqlDataAdapter не вижу, которая в доке описана. |
| Автор: jonie 5.10.2010, 11:17 | ||||
| В общем я тут поразмыслил и сделал следующую штуку. 1) я унаследовался от TableAdapter-а, который использовал назвав класс TblTableAdapter2, чтобы можно было override-днуть методы
Собственно посмотрев в код, можно убедиться что если вызывать AcceptChanges, то будет вызван первый (в отличие от ручного добавления)... возможно надо будет переопределить и другие методы (не смотрел) которые инсертят данные (на первый взгляд таковых более нет). 2) я сделал метод у адаптера в DataSet-е который получает последний вставленный Id-шник по sql запросу select @@IDENTITY (см. примечание2) 3) в перегруженном методе Update у себя я произвожу обновления по одной строке ,статус которой равен Added, после чего руками меняю её Id шник и снова сбрасываю ее состояние на Unchanged вызывая AccepChanges(). 4) а да, в коде сгененым дизайнером я подменил название класса Адаптера на мой унаследованный руками (в дальнейшем визуальный редактор не будет это ломать). Пример в аттачменте... Примечания: 2) В примере я использовал SQLCe в котором обычно нет конкуренции при вставках данных. Однако, для MSSQLя не уверен что базовый Update у адаптера не производит соединение\отсоединение Connection от источника данных, это надо проверить, если не производит тогда хорошо - у нас есть сессия, в рамках которой можно использовать SCOPE_IDENTITY(). . это надо проверить например тем же профилировщиком для MSSQL.... Да, наверно можно открыть пееред base.Update-тами соединение, и использовать метод Insert() , т.к. он не закрывает-открывает соединение, если оно уже открыто:
|
| Автор: umlprog 7.10.2010, 09:33 | ||||
А просто перезаполнить свой грид после апдейта не пробовали? |
| Автор: jonie 7.10.2010, 09:51 |
| umlprog, это не нормальный подход, "школьный" .... |
| Автор: brother79 12.10.2010, 11:46 |
| Что-то я запарился уже с этими таблицами. С наследованием - что-то не разобрался пока, я делаю на wpf - там немного отличается похоже. а так просто - сделал запрос в датасете чтобы последнюю добавленную дёргать как в примере - но он не дёргает никак. Я уже сделал запрос на добавление отдельный, подряд сначала добавление вызываю, потом хочу последний дёрнуть - он пустоту возвращает и всё. |
| Автор: brother79 12.10.2010, 13:08 | ||
Дошёл до такого кода:
1) не могу получить никак последний id, запрос пустой получается 2) Когда делаю мерге - у меня добавляется строка, вместо того, чтобы поменять id, т.е. не правильный подход |
| Автор: brother79 12.10.2010, 14:00 | ||
Сделал так:
Теоретически работает, только не нравится костыль с вычислением добавленного id, который просто получается как max(id). Так я это и не смог победить |
| Автор: brother79 13.10.2010, 10:48 | ||
Если я руками добавляю эл-нт, типа:
Как вычислить позицию для System.Windows.Data.CollectionViewSource ? |
| Автор: brother79 13.10.2010, 11:56 |
| Sory, поторопился с выводами |