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


Автор: ProgerIv 19.8.2008, 17:15
Сделал такую рекурсию:

Код

        public void Delete(int Id)
        {
            foreach (DataRow dataRow in dataTable.Rows)
            {
                if (dataRow["ID_Parent_"] != DBNull.Value)
                {
                    if (Convert.ToInt16(dataRow["ID_Parent_"]) == Id)
                    {
                        Delete(Convert.ToInt16(dataRow["ID_"]));
                    }
                }
            }
            dataTable.Rows.Find(Id).Delete();
        }


Компилятор ругается "Deleted row information cannot be accessed through the row."
Если так:
Код

        public void Delete(int Id)
        {
            foreach (DataRow dataRow in dataTable.Rows)
            {
                if (dataRow["ID_Parent_"] != DBNull.Value)
                {
                    if (Convert.ToInt16(dataRow["ID_Parent_"]) == Id)
                    {
                        Delete(Convert.ToInt16(dataRow["ID_"]));
                    }
                }
            }
           // dataTable.Rows.Find(Id).Delete();
        }

то все проходит, но удаления не происходит, в чем дело?

Автор: jonie 21.8.2008, 01:34
целостность базы так не регулируется имхо. для таких целей есть констрайны и триггеры....

"Компилятор ругается"  ?? компилятор?! быть не может такого....

Автор: Partizan 21.8.2008, 07:24
jonie, в принципе было б неплохо если б он это хотябы в качестве warning на этапе компиляции выводил  smile 

Автор: jonie 21.8.2008, 10:29
было бы не плохо, если бы код выглядет так:
Код

СделатьКруто();

Автор: Partizan 21.8.2008, 10:32
jonie, было бы не плохо если бы компилятор умел читать мысли

Автор: ProgerIv 21.8.2008, 12:49
Я так понял, что вам не понятно что откуда берется, попробую подробнее.

Пример:
ID_ | ID_Parent_ | Name
1    | (null)         | Node1
2    | (null)         | Node2
3    | 1               | Node3
4    | 2               | Node4
5    | 2               | Node5
6    | 2               | Node6
7    | 2               | Node7
8    | 5               | Node8

|__Node1
|    |
|    |__Node3
|
|__Node2
      |
      |__Node4
      |
      |__Node5
      |    |
      |    |__Node8
      |
      |__Node6
      |
      |__Node7

Мне допустим надо удалить Node2, но в эту ветку входят: Node4, Node5, Node6, Node7, а Node8 - предок для Node5, и их все, следовательно, тоже надо удалить.

Вот исходник http://depositfiles.com/files/7377124

Автор: ProgerIv 22.8.2008, 09:40
Всем большое спасибо, проблема решена
Код

            foreach (DataRow dataRow in dataTable.Rows)
            {
                if ((dataRow.RowState != DataRowState.Deleted) &&
                    (dataRow["ID_Parent_"] != DBNull.Value)&&
                    (Convert.ToInt16(dataRow["ID_Parent_"]) == Id))
                {
                    Delete(Convert.ToInt16(dataRow["ID_"]));
                }
            }
            dataTable.Rows.Find(Id).Delete();

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