【问题标题】:SQL Data reader with Update for treeview带有树视图更新的 SQL 数据阅读器
【发布时间】:2019-06-27 18:16:07
【问题描述】:

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

有父子关系,但都在一张表中。

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

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

表结构:

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

【问题讨论】:

    标签: c# sql-server sqldatareader


    【解决方案1】:

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

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

    • 从所有级别开始为 null
    • 批量更新级别为 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 值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      相关资源
      最近更新 更多