c# - 比较DataRows,动态添加表值

标签 c# mysql sql

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

我在事务中使用 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/

相关文章:

OSX 10.8.2 上的 Python 2.7 的 MySQLdb 和两者都是 64 位

mysql - 表格中的电子邮件验证存在问题

c# - Const 与 protected 静态只读

c# - Nuget 安装失败

php - 无法使用 Laravel Eloquent 的现有表

PHP 显示从给定时间到特定事件的小时数

c# - 抛出异常停止进程

c# - 我可以检查某个文件是否存在于 URL 中吗?

android - 如何删除 SQLITE 数据库中的第一行?

mysql - 自动加密varchar MySQL