比较DataRows,动态添加表值
本文关键字:添加 动态 DataRows 比较 | 更新日期: 2023-09-27 18:00:48
我认为最好先解释一下我的场景。
我在事务中使用SqlDataAdapters从sql数据库中取回所有数据。
举个例子,我有一所大学。我想开设这所学院,增加模块,同时我想增加这些新模块的学生。
这些模块和学生被保存到各自的DataTable中,学生表有一列与其父模块"moduleid"相关。
我的问题是,我需要一种方法将这两者保存在同一事务中,将新的moduleid添加到它的子行中。我可以创建新的模块,它们自己在数据表中的moduleid也会更新,但是,当我现在需要将学生保存到这个模块时,我需要添加它的moduleid,否则它会被添加到数据库中而没有模块。
到目前为止,这是我的努力,但我觉得我找错地方了。
DataTable dt_new_modules = ds_College.Tables["module"].GetChanges(DataRowState.Added);
da_modules.Update(ds_College.Tables["module"]);
ds_College.Tables["module"].AcceptChanges();
DataTable dt_added = ds_College.Tables["student"].GetChanges(DataRowState.Added);
if (dt_added != null)
{
if (dt_new_modules != null)
{
foreach (DataRow new_module in dt_new_modules.Rows)
{
foreach (DataRow updated_module in ds_College.Tables["module"].Rows)
{
if (updated_module.Equals(new_module))
{
foreach (DataRow new_student in dt_added.Rows)
{
if ((int)new_student["moduleid"] == (int)new_module["moduleid"])
new_student["moduleid"] = (int)updated_module["moduleid"];
}
}
}
}
}
da_student.Update(dt_added);
dt_added.AcceptChanges();
}
DataTable dt_modified = ds_College.Tables["student"].GetChanges(DataRowState.Modified);
if (dt_modified != null)
{
da_student.Update(dt_modified);
dt_modified.AcceptChanges();
}
我正在尝试循环浏览所有添加的用户,如果数据行与之前的数据行相同,则获得新的模块id并将其提供给用户,但我觉得必须有更有效的方法来做到这一点。
如果我做对了,您的问题是为尚未插入数据库的父模块插入子记录。我也遇到了同样的问题,使用SqlCommandBuilder使其正常工作。
为要更改的每个表创建SqlCommandBuilder(System.Data.SqlClient)对象,并将相应的sqlAdapter作为参数传递给构造函数。
它自动创建INSERT、UPDATE和DELETE命令,并将处理内存中对数据库所做的所有更改。
创建命令生成器对象后,只需在父表(模块)的数据适配器上调用"Update",然后在子表数据适配器上单击"Update"。
希望这能解决问题。