程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> SQL Server存儲的層級數據讀出成樹顯示

SQL Server存儲的層級數據讀出成樹顯示

編輯:更多數據庫知識

前兩天我們介紹了一種新的存儲無限級分類方法,但是讀出分類的時候怎麼實現樹形顯示呢?方法很簡單,我們自己定義一個樹形的數據結構,然後根據數據庫存儲的節點的深度來插入到樹裡面,當然顯示的時候需要用遞歸來顯示一下,不過這裡的遞歸只是在內存裡面遞歸,效率是相當高的。

 

在數據庫讀出數據的時候直接按照 LID 來進行 ASC 排序就可以了,默認的排列順序就是按照樹走的,大家可以插入一些數據,並讀取一下就可以很明了的看到順序了,插入樹循環的時候只需要對深度進行運算就可以了。

下面我只寫出了一些關鍵地方的代碼,具體的代碼自己試著多寫寫在紙上多畫畫應該就明白了。

另外就是想說下,這種分類算法只適用於一般的樹形分類,並不適用於插入數據比較頻繁的樹形結構,比如說無限次回復的評論,無限次回復的評論有另外一種更適合的算法。

首先我們定義一個樹形的數據結構:

  1. public class ZoneList  
  2. {  
  3.     private readonly ZoneList _Parent = null;  
  4.     private readonly List<ZoneList> _Childs = new List<ZoneList>();  
  5.     private readonly ZoneItem _Value = null;  
  6.  
  7.     public ZoneList Parent { get { return _Parent; } }  
  8.  
  9.     public List<ZoneList> Childs { get { return _Childs; } }  
  10.  
  11.     public ZoneItem Value { get { return _Value; } }  
  12.  
  13.     public ZoneList Root  
  14.     {  
  15.         get 
  16.         {  
  17.             ZoneList curNode = this;  
  18.             while (curNode.Parent != null)  
  19.             {  
  20.                 curNode = curNode.Parent;  
  21.             }  
  22.             return curNode;  
  23.         }  
  24.     }  
  25.  
  26.     public ZoneList() { }  
  27.  
  28.     public ZoneList(ZoneItem value, ZoneList parent)  
  29.     {  
  30.         _Value = value;  
  31.         _Parent = parent;  
  32.     }  
  33.  
  34.     public ZoneList AddChild(ZoneItem value)  
  35.     {  
  36.         ZoneList nZoneList = new ZoneList(value, this);  
  37.         _Childs.Add(nZoneList);  
  38.         return nZoneList;  
  39.     }  

然後讀取數據庫並插入到樹:

  1. public ZoneList Select()  
  2. {  
  3.     ZoneList oZoneList = new ZoneList();  
  4.     ZoneItem oZoneItem;  
  5.  
  6.     Int32 intDee = 0;  
  7.  
  8.     SqlDataReader oData = SiteSQL.ExecuteReader("ZoneSelect");  
  9.     while (oData.Read())  
  10.     {  
  11.         oZoneItem = new ZoneItem();  
  12.         oZoneItem.ID = oData.GetInt32(0);  
  13.         oZoneItem.Tree = oData.GetInt32(1);  
  14.         oZoneItem.Name = oData.GetString(2);  
  15.         intDee = intDee - oZoneItem.Tree;  
  16.  
  17.         for (Int32 intI = 0; intI <= intDee; intI++)  
  18.         {  
  19.             oZoneList = oZoneList.Parent;  
  20.         }  
  21.  
  22.         oZoneList = oZoneList.AddChild(oZoneItem);  
  23.  
  24.         intDee = oZoneItem.Tree;  
  25.     }  
  26.     oData.Close();  
  27.     return oZoneList.Root;  

顯示的時候直接用遞歸就可以了:

  1. private void ZoneOutWrite(ZoneList oZoneList)  
  2. {  
  3.     foreach (ZoneList oZoneNode in oZoneList.Childs)  
  4.     {  
  5.         Response.Write(String.Format("<li id=\"zv_{0}\"><span id=\"zName_{0}\">{1}</span>", oZoneNode.Value.ID, oZoneNode.Value.Name));  
  6.  
  7.         if (oZoneNode.Childs.Count > 0)  
  8.         {  
  9.             Response.Write("<ul>");  
  10.             ZoneOutWrite(oZoneNode);  
  11.             Response.Write("</ul>");  
  12.         }  
  13.         Response.Write("</li>");  
  14.     }  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved