INSERT,以及如何INSERT到多个表

时间:2013-09-16 08:42:36

标签: c# mysql

所以我有这样的形式: http://i.imgur.com/vZYssQy.png

现在假设IDFirst NameLast NameDOBAddressPhone NumberPost Code文本框INSERT到一个名为person的表中(这是有效的,它插入)

我的代码是:

public static void insertStudent(int personId, string firstName, string lastName, string DOB, int phoneNumber, string address, int postCode, string majorField, int gradePointAverage)
{
    MySqlConnection conn = connection();
    conn.Open();
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = conn;
    string myInsertSQL = "INSERT INTO person(personId, firstName, lastName, DOB, phoneNumber, address, postCode) VALUES (@personId, @firstName, @lastName, @DOB, @phoneNumber, @address, @postCode)";
    cmd.Prepare();
    cmd.CommandText = myInsertSQL;
    cmd.Parameters.AddWithValue("@personId", personId);
    cmd.Parameters.AddWithValue("@firstName", firstName);
    cmd.Parameters.AddWithValue("@lastName", lastName);
    cmd.Parameters.AddWithValue("@DOB", DOB);
    cmd.Parameters.AddWithValue("@phoneNumber", phoneNumber);
    cmd.Parameters.AddWithValue("@address", address);
    cmd.Parameters.AddWithValue("@postCode", postCode);
    cmd.ExecuteNonQuery();
}

但是其他两个文本框GPAMajor Field需要转到名为student的单独表格。我的代码是:

 string myInsertSQLStudent = "INSERT INTO student(majorField, gradePointAverage) VALUES (@majorField, @gradePointAverage)";
            cmd.Prepare();
            cmd.CommandText = myInsertSQLStudent;
            cmd.Parameters.AddWithValue("@majorField", majorField);
            cmd.Parameters.AddWithValue("@gradePointAverage", gradePointAverage);
            prevID(conn, cmd);

位于上述代码的正下方。但这不起作用,我收到一个崩溃和一条消息,告诉我Cannot add or update a child row: a foreign key constraint fails然后它会谈到主键。

然而,它工作KIND OF,如果我填写文本框,然后单击insert程序崩溃,但person表填充了数据,但student表没有。

我如何才能让它发挥作用?

谢谢!

编辑:

这是我的人员表:

personId | firstName | lastName | DOB | phoneNumber | address | postCode |

blah     |blah       |blah      |blah |blah         |blah     |blah      |blah

这是我的学生表

person_personId | majorField | gradePointAverage |
balh            |blah        |blah               |

2 个答案:

答案 0 :(得分:3)

student表可能有personId字段,该字段引用person表。您也必须填写(在第二次插入中)。

此外,您最好将两个插入放在一个事务中,这样您就不会得到不一致或有点工作的数据。通过交易,您既可以获得两条记录,也可以不使用任何一条记录,而不是像现在这样记录其中一条记录。

答案 1 :(得分:0)

您似乎在PersonStudent之间存在“一对一”关系,而我猜Student有一个PersonId外键,所以您需要添加它。

string myInsertSQLStudent = "INSERT INTO student(personId, majorField, gradePointAverage) VALUES (@majorField, @gradePointAverage)";
            cmd.Prepare();
            cmd.CommandText = myInsertSQLStudent;
            cmd.Parameters.AddWithValue("@personId", personId);
            cmd.Parameters.AddWithValue("@majorField", majorField);
            cmd.Parameters.AddWithValue("@gradePointAverage", gradePointAverage);
            prevID(conn, cmd);

在第一次插入时,您应该返回插入记录的ID - 您可以将select @@identity作为最后一个语句,并使用var id = cmd.ExecuteScalar()来获取它

  string myInsertSQL = "INSERT INTO person(personId, firstName, lastName, DOB, phoneNumber, address, postCode) VALUES (@personId, @firstName, @lastName, @DOB, @phoneNumber, @address, @postCode); 
select @@identity as id";