|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Всем привет! Голову сломал, не могу найти решения. Использую XtraGrid в приложении WinForms. Источник данных - LINQ2SQL классы (DataContext). При сохранении изменений может возникнуть ошибка на стороне БД - например, нарушение уникальности, целостности, ошибка в триггере или еще что-то, то есть, не всю валидацию возможно выполнить в ValidateRow. Хочу, чтобы при возникновении ошибки во время сохранения изменений в БД юзер получал соответствующее уведомление и оставался на изменяемой строке. Не могу найти способ это сделать :( Имеются 2 события, теоретически подходящие для задачи: 1) GridView.ValidateRow - но здесь еще рано постить изменения в базу данных, т. к. записи в источнике данных к этому моменту еще не изменены 2) GridView.RowUpdated - можно сделать SubmitChanges(), но непонятно, как оставить юзера на этой же строке в случае ошибки. В частности, если юзер инициировал сохранение изменений переводом фокуса на другую строку грида, то фокус все равно уйдет с ошибочной строки, даже если поставить SetColumnError(). Окей, пробовал не давать уводить фокус с ошибочной строки с помощью: Код: c# 1. 2. 3. 4.
фокус вообще пропадает :( Существует ли некий общий паттерн или ваше работающее решение для обработки ошибок уровня БД при сохранении изменений строки в ХtraGrid? Спасибо :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2013, 04:52 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Неужели ни у кого вопроса не возникало? Как такое может быть? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2013, 15:36 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry Gurianovнарушение уникальности, целостности, ошибка в триггере или еще что-то, то есть С этого момента поподробней, плиз. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2013, 22:05 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
АбсолютDmitry Gurianovнарушение уникальности, целостности, ошибка в триггере или еще что-то, то есть С этого момента поподробней, плиз. 1) Нарушение уникального индеска 2) Неверный FK 3) Триггер БД или хранимка, с помощью которой добавляется/обновляется запись, вызывает ошибку 4) Вообще любые ошибки уровня БД ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2013, 22:54 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Ну теоретически, некоторые ошибки можно предотвратить уже на клиенте. Это чисто моё ИМХО. Далее, как я понимаю, каждый роу это у нас отдельный объект? Ну, к примеру, Person etc. И в данном случае объекта, к примеру, можно иметь проперть, которая отображала бы значение, как было сохранено или не сохранено в бэдэ, к примеру CommitStatus. По поводу XtraGrid не подскажу, не работал с ним (как задержать пользователя на одной из записи). ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2013, 23:06 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
АбсолютНу теоретически, некоторые ошибки можно предотвратить уже на клиенте. Это чисто моё ИМХО. Далее, как я понимаю, каждый роу это у нас отдельный объект? Ну, к примеру, Person etc. И в данном случае объекта, к примеру, можно иметь проперть, которая отображала бы значение, как было сохранено или не сохранено в бэдэ, к примеру CommitStatus. По поводу XtraGrid не подскажу, не работал с ним (как задержать пользователя на одной из записи). Конечно, ошибки лучше предотвращать на клиенте, но это невозможно для 100% случаев. Статус сохранения не нужен - там и так понятно, вопрос относится скорее к специфике XtraGrid. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 06:59 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry GurianovАбсолютНу теоретически, некоторые ошибки можно предотвратить уже на клиенте. Это чисто моё ИМХО. Далее, как я понимаю, каждый роу это у нас отдельный объект? Ну, к примеру, Person etc. И в данном случае объекта, к примеру, можно иметь проперть, которая отображала бы значение, как было сохранено или не сохранено в бэдэ, к примеру CommitStatus. По поводу XtraGrid не подскажу, не работал с ним (как задержать пользователя на одной из записи). Конечно, ошибки лучше предотвращать на клиенте, но это невозможно для 100% случаев. Статус сохранения не нужен - там и так понятно, вопрос относится скорее к специфике XtraGrid. Вы неправильно мыслите. XtraGrid это все-го лишь редактор данных (коллекции). Максимум за что он может отвечать - за валидность типов (чтобы в свойства с инт не пихали значения с типом стринг). Отбросьте XtraGrid из цепочки своих рассуждений. У вас есть инструмент, который умеет проверять один объект коллекции до запроса в базу? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 07:31 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
LameUserВы неправильно мыслите. XtraGrid это все-го лишь редактор данных (коллекции). Максимум за что он может отвечать - за валидность типов (чтобы в свойства с инт не пихали значения с типом стринг). Отбросьте XtraGrid из цепочки своих рассуждений. У вас есть инструмент, который умеет проверять один объект коллекции до запроса в базу? Спасибо, не первый год замужем :) Проверить объект до запроса в базу я, конечно, могу, но проверить не на всё. Представьте, что один юзер выбрал в UI запись для редактирования, полчаса тупил, а потом попытался сохранить, и в этот момент в БД уже перестал существовать FK, на который ссылается его запись, потому как другой юзер его 10 минут назад похерил. Можно, конечно, перед каждым сохранением лазить в базу и проверять наличие всех связей, но это 1) дорого 2) все равно не обеспечивает 100% надежности, ну а мутить хитрую транзакцию ради каждой операции записи мы не рассматриваем. Суть вопроса, собственно, в том, как перехватить ошибку, если она возникла при сохранении уже проверенной записи. Не все проверки целостности целесообразно переносить в клиента, есть функционал БД и он работает. Просто очень не хватает события XtraGrid.OnUpdating ()с параметром типа e.Success, где я могу делать свои проверки и сообщать XtraGrid-у об ошибке. При сохранении строки XtraGrid изменяет запись в подлежащем BindingSource, который, в свою очередь, предоставляет запись из DataContext. И нигде в этом слоеном пироге я не могу найти места, чтобы сразу после изменения записи сделать DataContext.SubmitChanges() так, чтобы ошибка вернулась наверх в XtraGrid непосредственно в процедуру сохранения и этим хотя бы вызвала XtraGrid.InvalidRowException(). Сохранение записи выглядит примерно так: Код: c# 1. 2. 3. 4. 5.
В (1) и (2) не знаю события, на которое можно повесить SubmitChanges(). В (3) вызвать можно, но не знаю, как удержать фокус на ошибочной строке в XtraGrid. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 07:52 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry Gurianov, Еще раз, зачем вам какие-то события. Давайте я примерно опишу сценарий, а вы скажите что здесь не так. В определенный момент времени вы вызываете сохранение данных (как я понял это построчно): Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
} Код писался без проверки в "блокноте". ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 08:39 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Похоже на баг в XtraGrid. Этот код: Код: c# 1. 2. 3. 4.
не сохраняет фокус на созданной строке. LameUser, если не справлюсь с событиями, попробую ваш подход. Кстати, а как отменить стандартную процедуру сохранения изменений, если уж включать свой обработчик? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 10:22 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry GurianovПохоже на баг в XtraGrid. Этот код: Код: c# 1. 2. 3. 4.
не сохраняет фокус на созданной строке. LameUser, если не справлюсь с событиями, попробую ваш подход. Кстати, а как отменить стандартную процедуру сохранения изменений, если уж включать свой обработчик? По идее никак. Если честно я не знаком с LINQ2SQL, может у него есть какой-то инструментарий, который позволяет открыть транзакцию, отправить запрос на сервер в рамках этой транзакции и если ошибка - откатить транзакцию. Но даже если Insert/Update/Delete строки не прошел - ничего страшного, на сервере не будет битых данных. Если вы хотите вернуть первоначальные данные строки в коллекции до редактирования - либо их кэшировать где-то перед изменением, либо использовать шаблон command, чтобы иметь возможность обратного отката (не всегда легко реализуемо). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 12:57 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
либо я чего-то не понимаю... по идее, у любого, кто юзает грид с L2S или EF должен вставать сей вопрос - но нет, весь тырнет перерыл( ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:12 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry Gurianov, че тебе надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:14 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
ViPRosDmitry Gurianov, че тебе надо? большую кучу бабла. А по программированию - ветка вверху. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:15 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry Gurianov, ну установи фокус принудительно ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:24 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
а ваще редко такое нуно, че строку какую то хранить не все ж однострочные ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:25 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
ViPRosа ваще редко такое нуно, че строку какую то хранить не все ж однострочные вообще не понял камента ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:28 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry GurianovViPRosа ваще редко такое нуно, че строку какую то хранить не все ж однострочные вообще не понял камента Дим, расслабь булки, всё можно. Сейчас нет времени писать код, во вторник покажу тебе примерчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:39 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry Gurianov, и ты прально смотришь, надо делать только на BeforeLeaveRow, по другому никак. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:42 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
ProgaDmitry Gurianov, и ты прально смотришь, надо делать только на BeforeLeaveRow, по другому никак. К сожалению, e.Allow = false не срабатывает, если речь идет о новой записи. Фокус вообще исчезает из грида. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 17:45 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Так, щас будет адов костыль. Беременных, нервных и детишек просьба увести от экрана, новички программирования также не смотрят сюда, а профессионалы запасаются носовыми платками и поп-корном. На данный момент, после убийства многих часов, в жесточайших муках рожден данный вариант, который позволяет юзеру видеть ошибки, произошедшие в БД при сохранении записи из XtraGrid. Код: 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 19:03 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry Gurianov, это мега костыль нет слов. Рекомендую открыть для себя интерфейс IEditibleObject. Второе добавлять строки не в грид, а в источник строки и третье, добавлять новую строку сразу при загрузки грида, а при редактировании, добавлять новую сразу без инсерта, надеюсь понятно о чём я. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2013, 11:33 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
и не надо использовать LINQ2SQL для гридов, лучше уж EF. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2013, 11:35 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
ProgaРекомендую открыть для себя интерфейс IEditibleObject. Я знаю интерфейс IEditibleObject. Давайте общаться с уважением, за*бал скульрушный пафос. Не считайте других за дебилов. авторВторое добавлять строки не в грид, а в источник строки В чем смысл этого? автори третье, добавлять новую строку сразу при загрузки грида, а при редактировании, добавлять новую сразу без инсерта, надеюсь понятно о чём я. конечно, нет. В чем смысл? автори не надо использовать LINQ2SQL для гридов, лучше уж EF. и опять же - с чего? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2013, 11:45 |
|
XtraGrid + LINQ2SQL, обработка ошибок БД
|
|||
---|---|---|---|
#18+
Dmitry Gurianovprivate void gvHourlyRate_BeforeLeaveRow(object sender, DevExpress.XtraGrid.Views.Base.RowAllowEventArgs e) { // сохранение изменений в источнике уже произошло. Но из-за (вероятно) бага в XtraGrid, данный код: // e.Allow = !gvHourlyRate.IsNewItemRow(e.RowHandle); // не предотвратит уход фокуса, если строка была только что создана. Фокус просто вообще исчесзнет с экрана =( } и это в корне неверно. всё работает. надо проверять не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2013, 11:48 |
|
|
start [/forum/topic.php?fid=20&msg=38449071&tid=1403742]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 180ms |
0 / 0 |