在 C# 中自动执行树遍历
本文关键字:执行 遍历 | 更新日期: 2023-09-27 18:36:20
美好的一天,朋友们!目前,我正在研究这个数据库模型设计,称为修改的预序树遍历(MPTT)。在看到使用公用表表达式 (CTE) 的缺点(由于其质量性能较差)之后,我找到了使用 MPTT 的建议。但在使用 MPTT 的优势之前,我需要通过添加"右"和"左"节点值来重新设计我的数据库表。为此,我需要创建一个程序来自动化和更新表中每个数据的值。我的问题是我无法制作一个自动执行节点值的程序。我正在尝试将 php 语言转换为 C# 代码,但我无法做到。我在编程方面的弱点之一是创建"递归"方法。
我使用此链接作为参考。分层数据库模型
这是我尝试转换为 C# 的代码
<?php
function rebuild_tree($parent, $left) {
// the right value of this node is the left value + 1
$right = $left+1;
// get all children of this node
$result = mysql_query('SELECT title FROM tree '.
'WHERE parent="'.$parent.'";');
while ($row = mysql_fetch_array($result)) {
// recursive execution of this function for each
// child of this node
// $right is the current right value, which is
// incremented by the rebuild_tree function
$right = rebuild_tree($row['title'], $right);
}
// we've got the left value, and now that we've processed
// the children of this node we also know the right value
mysql_query('UPDATE tree SET lft='.$left.', rgt='.
$right.' WHERE title="'.$parent.'";');
// return the right value of this node + 1
return $right+1;
}
?>
这是我
自己的代码,如果有更好的解决方案,请告诉我
int right = 0;
public int rebuild_tree(int parent, int left)
{
// the right value of this node is the left value + 1
right = left + 1;
// get all children of this node
command = conn.CreateCommand();
command.CommandText = "SELECT cat_id FROM tbl_RefDataCategory_mst WHERE parent_id=@parent";
command.Parameters.Add("parent", SqlDbType.Int).Value = parent;
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int temp = Convert.ToInt32(reader["cat_id"]);
right = rebuild_tree(temp, right);
}
command = conn.CreateCommand();
command.CommandText = "UPDATE tbl_RefDataCategory_mst SET lft=@l, rgt=@r WHERE cat_id=@p";
command.Parameters.Add("l", SqlDbType.Int).Value = left;
command.Parameters.Add("r", SqlDbType.Int).Value = right;
command.Parameters.Add("p", SqlDbType.Int).Value = parent;
command.ExecuteNonQuery();
}
return right + 1;
}