標籤:
本來項目需要一個tree的樹結構,後來隨便選擇了一個easyUI tree開源架構,後來碰到一個問題,我是要從資料庫遞迴出結構的,轉成json的,怎麼做?難道是遞迴了拼接StringBuilder?要是這樣做就太傻了,當時也打算這麼做。然後各種百度,部落格園,QQ群去問,回答的也是五花八門,沒人給我指點詳細的,我只好自己琢磨了。
第一:遞迴資料庫的表。
第二:序列化最後的遞迴結果。
這裡是我的資料庫的表:
然後下面是代碼:
這裡需要建立一個實體類,類的屬性跟資料庫表的一樣,只是多了一個泛型屬性,是為了儲存子物件,你想看,要是這個類的屬性有:ID,Name,ParentID(資料庫的欄位一樣)你怎麼遞迴得到父子的關係的tree?所以就多一個欄位,這個欄位就是泛型,例如我下面聲明的類叫:Tree,所以我的類裡有4個屬性:ID,Name,ParentID,item,因為在easyUI tree裡面,它的json結構是這樣的:
[{ "id":"1" , "text":"檔案夾" , "status":"open" , "children":
[{ "id":"1" , "text":"檔案夾" , "status":"open" , "children":null }]
}]
所以多這個List<Tree>就是儲存一個一模一樣的子物件,這裡我聲明item為儲存子物件。
1 public class Tree2 {3 public int ID;4 public string Name;5 public int ParentID;6 public List<Tree> item;7 }
這裡就是我寫的遞迴方法:
1 /// <summary> 2 /// 用於遍曆資料庫表中儲存上下級關係的tree結構 3 /// </summary> 4 /// <param name="ParentID">父級ID</param> 5 /// <param name="li">list對象</param> 6 /// <returns></returns> 7 protected List<Tree> Recursive(int ParentID,List<Tree> li) 8 { 9 DataSet ds_content = Sql.GetDaTa("SELECT * FROM tb_cm WHERE parentID=" + ParentID);10 if (ds_content.Tables[0].Rows.Count > 0)//判斷如果查詢到的結果不為空白,才去遞迴11 { 12 //DataSet ds_content = Sql.GetDaTa("SELECT * FROM tb_cm WHERE parentID=" + ParentID);//根據父id查詢有沒有子id13 for (int i = 0; i < ds_content.Tables[0].Rows.Count; i++)14 {15 List<Tree> lis = new List<Tree>();//聲明一個泛型用於儲存子物件,Tree是我自己建立的一個類,16 Tree t = new Tree();17 t.ID = int.Parse(ds_content.Tables[0].Rows[i][0].ToString()); 18 t.Name = ds_content.Tables[0].Rows[i][1].ToString(); 19 t.ParentID=int.Parse(ds_content.Tables[0].Rows[i][2].ToString()); 20 DataSet ds_HaveItem = Sql.GetDaTa("SELECT id FROM tb_cm WHERE parentID="+t.ID);//查詢用於判斷是否有子物件21 //三元運算子判斷大於0代表有子物件,有就返回遍曆,否則返回null22 t.item = ds_HaveItem.Tables[0].Rows.Count > 0 ? Recursive(t.ID, lis) : null;23 24 li.Add(t); 25 }26 }27 return li;28 }
這裡就是序列化,序列化就變成json格式,所以不需要sb.append("[{")這樣的去拼接字串:
1 protected void Page_Load(object sender, EventArgs e)2 {3 GridView1.DataSource = Sql.GetDaTa("select * from tb_cm");4 GridView1.DataBind();5 6 List<Tree> li = new List<Tree>();7 Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(Recursive(0, li)));8 }
這個Newtonsoft.Json.JsonConvert.SerializeObject()序列化是我去csdn看別人回答的時候提到這個,這個是別人封裝了的東西,從github下載來的,下載好了放到項目裡,在項目裡的引用那裡點擊【添加引用】,然後選擇【瀏覽】找到你的項目裡的這個dll,然後就成這樣了:
下面這個Sql是我自己建立的類,裡面返回查詢結果,你可以自己寫吧,記得在這個類的最上面引用的地方輸入:using System.Configuration;
1 public class Sql 2 { 3 static string connstr = ConfigurationManager.ConnectionStrings["connStr"].ToString(); 4 5 static SqlConnection conn = new SqlConnection(connstr); 6 7 public static DataSet GetDaTa(string sql) 8 { 9 DataSet ds = new DataSet();10 SqlDataAdapter sda = new SqlDataAdapter(sql, conn);11 sda.Fill(ds);12 13 return ds;14 }15 16 }
設定檔:
然後就運行吧:
已經輸出json格式的內容了,把它賦值到json線上編輯器看看如何?
嗯,一切正常,我就不做前台的了,你用的話自己在前台ajax請求到後台返回這個結果就行了。睡覺了,一下還要上班。。
EasyUI tree讀取sql server的表結構得到json格式