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

狮子

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

我首先查询福彩12选5走势图库以获取特定主题的所有模块的列表

C#:
comboBoxDatabaseConnection.Open();
                using (SqlCommand cmdInsertStudyHistory = new SqlCommand("select ModuleNumber,ModuleName,ModuleCode from Modules where [email protected]  和  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();
                }
我收到一个错误消息,说已经有一个开放的福彩12选5走势图读取器。我认为是因为当我打这条线时"InsertStudyHistory(comboBoxDatabaseConnection,studentModule);",福彩12选5走势图读取器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,501
地点
悉尼,澳大利亚
编程经验
10+
The quickest 和 easiest way is 至 enable MARS (Multiple Active Result Sets) in your connection string. The best way would be 至 restructure your code so you don't even need 至 retrieve any data into your app. I don't see why you shouldn't be able 至 do the whole lot in SQL. Without having looked 至 o closely, instead of using a VALUES clause in an INSERT statement, you can use a query 和 insert data selected directly from one or more other tables. You should be able 至 move the lot with a single call 至 ExecuteNonQuery. If you weren't going 至 do that, the next best option would be 至 use a SqlDataAdapter 和 call 至 retrieve all the data into a 福彩12选5走势图表 和 then call Update 至 save it all back again.
 
Last edited:

跳伞

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

狮子

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

金西尼

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