我认为最好先解释一下我的情景。
我在事务中使用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,然后获取新的ID并将其提供给用户,但我觉得必须有更有效的方法。
答案 0 :(得分:1)
如果我做对了,你的问题是插入尚未插入数据库的父模块的子记录。我有一些相同的问题,并使用SqlCommandBuilder使其工作。
为要更改的每个表创建 SqlCommandBuilder (System.Data.SqlClient)对象,将相应的sqlAdapter作为参数传递给构造函数。
它会自动创建INSERT,UPDATE和DELETE命令,并将内存中所做的所有更改都处理回数据库。
创建命令构建器对象后,只需调用"更新"在您为父表(模块)使用的数据适配器上,以及之后"更新"在子表数据适配器上。
希望这能解决它。