0

所以我有这个表格:http: //i.imgur.com/vZYssQy.png

现在ID, First Name, Last Name, DOB, Address,Phone NumberPost Code文本框应该插入到一个名为的表中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然后它谈到了主键。

但是,如果我填写文本框并单击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               |
4

2 回答 2

3

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

此外,您最好将两个插入都放在事务中,这样您就不会得到不一致或有点工作的数据。通过交易,您要么得到两条记录,要么都没有,不像现在这样。

于 2013-09-16T08:45:17.560 回答
0

Person看来你在and之间有一个“一对一”的关系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";
于 2013-09-16T08:47:02.963 回答