Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 ASP.NET, бази данни и дървовидни структури
  1. Въведение
  2. Основни обекти на ADO.NET
  3. Да започнем с базата данни
  4. Намиране на поддървото
  5. Пълния сорс код
     
Автор  futureweb (02.01.2005 19:05)  съобщение до автора
Погледнат  6272 пъти  добави към любими
Оценка  добави коментар
Гласове  18  изпрати на приятел
Коментари  (3)  абонирай се за ASP
    Страница 4 / 5

 



Следващата функция е малко по-сложна. Преди да я разгледаме, нека изясним каква е идеята на намиране на поддърво.

   Започваме от даден възел, който се явява стартов възел. Намираме всички негови наследници (аналогично на предходната функция) и съставяме списък, съдържащ идентификаторите на току що намерените клиенти.След това намираме всички клиенти, чиито родители са в гореспоменатия списък. Списъка се нулира, в него се записват идентификаторите на новополучените клиенти и т.н.

   Функцията по-долу е точна реализация на гореописания алгоритъм. И така, да започваме:

CODE
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

  // Тук ще пазим поддървото
 
DataSet ds = new DataSet();
           
 
// Тук ще се пазят идентификаторите на последно извлечените записи
 
string parents = String.Empty;
           
 
// Указва идентификатор на запис
 
int IdParent;   
 
 
// Указател, сочещ след последния запис в "DataSet" обекта
 
int RowIndex;
               
 
// Генерираме SQL заявка за извличане на текущия възел
 
SQL = String.Format("SELECT * FROM tblTree WHERE IdClient = {0}", txtStartNode.Text.Trim());
   
 
// Създаваме обект-посредник м-у базата данни и приложението
 
OleDbDataAdapter adapter = new OleDbDataAdapter(SQL, connection);
           
 
// Запълваме "DataSet" обекта с корена на поддървото, което търсим
 
adapter.Fill(ds, "tblFinalTree");

 
// Тази запетая е необходима заради кода по-долу
 
parents = txtStartNode.Text.Trim() + ",";
           
 
// Опресняване на указателя
 
RowIndex = ds.Tables["tblFinalTree"].Rows.Count;
           
 
// Цикъл, който обхожда записите в базата данни и генерира дърво
 
while(parents.Trim() != String.Empty)
  {                   
  
// Премахва последната запетая от низа с родителите
   
parents = parents.Substring(0, parents.Length - 1);
               
  
// Динамично генерирана SQL заявка за извличане на всички клиенти, за които "IdParent" се намира в "parents"       
   
SQL = String.Format("SELECT * FROM tblTree WHERE IdParent IN ({0})", parents);
   
   
adapter = new OleDbDataAdapter(SQL, connection);
   
adapter.Fill(ds, "tblFinalTree");
               
  
// Кодът надолу генерира нов списък от родители спрямо последно извлечените записи
   
parents = String.Empty;       
   
for (int x = RowIndex; x < ds.Tables["tblFinalTree"].Rows.Count; x++)
    {
     
IdParent = Convert.ToInt32(ds.Tables["tblFinalTree"].Rows[x]["IdClient"]);
     
parents += String.Format("{0},", Convert.ToString(IdParent));
   
}
               
  
// Опресняване на указателя
   
RowIndex = ds.Tables["tblFinalTree"].Rows.Count;
 
}

 
// "Посочваме" откъде "grdNextLevel" да вземе данните
 
grdTree.DataSource = ds.Tables["tblFinalTree"].DefaultView;
           
 
// Реалната точка на запълване на данните
 
grdTree.DataBind();

   Този алгоритъм е прост, но но точно тази реализация е крайно неефективна за големи набори от данни, защото:

   1) Обектът "DataSet" извлича всички записи и ги пази в паметта на локалната машина (това е равносилно на син екран или най-малкото компютъра ще заспи, ако го пробвате с 10 000+ записа).

   2) Линейността на алгоритъма (+) се компенсира от факта, че колокто е по-широко дървото, толкова по-бавно се извличат данните за всяка следваща итерация (-).

   3) Нямаме достъп до всеки елемент поотделно, записите се разглеждат "на нива". Това е като плюс, така и минус. Защото понякога е необходим анализ дали точно даден възел да бъде включен в дървото или не!

   4) Скоростта на "MS-Access" не е от най-задоволителните.

   5) Не е предвиден вариант за извличане на поддърво до определено ниво надолу.

   За да се решат тези проблеми е необходимо да се използва по-качествана база данни (не е задължително да е MS-SQL), да се създаде функция, която да приема като параметри входящ възел и броя нива, които трабва да се извлекат от базата данни. Функцията трябва да връщя като резултат динамично генерирана таблица, съдържаща поддървото.

   Следващата стъпка е да се напише съхранена процедура, която вътрешно да извиква функцията. Резултатът трябва да е същата таблица, която връща функцията, най-много с леки изменения (например не винаги желаем крайната таблица да съдържа началния възел).

   Последната стъпка е да въведем ASP.NET код, който да изпълни съхранената процедура на DB сървъра и да отчете крайния резултат.

   Тъй като целта на този урок е повече демонстрационна, не смятам, че е необходимо да излагам подробности по имплементацията на функцията и съхранената процедура, но ако някой има желание, нека даде мнението си за урока и ще публиувам урок "за напреднали дървета" :)



 << Предишна страница Следваща страница >> 


Ключови думи: asp бази данни ms sql server


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 За автора: futureweb  
Иван Давидов е професионален програмист, специализирал в разработката на интернет базирани приложения. Работи като програмист във фирма "Tumbleweed Communications" гр. София. Ivan Deyanov Davidov davidov.i[[a.t]]gmail[[d.o.t]]com Tel: +359 889 357 125
   
 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

"using System.Data.OleDb;    // За MS-SQL базирани системи"

Е за MS Access предполагам от пастването е стнала грешката

  Filip_n на 19.02.2008 10:58

Скрипта иначе е готин упсях да си го едитна за visual studio 2005 

  ritch на 27.04.2007 12:07

Исках да попитам от каде мога да намеря базата данни която е използвана ?

  ritch на 27.04.2007 12:05

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008