SQL 数据 reader 树视图更新

SQL Data reader with Update for treeview

我在 SQL Express 中有一个 table,其中包含一些在 TreeView 类型场景中使用的数据。

它有父子关系,但它是一体的table。

我的目标是设置缩进级别值,我的想法是 select 数据,使用 reader 从第一条记录开始。它没有父级,所以级别保持为 0,如果记录有父级,它必须检查父级的缩进值,然后加 1。

我的问题是所有级别一开始都是 0,当它运行我的代码时,它在第二条记录上将缩进级别设置为 1,但是当它记录到第三条时,它显示了父级的级别三仍然是 0。即使我更新了它,当我查看 table 时它被设置为 1。似乎我的 select 已经将数据存储在 reader 中。

Table结构:

using (SqlConnection connection = new SqlConnection("Data Source=" + servername + "; MultipleActiveResultSets = true;Initial Catalog=" + database + "; Integrated Security=SSPI"))
{
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM relationship", connection))
    {
        connection.Open();

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            // Check is the reader has any rows at all before starting to read.
            if (reader.HasRows)
            {
                // Read advances to the next row.
                while (reader.Read())
                {
                    int sid = reader.GetInt32(1);

                    //GET THE CURRENT LEVEL OF THE RECORD
                    int slevel = reader.GetInt32(4); /* THIS SECTION IS NOT SELECTING THE CURRENT DATA THAT WAS UPDATED IN MY UPDATE BELOW*/

                    //ADD TO CURRENT LEVEL
                    int newslevel = slevel + 1;

                    MessageBox.Show("MY ID IS " + sid + " MY LEVEL IS " + slevel);

                    using (SqlCommand upd = new SqlCommand("UPDATE relationship SET level=@newlevel WHERE parent_id_ref=@sid", connection))
                    {
                        upd.Parameters.AddWithValue("@sid", sid);
                        upd.Parameters.AddWithValue("@newlevel", newslevel);
                        int rows = upd.ExecuteNonQuery();
                    }
                }
            }
        }
        connection.Close();
    }
}

这种方法行不通。您的 reader 不会看到您的更新执行的更新。

一种简单的方法是进行一组迭代更新。说,

  • 从所有级别开始为空
  • 将级别批量更新为 0,其中 "parent_id = parent_id_ref"
update relationship set level = 0 where parent_id = parent_id_ref
  • 批量更新 children 任何 parent 已经设置了级别
update relationship set level = parent.level + 1
from relationship child inner join relationship parent on parent.parent_id = child.parent_id_ref
where parent.level is not null and child.level = 0
  • 重复前面的语句,直到一次迭代影响的行数为 0。

这一切都可以在单个 SQL 命令中完成,最后一步循环检查语句后的 @@rowcount 值