日前遇到很多朋友提起怎么将数据库中的关联表缓存到xml文档,以及怎样再从xml读取缓存数据的问题。
我简单写了一个例子,可以参考。
首先 数据库中有两个表,一个是用户表,一个是用户奖罚记录表,奖罚表中记录了每个用户的奖罚情况,并记录用户id(userid)用于和用户表关联。GetDataFromDataBase方法是从数据库获得数据的方法。
public void WriteUserDataToXml()
{
string sql = "select top 100 * from Users";
GetDataFromDataBase(sql);
string result = "<?xml version=/"1.0/" encoding=/"utf-8/" ?>/r/n";
result += "<Results>/r/n";
result += "<users>/r/n";
string result2 = "<awards>/r/n";
for (int i = 0; i < dt.Rows.Count; i++)
{
result += "<user id=/"" + dt.Rows[i][0].ToString() + "/" userid=/"" + dt.Rows[i][1].ToString() + "/">" + dt.Rows[i][2].ToString() + "</user>/r/n";
result2 += WriteUserAwardDataToXml(dt.Rows[i][1].ToString());
}
result2 += "</awards>/r/n";
result += "</users>/r/n";
result += result2;
result += "</Results>/r/n";
File.WriteAllText(Server.MapPath("~/ddd.xml"), result);
}
上面的这个方法用户插入xml文档用户表中前100行的数据,由于不同的用户要从奖罚表中根据userid读取不同的记录,所以我们用result2来保存这个数据,等到users节点插入完成以后,
再插入awards节点记录用户奖惩情况。
上面方法调用的WriteUserAwardDataToXml方法如下
public string WriteUserAwardDataToXml(string userid) { string sql = "select * from Award where userid='" + userid+"'"; GetDataFromDataBase(sql); string result = ""; for (int i = 0; i < dt.Rows.Count; i++) { result += "<award userid=/""+userid+"/">" + dt.Rows[i][4].ToString() + "</award>/r/n"; } return result; }
----------------以下是读取xml文档内容并赋值给treeview------------
public void GetUserDataFromXml() { XmlDocument myxml = new XmlDocument(); myxml.Load(Server.MapPath("~/ddd.xml")); XmlNodeList mynotes = myxml.SelectNodes("/Results/users/user"); for (int i = 0; i < mynotes.Count; i++) { addnote(TreeView1.Nodes[0].ChildNodes, mynotes[i].InnerText); GetUserAwardFromXml(mynotes[i].Attributes["userid"].Value.ToString(), i); } }
上面的方法先读取user节点下的值,并把这些值添加在treeview中,然后通过传值给GetUserAwardFromXml方法
查看是否该用户有奖罚记录。GetUserAwardFromXml方法如下。
public void GetUserAwardFromXml(string userid,int noteindex) { XmlDocument myxml = new XmlDocument(); myxml.Load(Server.MapPath("~/ddd.xml")); XmlNodeList mynotes = myxml.SelectNodes("/Results/awards/award"); for (int i = 0; i < mynotes.Count; i++) { if(mynotes[i].Attributes["userid"].Value==userid) { addnote(TreeView1.Nodes[0].ChildNodes[noteindex].ChildNodes, mynotes[i].InnerText); } } }
这个方法中,发现有用户的奖罚记录就会在该节点下添加一个子节点,以上两个方法中调用的addnote方法如下
public void addnote(TreeNodeCollection mytreenodecolletion, string mytreenotetext) { TreeNode mytreenote = new TreeNode(mytreenotetext); mytreenodecolletion.Add(mytreenote); }
这个例子到这里就结束了,采用xml缓存数据库不易更换的数据可以减轻数据库压力,当然这只是减小压力的方法之一。
本文由keyake原创。