|
|
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
База - MsSql 2k5. Типизованный датасет. Таблица имеет PrimaryKey с AutoIdentity (автоинкремент). Есть основная форма с гридом. В грид добавляю новую строку так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Открывается форма редактирования, там заполняю поля, жму ок, выполняется код: Код: plaintext 1. 2. 3. 4. Т.о. я возвращаюсь в первоначальную (основную форму). Вижу добавленную строку в гриде. Пытаюсь сразу же ее редактировать (опять открыв форму редактирования). Не внося никаких изменений, пытаюсь сохранить, валится Exception Concurrency Violation UpdateCommand affected 0 records Интуитивно понимаю, что все дело в PrimaryKey с его автоикрементом. Но где что нужно дописать, чтобы заработало, не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 12:36 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
Вот еще что подумал - в моей ситуации только что добавленная строка попадает в базу на SQL сервер со своим ID (допустим, 15). А в датасете она с другим ID (допустим, -1). Так вот как дать этому датасету понять, чтобы он прочитал "правильное" значение для ID из базы для только что добавленной строки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 12:43 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
frominfotek, Если Вы пишете "учебно-тренировочный" пример - смотрите, как делал автор. Если пытаетесь создать рабочее приложение - потрудитесь прописать явно процедуры извлечения, модификации и удаления записей БД. В случае с МС СКЛ 2005 рекомендую создать функцию записи новой строки, которая будет при успехе ввода в БД возвращать новый ID (напр. при помощи ScopeID). Тогда при утверждении модального диалога Вы будете добавлять в списочный грид (а точнее в соотв. таблицу датасэта) запись с уже валидным ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 12:56 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
Кажется, где-то в недрах ADO есть какое-то свойство, только не помню, у какого объекта, специально для автоинкремента, чтобы датасет "читал" обратно ID из базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 13:16 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
frominfotekКажется, где-то в недрах ADO есть какое-то свойство, только не помню, у какого объекта, специально для автоинкремента, чтобы датасет "читал" обратно ID из базы. Хотелось бы знать, как бы это могло быть реализовано? Если у приличных СУБД разные механизмы генерации идентификаторов (генераторы, последовательности и т.п.), имя которых надо указывать явно для внешнего использования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 13:34 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
frominfotek, Первоисточник: http://msdn.microsoft.com/ru-ru/library/ks9f57t0.aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 13:47 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
Вот рыл-рыл, вроде оно: AcceptChangesDuringUpdate Но как его использовать, пока не пойму (зуб болит, мозг разрушает). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 14:30 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
Да, только что вспомнил очень важную оговорку - то свойство (предположительно AcceptChangesDuringUpdate), о котором я говорил, работает ТОЛЬКО с микрософтным сиквелом. Ну т.е. платформа C# - от MS, и сиквел сервер - от них же. Вот они и хитро под себя реализовали. Под другие сервера, скорее всего, работать не будет, как и говорил Курдль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 14:32 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
Я даже вспомнил, где читал про это - у Девида Сеппы "Программирование на ADO.NET 2.0", где-то в конце книги. Книга, к сожалению не под рукой, и читал года два назад, сейчас пробую скачать книгу где-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 14:40 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
frominfotek, Это есть в MSDN-е даже на Русском: http://msdn.microsoft.com/ru-ru/library/system.data.common.dataadapter.acceptchangesduringupdate.aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 14:48 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
Прочитал и только что скачанную книгу Сеппы, и MSDN. Очень много рассуждений, но одно я так и не понял - что мне нужно добавить в код, чтобы у строки, к-рую я только что добавил, при отсылании Update на сервер, обновлялось ID в соответствии с полученным от сервера значением? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 15:31 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
frominfotek что мне нужно добавить в код, чтобы у строки, к-рую я только что добавил, при отсылании Update на сервер, обновлялось ID в соответствии с полученным от сервера значением? Я мельком пробежал по описанию и понял, что нужно правильно прописать SQL в selectcommand и insertcommand -свойствах DataAdapter. Вы используете DataAdapter, который автоматически сформировался в Датасэт-дизайнере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 15:37 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
Да, именно так. Кстати, я уже даже морально готов после Update() , полностью заново читать таблицу с SQL-сервера, так: Код: plaintext Но и это не помогает, может, очищать как-то надо что-то перед повторным вызовом Fill() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 15:55 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
frominfotekДа, именно так. Кстати, я уже даже морально готов после Update() , полностью заново читать таблицу с SQL-сервера Но и это не помогает, может, очищать как-то надо что-то перед повторным вызовом Fill() ? Читать таблицу после Update - это не такой уж и плохой вариант. Тут надо опираться на ТЗ (насколько нагружена система, быстрый ли канал связи и т.п.). А в идеале - чем чаще запрашиваете данные с сервера тем меньше вероятность утраты их актуальности. Что у Вас не получается при повторном Fill? Да, можно перед ним чистить целевую таблицу. А более корректно использовать merge() - Сеппа подробно описывает, как использовать этот метод. Советую изучить - это очень важная особенность ADO.NET. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 16:43 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
Спасибо! Я тут ошибся, написав, что " полностью заново читать таблицу с SQL-сервера не помогает". Все отлично помогает, я просто не ту таблицу заново читать пытался :) В данном случае решил проблему путем чтения заново таблицу после каждого Update(). Записей будет немного, так что нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 17:21 |
|
||
|
UpdateCommand affected 0 records
|
|||
|---|---|---|---|
|
#18+
НАШЕЛ !!! ololo я знал, что это есть!!!!!!!!!!!!!!!!! в типизованном датасете жмем правой кнопкой на TableAdapter -> Configure. Там выбираем Advanced Options... и ставим галочку "Refresh the data table" -> и все, дальше работает само !!! Вот не понимают M$: в своих MSDN, на форумах и т.д. и т.п. тонны мегабайт замороченных объяснений, как оно все устроено, как исправить, но ни слова о том, что нужно поставить одну лишь галочку, но в очень секретном месте :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2010, 18:02 |
|
||
|
|

start [/forum/topic.php?fid=17&fpage=55&tid=1351190]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 367ms |

| 0 / 0 |
