来自数据库的树视图
本文关键字:视图 数据库 | 更新日期: 2023-09-27 18:33:30
我有一个数据库表(名为PatientDetails),其中包括以下列:
PatientId not null,
title,
sex,
lastname,
birthday,
firstname,
middlename,
remarkline,
remarks
通过使用上表,我希望PatientId
Parent
,子节点firstname
C# 中的TreeView
。我该怎么做?
我做了一些代码隐藏,如下所示:
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = RunQuery("select PatientId,firstname from PatientDetails");
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
TreeNode root = new TreeNode(
ds.Tables[0].Rows[i][1].ToString(),
ds.Tables[0].Rows[i][0].ToString());
root.SelectAction = TreeNodeSelectAction.Expand;
CreateNode(root);
TVPatArc.Nodes.Add(root);
}
}
void CreateNode(TreeNode node)
{
DataSet ds = RunQuery("Select PatientId,firstname "
+ "from PatientDetails where PatientId ="
+ node.Value);
if (ds.Tables[0].Rows.Count == 0)
{
return;
}
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
TreeNode tnode = new TreeNode(
ds.Tables[0].Rows[i][1].ToString(),
ds.Tables[0].Rows[i][0].ToString());
tnode.SelectAction = TreeNodeSelectAction.Expand;
node.ChildNodes.Add(tnode);
CreateNode(tnode);
}
}
DataSet RunQuery(String Query)
{
DataSet ds = new DataSet();
String connStr = "Data Source=LOCALHOST''SQLEXPRESS;"
+ "Initial Catalog=MyDatabase;"
+ "User ID=sa;Password=sa";
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand objCommand = new SqlCommand(Query, conn);
SqlDataAdapter da = new SqlDataAdapter(objCommand);
da.Fill(ds);
da.Dispose();
}
return ds;
}
但是CreateNode(tnode);
行它给出了System.StackOverflowException
.我认为这是由于无限循环。但我不确定。
为什么需要多次命中数据库? 如果要从同一记录构造父项和子项?
在页面加载时尝试这样
DataSet ds = RunQuery("select PatientId,firstname from PatientDetails");
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
TreeNode root = new TreeNode(ds.Tables[0].Rows[i]["ID"].ToString(), ds.Tables[0].Rows[i]["ID"].ToString());
root.SelectAction = TreeNodeSelectAction.Expand;
TreeNode child = new TreeNode(ds.Tables[0].Rows[i]["ID"].ToString(), ds.Tables[0].Rows[i]["FirstName"].ToString());
root.ChildNodes.Add(child);
TVPatArc.Nodes.Add(root);
}
如果您查看查询,您将无限期地检索相同的患者:
RunQuery("选择 PatientId,名字来自 PatientDetails,其中 PatientId =" + 节点。值);
我建议更改查询以按其父级检索患者,如果数据库中的字段是 ParentPatientId,则使用:
RunQuery("Select PatientId,firstname from PatientDetails where ParentPatientId =" + node.值);
顺便说一下,这是非常低效的,因为您将为每个患者启动至少一个查询,如果您有一百万个患者,那么您将启动至少一百万个查询。最好在单个查询中检索所有内容(按 ParentPatientId 排序),然后从结果生成树。如果您使用的是 Oracle,您还有 DML 命令来帮助您构建树(CONNECT BY 和 START WITH)。