来自数据库的树视图

本文关键字:视图 数据库 | 更新日期: 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)。