从一个表中读取并插入另一个表中

狮子

知名会员
已加入
2018年11月29日
留言内容
52
编程经验
Beginner
你好
我正在忙于我的学生应用程序,其中一个主题由一个或多个模块组成。
我有一个数据库表,按模块所属的科目对模块进行分组,因此,在添加学生并为某个科目注册时,应将该科目的所有模块添加到他们的个人资料中。

我首先查询数据库以获取特定主题的所有模块的列表

C#:
comboBoxDatabaseConnection.Open();
                using (SqlCommand cmdInsertStudyHistory = new SqlCommand("select ModuleNumber,ModuleName,ModuleCode from Modules where [email protected] and Archived = '0'", comboBoxDatabaseConnection))
                {
                    cmdInsertStudyHistory.Parameters.AddWithValue("@subjectNumber", studentCourseSubject);
                    SqlDataReader rdrSelectedStudentModule = cmdInsertStudyHistory.ExecuteReader();

                    if (rdrSelectedStudentModule.HasRows)
                    {
                        while (rdrSelectedStudentModule.Read())
                        {
                            studentModule = rdrSelectedStudentModule["ModuleNumber"].ToString();
                            studentModuleName = rdrSelectedStudentModule["ModuleName"].ToString();
                            studentModuleCode = rdrSelectedStudentModule["ModuleCode"].ToString();
                           InsertStudyHistory(comboBoxDatabaseConnection,studentModule);
                            
                        }
                    }

                    rdrSelectedStudentModule.Close();
                    comboBoxDatabaseConnection.Close();
                }
我收到一个错误消息,说已经有一个开放的数据读取器。我认为是因为当我打这条线时"InsertStudyHistory(comboBoxDatabaseConnection,studentModule);",数据读取器rdrSelectedStudentModule仍处于打开状态。我不确定如何解决这个问题
我有用于InsertStudyHistory的代码
C#:
public void InsertStudyHistory(SqlConnection comboBoxDatabaseConnection, string studentModule)
        {
          
            using (SqlCommand cmdInsertStudyHistory = new SqlCommand("insert into StudentModule (StudentNumber,CourseNumber,CourseName,SubjectNumber,SubjectName,ModuleNumber,ModuleCode,ModuleName) " +
                        "VALUES (@StudentNumber,@CourseNumber,@CourseName,@SubjectNumber,@SubjectName,@ModuleNumber,@ModuleCode,@ModuleName)", comboBoxDatabaseConnection))
            {
                cmdInsertStudyHistory.Parameters.Add(new SqlParameter("@StudentNumber", System.Data.SqlDbType.NVarChar, 50, "StudentNumber"));
                cmdInsertStudyHistory.Parameters["@StudentNumber"].Value = selectedStudentNumber;
                cmdInsertStudyHistory.Parameters.Add(new SqlParameter("@CourseNumber", System.Data.SqlDbType.NVarChar, 50, "CourseNumber"));
                cmdInsertStudyHistory.Parameters["@CourseNumber"].Value = selectedStudentSubject;
                cmdInsertStudyHistory.Parameters.Add(new SqlParameter("@CourseName", System.Data.SqlDbType.NVarChar, 250, "CourseName"));
                cmdInsertStudyHistory.Parameters["@CourseName"].Value = editStudentSubjectProgrammeComboBox.Text.ToString();
                cmdInsertStudyHistory.Parameters.Add(new SqlParameter("@SubjectNumber", System.Data.SqlDbType.NVarChar, 50, "SubjectNumber"));
                cmdInsertStudyHistory.Parameters["@SubjectNumber"].Value = editStudentSubjectComboBox.SelectedValue.ToString(); ;
                cmdInsertStudyHistory.Parameters.Add(new SqlParameter("@SubjectName", System.Data.SqlDbType.NVarChar, 250, "SubjectName"));
                cmdInsertStudyHistory.Parameters["@SubjectName"].Value = editStudentSubjectComboBox.Text.ToString();
                cmdInsertStudyHistory.Parameters.Add(new SqlParameter("@ModuleNumber", System.Data.SqlDbType.NVarChar, 50, "ModuleNumber"));
                cmdInsertStudyHistory.Parameters["@ModuleNumber"].Value = studentModule;
                cmdInsertStudyHistory.Parameters.Add(new SqlParameter("@ModuleCode", System.Data.SqlDbType.NVarChar, 50, "ModuleCode"));
                cmdInsertStudyHistory.Parameters["@ModuleCode"].Value = studentModuleCode;


                cmdInsertStudyHistory.Parameters.Add(new SqlParameter("@ModuleName", System.Data.SqlDbType.NVarChar, 250, "ModuleName"));
                cmdInsertStudyHistory.Parameters["@ModuleName"].Value = studentModuleName;
                cmdInsertStudyHistory.ExecuteNonQuery();
            }
            comboBoxDatabaseConnection.Close();


        }
            
        }

任何帮助将不胜感激
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
The quickest and easiest way is to enable MARS (Multiple Active Result Sets) in your connection string. The best way would be to restructure your code so you don't even need to retrieve any data into your app. I don't see why you shouldn't be able to do the whole lot in SQL. Without having looked too closely, instead of using a VALUES clause in an INSERT statement, you can use a query and insert data selected directly from one or more other tables. You should be able to move the lot with a single call to ExecuteNonQuery. If you weren't going to do that, the next best option would be to use a SqlDataAdapter 和 call 充满 到 retrieve all the data into a 数据表 和 then call Update 到 save it all back again.
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,538
地点
弗吉尼亚州切萨皮克
编程经验
10+
我有一个数据库表,按模块所属的科目对模块进行分组,因此,在添加学生并为某个科目注册时,应将该科目的所有模块添加到他们的个人资料中。
每个学生只有一张桌子是非常糟糕的数据库设计。是时候学习外键和联接了。
 

狮子

知名会员
已加入
2018年11月29日
留言内容
52
编程经验
Beginner
感谢您对SqlDataAdapter的建议。我在应用程序的其他部分中使用了它,因此我将对其进行研究。我没有每个学生一张桌子。我有一个学生表,该表列出了所有学生的个人详细信息,并为他们分配了学生号。然后,我有一张表格,列出了所有学生的所有模块。这是一张列出所有学生并以学生编号为外键的表,并为其分配了模块。多谢您的协助,不胜感激
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
感谢您对SqlDataAdapter的建议。我在应用程序的其他部分中使用了它,因此我将对其进行研究。
要记住的一件事是,当您打电话时 充满 ,它将隐式调用 接受变更 数据表 。这意味着似乎没有要保存的更改,如果您随后想要将该数据插入到另一个表中,那就不好了。在这种情况下, 接受更改 错误的 和所有 行状态 将会留存 添加 ,准备插入行。请注意,您可以同时使用单个数据适配器。这 选择命令 插入命令 不必在同一张桌子上工作。
 
最佳 底部