Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入多对多数据库?_C#_Sql_Many To Many_Relational Database - Fatal编程技术网

C# 插入多对多数据库?

C# 插入多对多数据库?,c#,sql,many-to-many,relational-database,C#,Sql,Many To Many,Relational Database,伙计们,我正在尝试学习多对多关系数据库,但在“link/junction”表中插入数据时遇到了麻烦。 这就是我的数据库的外观: 现在,由于我的应用程序是C#中的windows桌面应用程序,因此我有一个简单的表单,其中有5个文本框和一个按钮,如下所示: 注:图2-红色代表文本框名称,蓝色代表我将输入的数据类型。Engineered 1、2和3已存在于表tblenginer中 现在按add,我想在表tblTicketDetail中输入Date和Phone Number的值,在表tblTicket

伙计们,我正在尝试学习多对多关系数据库,但在“link/junction”表中插入数据时遇到了麻烦。 这就是我的数据库的外观:

现在,由于我的应用程序是C#中的windows桌面应用程序,因此我有一个简单的表单,其中有5个文本框和一个按钮,如下所示:

注:图2-红色代表文本框名称,蓝色代表我将输入的数据类型。Engineered 1、2和3已存在于表
tblenginer


现在按add,我想在表
tblTicketDetail
中输入
Date
Phone Number
的值,在表
tblTicket\u Engineer
中输入
engineerinid 1
engineerinid 2
engineerinid 3
的值。表
tblEngineer
中已经有一些行

现在,如果我在tblTicket_Engineer中只输入一个EngineerID,我会在单击“添加”按钮时执行此操作:

查看表
tblTicket\u Engineer
中的外键,并告诉我外键是否正确

如何在表
tblTicket\u Engineer
中一次输入3行? 这就是我想在按下add按钮时在
tblTicket\u Engineer
中发生的情况(对于此图像,值是手动输入的)


您可以使用
UNION ALL
。试着这样做:

        string statement1 = @"INSERT INTO tblTicket_Engineer(TicketID,EngineerID) 
                        SELECT @ID,@EID1 UNION ALL
                        SELECT @ID,@EID2 UNION ALL
                        SELECT @ID,@EID3";
        using (SqlCommand command1 = new SqlCommand(statement1))
        using (SqlConnection connection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["ST"].ConnectionString.ToString()))
        {

            command1.Parameters.AddWithValue("@ID", PID);
            command1.Parameters.AddWithValue("@EID1", comboBox1.SelectedValue);
            command1.Parameters.AddWithValue("@EID2", comboBox2.SelectedValue);
            command1.Parameters.AddWithValue("@EID3", comboBox3.SelectedValue);
            connection1.Open();
            command1.Connection = connection1;
            command1.ExecuteNonQuery();
            connection1.Close();

从SQL的角度来看,您应该先将数据插入ticketdetail和engineer表,然后再插入ticket_engineer。
tblEngineer
已经有一些数据,我首先在
tblTicketDetail
中插入数据,然后在生成的id上,我在
tblTicket_engineer
中插入数据。底线是,如果您正确设置了ticket_engineer表,它们将是其他两个表的键。这意味着,无论您想插入什么,都最好先在ticket和engineer表中存在。是的,我知道这就是为什么在第一次插入查询中,我使用SELECT SCOPE来获取刚刚生成的identity列的值,然后将该值插入到junction表中。
        string statement1 = @"INSERT INTO tblTicket_Engineer(TicketID,EngineerID) 
                        SELECT @ID,@EID1 UNION ALL
                        SELECT @ID,@EID2 UNION ALL
                        SELECT @ID,@EID3";
        using (SqlCommand command1 = new SqlCommand(statement1))
        using (SqlConnection connection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["ST"].ConnectionString.ToString()))
        {

            command1.Parameters.AddWithValue("@ID", PID);
            command1.Parameters.AddWithValue("@EID1", comboBox1.SelectedValue);
            command1.Parameters.AddWithValue("@EID2", comboBox2.SelectedValue);
            command1.Parameters.AddWithValue("@EID3", comboBox3.SelectedValue);
            connection1.Open();
            command1.Connection = connection1;
            command1.ExecuteNonQuery();
            connection1.Close();