比较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并将其提供给用户,但我觉得必须有更有效的方法来做到这一点。

比较DataRows,动态添加表值

如果我做对了,您的问题是为尚未插入数据库的父模块插入子记录。我也遇到了同样的问题,使用SqlCommandBuilder使其正常工作。

为要更改的每个表创建SqlCommandBuilder(System.Data.SqlClient)对象,并将相应的sqlAdapter作为参数传递给构造函数。

它自动创建INSERT、UPDATE和DELETE命令,并将处理内存中对数据库所做的所有更改。

创建命令生成器对象后,只需在父表(模块)的数据适配器上调用"Update",然后在子表数据适配器上单击"Update"。

希望这能解决问题。