Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Как избежать ошибки?


Автор: vlsaf 26.11.2007, 13:31
На вот этой строке 
Код

foreach (DataRow row in this.aWIASDataSet.KundenText)

выскакивает ошибка

Collection was modified; enumeration operation might not exetute

Я добавил запись в таблицу и теперь хочу пройтись по всем строкам, и посмотреть
в какой строке row.RowState == DataRowState.Added

а у меня exeption !

Как быть?

Автор: thomas 26.11.2007, 13:43
vlsaf, 
привет.
А там не надо указывать Rows?
Код

foreach (DataRow row in this.aWIASDataSet.KundenText.Rows)


По поводу исключения, у меня выскакивало примерно такое же, когда я выполнял обновление в отдельном потоке.
Но ты вроде без потоков работаешь. И еще 
Проверь когда вызывается this.aWIASDataSet.AcceptChanges(). 

Автор: vlsaf 26.11.2007, 13:48
Я записываю мою таблицу построчно. 
Сейчас я не работаю с целым Dataset
И поэтому this.aWIASDataSet.AcceptChanges() мне не нужен.

Одну строку записываю вот таким макаром
Код

this.kundenTextTableAdapter.Update(row);


а на следующей вылезает exeption 


ps 
с Rows та же фигня.
А что? Правельнее с Rows работать? Почему?

Автор: thomas 26.11.2007, 13:55
vlsaf, 
Если я правильно понял, то это выглядит так?
Код

foreach (DataRow row in this.aWIASDataSet.KundenText)
{
     this.kundenTextTableAdapter.Update(row);
}

Типа обновил одну строку и выкинул исключение. Да?
Поставь точку останова и посмотри что стало с содержимым KundenText. Здается мне, что кол-во строк в таблице стало равным нулю.

Автор: vlsaf 26.11.2007, 13:59
Извиняюсь за поднятую волну.


Перетрудился  smile 

Я неправильно оформил блок Filally при обработки ошибки.



thomas, 
У меня все же вышло ловить ошибки хранимок.
Построчное сохранение катит!!! smile 


Автор: thomas 26.11.2007, 14:26
vlsaf, 
С успехом тебя.  smile 
Помечай вопрос как решённый.   smile 

Автор: vlsaf 26.11.2007, 15:31
Все же ошибка выскакивает
Если row.RowState == DataRowState.Added ошибки нет
если row.RowState == DataRowState.Modified ошибки нет
а вот 
если row.RowState == DataRowState.Deleted происходит вышеописанная ошибка

видать по циклу пройтись дальше не может

а код такой
Код

foreach (DataRow row in this.aWIASDataSet.KundenText)
{
       if ((row.RowState == DataRowState.Added)
       || (row.RowState == DataRowState.Deleted)
       || (row.RowState == DataRowState.Modified))
{
      this.kundenTextTableAdapter.Update(row);
}



Автор: Experimenter 27.11.2007, 10:07
vlsaf, распространенная ошибка, в foreach такое не прокатывает. Да и for использовать аккуратно надо
Код

for (int i = aWIASDataSet.KundenText.Rows.Count - 1; i >-1; i--)
{
       if ((aWIASDataSet.KundenText.Rows[i].RowState == DataRowState.Added)
       || (aWIASDataSet.KundenText.Rows[i].RowState == DataRowState.Deleted)
       || (aWIASDataSet.KundenText.Rows[i].RowState == DataRowState.Modified))
{
      this.kundenTextTableAdapter.Update(aWIASDataSet.KundenText.Rows[i]);
}


Добавлено через 42 секунды
Для удаления в цикл надо заходить с хвоста

Автор: vlsaf 27.11.2007, 10:55
Experimenter, откуда ты все знаешь? smile  smile  smile 

Может еще один вопрос подскажешь.

У строки состояние такое
(aWIASDataSet.KundenText.Rows[i].RowState == DataRowState.Deleted)
Если я отлавливаю exeption при удалении строки

Код

                    try { this.kTextTableAdapter.Update(aWIASDataSet.KText.Rows[i]); }
                    catch (SqlException exception)
                    {
                        foreach (SqlError item in exception.Errors)
                        {
                            MessageBox.Show(item.Message, massage_save, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }


то как мне показать юзеру на какой строке это дело сработало?
row уже обнулено, и я не могу достать до нужного мне поля. А так хочется!!!

Хотелось бы иметь что-то типа этого
Код

row.Row["text", DataRowVersion.Original]


Но как?

Автор: thomas 27.11.2007, 14:05
Experimenter, 
Ценное замечание.
Примем к сведению.  smile 
Держи +1 в репу.  smile 

Автор: vlsaf 27.11.2007, 14:13
Вопрос решен.

>то как мне показать юзеру на какой строке это дело сработало?
>row уже обнулено, и я не могу достать до нужного мне поля. А так хочется!!!

См топик http://forum.vingrad.ru/forum/topic-184056.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)