比较DataRows,动态添加表值

时间:2014-04-29 10:54:27

标签: c# mysql sql

我认为最好先解释一下我的情景。

我在事务中使用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并将其提供给用户,但我觉得必须有更有效的方法。

1 个答案:

答案 0 :(得分:1)

如果我做对了,你的问题是插入尚未插入数据库的父模块的子记录。我有一些相同的问题,并使用SqlCommandBuilder使其工作。

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

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

创建命令构建器对象后,只需调用"更新"在您为父表(模块)使用的数据适配器上,以及之后"更新"在子表数据适配器上。

希望这能解决它。