我在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();
}
}
答案 0 :(得分:0)
这种方法行不通。您的读者不会看到由您的更新执行的更新。
一种简单的方法是进行一组迭代的更新。说
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
这一切都可以在一个SQL命令中完成,最后一步的循环将检查语句后的@@ rowcount值