具有针对树状视图的更新的SQL数据读取器

时间:2019-06-27 09:30:46

标签: c# sql-server sqldatareader

我在SQL Express中有一个表,其中包含一些在TreeView类型方案中使用的数据。

它具有父子关系,但都在一个表中。

我的目的是设置一个缩进级别值,我的想法是选择数据,使用阅读器从第一条记录开始。它没有父级,因此级别保持为0,如果记录具有父级,则必须检查父级的缩进值,然后添加1。

我的问题是开始时所有级别均为0,当它运行我的代码时,它在第二条记录上将缩进级别设置为1,但是当它记录三时,它显示三级的父级为仍然为0。即使我更新了它,并且当我在表中查找时,它也被设置为1。看来我的选择已经将数据存储在读取器中。

表结构:

image

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();
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

  • 从所有级别开始为空
  • 批量更新级别为0,其中“ parent_id = parent_id_ref”
update relationship set level = 0 where parent_id = parent_id_ref
  • 批量更新已设置其级别的任何父母的孩子
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值