En vis forenkling er mulig. Først og fremmest skal du omslutte alle dine kommandoer i en transaktion, fordi dette er det klassiske tilfælde, hvor de indsatte poster er i strenge relationer, og det giver ikke mening at have nogle delvist afsluttede poster.
using(MySqlConnection conn = new MySqlConnection(connStr))
{
conn.Open();
using(MySqlTransaction tr = conn.BeginTransaction())
{
...
// MySqlCommand code goes here
...
tr.Commit();
}
}
Nu kan du ændre dit indsæt spørgsmål sql for at tilføje et andet udsagn, der returnerer det sidst indsatte id
string queryUpdateQuestions = @"INSERT INTO questions (.....);
SELECT LAST_INSERT_ID()";
using(MySqlCommand cmdUpdateQuestions = new MySqlCommand(queryUpdateQuestions, conn, tr))
{
// build the parameters for the question record
......
// Instead of ExecuteNonQuery, run ExecuteScalar to get back the result of the last SELECT
int lastQuestionID = Convert.ToInt32(cmdUpdateQuestions.ExecuteScalar());
..
}
Læg mærke til, hvordan der i MySqlCommand-konstruktøren videregives referencen til den aktuelle transaktion. Dette er nødvendigt for at arbejde med en forbindelse, der har en transaktion åbnet.
Tingene er lidt mere komplekse for anden del. Det samme trick til at tilføje en anden sql-sætning kunne også anvendes på den løkke, der indsætter svarene, men du skal gå baglæns, hvis det første spørgsmål er det rigtige
string queryUpdateAnswers = @"INSERT INTO answers (question_id, answer)
VALUES (@question_id, @answer);
SELECT LAST_INSERT_ID()";
using(MySqlCommand cmdUpdateAnswers = new MySqlCommand(queryUpdateAnswers, conn, tr))
{
// next move the loop inside the using and prepare the parameter before looping to
// to avoid unnecessary rebuild of the parameters and the command
cmdUpdateAnswers.Parameters.Add("@answer", MySqlDbType.VarChar);
cmdUpdateAnswers.Parameters.Add("@question_id", MySqlDbType.Int32);
int lastAnswerID = 0;
// Loop backward so the last answer inserted is the 'correct' one and we could get its ID
for (int b=a; b >= 1; b--)
{
cmdUpdateAnswers.Parameters["@answer"].Value = ((TextBox)this.FindControl("txtAnswer" + b)).Text;
cmdUpdateAnswers.Parameters["@question_id"].Value = lastQuestionID;
lastAnswerID = Convert.ToInt32(cmdUpdateAnswers.ExecuteScalar());
}
....
}
Nu kunne du køre den sidste kommando, der opdaterer spørgsmålet med lastAnswerID
(En sidste bemærkning, jeg formoder, at felterne question_id og answer_id er af typen numerisk, ikke varchar, dette kræver, at parametrene for disse felter vil være en Int32, ikke en varchar)