所以我有这样的形式: http://i.imgur.com/vZYssQy.png
现在假设ID
,First Name
,Last Name
,DOB
,Address
,Phone Number
和Post 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();
}
但是其他两个文本框GPA
和Major 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 |
答案 0 :(得分:3)
student
表可能有personId
字段,该字段引用person
表。您也必须填写(在第二次插入中)。
此外,您最好将两个插入放在一个事务中,这样您就不会得到不一致或有点工作的数据。通过交易,您既可以获得两条记录,也可以不使用任何一条记录,而不是像现在这样记录其中一条记录。
答案 1 :(得分:0)
您似乎在Person
和Student
之间存在“一对一”关系,而我猜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";