做系统消息功能时,联系人列表这一块开始是后台查询数据库的方法来绑定TreeView页面控件。外观设计是区划下有部门,部门下面才是联系人的三级节点。由于区划、部门、人员各有一张表,所以在绑定TreeView时,首先查询这三张表,然后根据用户的区划和部门来确定用户的位置,用了三个循环,还有判断语句,在用户量还比较小的时候效率上还可以,但当用户量增加时,效率就有点慢,而且消息功能用的比较频繁,连续的访问数据库,加重了数据库服务器的负担。当系统稳定以后,用户数量也基本确定,就想用其它的方式来优化一下,XML能否解决这个问题?
先确定XML文档的格式,既然利用生成的XML来绑定TreeView控件,生成的文档最好能不经过逻辑判断来进行绑定TreeView控件。项目实施后,由于用户更新已经比较小,所以就想到在项目应用启动和用户资料更新时,来重新生成用户的XML数据。
设计TreeView的三级节点:
区划
部门
联系人姓名+区划
XML生成的文档格式:
<?xml version="1.0" encoding="utf-8"?>
<Linkmans>
<Area name="区划名称">
<Department name="部门名称">
<user fid="用户ID" name="用户姓名" areaname="区划(或自身区划)" />
........
</Department>
.........
</Area>
.........
</Linkmans>
完成后没有用测试工具测试,页面反应是快了许多。但是如果用户数据很大,比如超过一万或更多时,这种简单的XML文档生成方式可能就会降低,XmlReader 可以提高读取速度。
下面是根据是实现需求的代码:
1 生成XML文档的代码
DataSet areaDS = DBAccess.Query(Common.GetConnString, areaSelectSQL);//区划
DataSet departDS = DBAccess.Query(Common.GetConnString, departSelectSQL);//部门
DataSet userDS = DBAccess.Query(Common.GetConnString, selectUserSQL);//用户
string xmlPath = "~//Module//xiaoxi//LinkMan.xml";
XmlDocument linkmanXMLDoc = new XmlDocument();// 创建XmlDocument对象
XmlDeclaration xmlDec = linkmanXMLDoc.CreateXmlDeclaration("1.0", "utf-8", null);
linkmanXMLDoc.AppendChild(xmlDec);
XmlElement xmlEle = linkmanXMLDoc.CreateElement("Linkmans");//加入一个根元素
for (int i_ta = 0; i_ta < areaDS.Tables[0].Rows.Count; i_ta++)
{
string areaFid = areaDS.Tables[0].Rows[i_ta].ItemArray[0].ToString();
string areaName = areaDS.Tables[0].Rows[i_ta].ItemArray[1].ToString();// 放区划名称
XmlElement areaElement = linkmanXMLDoc.CreateElement("Area"); // 创建区划节点
areaElement.SetAttribute("name", areaName); // 设置区划节点的NAME属性
for (int i_td = 0; i_td < departDS.Tables[0].Rows.Count; i_td++)
{
string departFid = departDS.Tables[0].Rows[i_td].ItemArray[0].ToString();
string departName = departDS.Tables[0].Rows[i_td].ItemArray[1].ToString();// 放部门名称
XmlElement departElment = linkmanXMLDoc.CreateElement("Department");
departElment.SetAttribute("name", departName);
for (int i_ut = 0; i_ut < userDS.Tables[0].Rows.Count; i_ut++)
{
string userFid = userDS.Tables[0].Rows[i_ut].ItemArray[0].ToString();
string userName = userDS.Tables[0].Rows[i_ut].ItemArray[1].ToString();
string areaStr = userDS.Tables[0].Rows[i_ut].ItemArray[2].ToString();
string departStr = userDS.Tables[0].Rows[i_ut].ItemArray[3].ToString();
string areaNewName = userDS.Tables[0].Rows[i_ut].ItemArray[4].ToString();
if (areaStr.Equals(areaFid) && departStr.Equals(departFid))
{
XmlElement userElement = linkmanXMLDoc.CreateElement("user");
userElement.SetAttribute("fid", userFid);
userElement.SetAttribute("name", userName);
userElement.SetAttribute("areaname", areaNewName);
departElment.AppendChild(userElement);
}
}
areaElement.AppendChild(departElment);
}
xmlEle.AppendChild(areaElement);
}
linkmanXMLDoc.AppendChild(xmlEle);
try
{
linkmanXMLDoc.Save(HttpContext.Current.Server.MapPath(xmlPath));//保存
}
catch (Exception xmlException)
{
Console.WriteLine(xmlException.ToString());
}
2 读取XML文档的代码
XmlDocument readXMLDoc = new XmlDocument();
string xmlPath = "~//Module//xiaoxi//LinkMan.xml";
try
{
readXMLDoc.Load(HttpContext.Current.Server.MapPath(xmlPath));
}
catch (XmlException xmlEx)
{
Response.Write(xmlEx.ToString());
}
XmlNodeList areaNodeList = readXMLDoc.GetElementsByTagName("Area");
for (int i = 0; i < areaNodeList.Count; i++)
{
string areaName = areaNodeList[i].Attributes["name"].Value;
TreeNode areaTVNode = new TreeNode(areaName);
areaTVNode.NavigateUrl = "#";
addressBookList.Nodes.Add(areaTVNode);
XmlNodeList departNodeList = areaNodeList[i].ChildNodes;
foreach (XmlNode departNode in departNodeList)
{
string departName = departNode.Attributes["name"].Value;
TreeNode departTVNode = new TreeNode(departName);
departTVNode.NavigateUrl = "#";
areaTVNode.ChildNodes.Add(departTVNode);
XmlNodeList userNodeList = departNode.ChildNodes;
foreach (XmlNode userNode in userNodeList)
{
string userid = userNode.Attributes["fid"].Value;
string username = userNode.Attributes["name"].Value;
string areaNewName = userNode.Attributes["areaname"].Value;
TreeNode userTVNode = new TreeNode(areaNewName + "_" + username, userid);
userTVNode.NavigateUrl = "javascript:fillReceiver('" + username + "','" + userid + "')";
departTVNode.ChildNodes.Add(userTVNode);
}
}
}