我认为最好先解释一下我的场景。
我在事务中使用 SqlDataAdapters 从 SQL 数据库取回所有数据。
举个例子,我有一所大学。我想开设这所学院并添加模块,同时我希望将学生添加到这些新模块中。
这些模块和学生保存到各自的数据表中,学生表有一列与其父模块“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();
}
我试图循环遍历所有添加的用户,如果数据行与赋予它新的 moduleid 之前的数据行相同,则获取新的 id 并将其提供给用户,但是我觉得必须有一个更有效的方法来做到这一点。
最佳答案
如果我理解正确,那么您的问题是为尚未插入数据库的父模块插入子记录。我遇到了同样的问题,并且使用 SqlCommandBuilder 使其工作。
为要更改的每个表创建 SqlCommandBuilder (System.Data.SqlClient) 对象,并将相应的 sqlAdapter 作为参数传递给构造函数。
它自动创建 INSERT、UPDATE 和 DELETE 命令,并将内存中所做的所有更改处理回数据库。
创建命令生成器对象后,只需在父表(模块)的数据适配器上调用“Update”,然后在子表数据适配器上调用“Update”即可。
希望这能解决这个问题。
关于c# - 比较DataRows,动态添加表值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23362628/