Възможно е известно опростяване. Преди всичко трябва да затворите всичките си команди в транзакция, защото това е класическият случай, при който вмъкнатите записи са в стриктни взаимоотношения и няма смисъл да имате някакъв частично завършен набор от записи.
using(MySqlConnection conn = new MySqlConnection(connStr))
{
conn.Open();
using(MySqlTransaction tr = conn.BeginTransaction())
{
...
// MySqlCommand code goes here
...
tr.Commit();
}
}
Сега можете да промените вашия sql въпрос за вмъкване, за да добавите второ изявление, което връща последния вмъкнат идентификатор
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());
..
}
Забележете как в конструктора MySqlCommand се предава препратката към текущата транзакция. Това е необходимо за работа с връзка, която има отворена транзакция.
Нещата са малко по-сложни за втората част. Същият трик за добавяне на втори sql оператор може да се приложи и към цикъла, който вмъква отговорите, но трябва да се върнете назад, ако първият въпрос е правилният
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());
}
....
}
Сега можете да изпълните последната команда, която актуализира въпроса с lastAnswerID
(Последна бележка, предполагам, че полетата question_id и answer_id са от числов тип, а не varchar, това изисква параметрите за тези полета да бъдат Int32, а не varchar)