Một số đơn giản hóa là có thể. Trước hết, bạn cần phải đặt tất cả các lệnh của mình bên trong một giao dịch bởi vì đây là trường hợp cổ điển mà các bản ghi được chèn vào có mối quan hệ chặt chẽ và không có ý nghĩa gì khi có một số tập hợp các bản ghi đã hoàn thành một phần.
using(MySqlConnection conn = new MySqlConnection(connStr))
{
conn.Open();
using(MySqlTransaction tr = conn.BeginTransaction())
{
...
// MySqlCommand code goes here
...
tr.Commit();
}
}
Bây giờ, bạn có thể thay đổi câu hỏi chèn sql của mình để thêm câu lệnh thứ hai trả về id cuối cùng được chèn vào
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ưu ý rằng tại phương thức khởi tạo MySqlCommand, được chuyển tham chiếu đến giao dịch hiện tại như thế nào. Điều này là bắt buộc để hoạt động với kết nối đã mở giao dịch.
Mọi thứ phức tạp hơn một chút cho phần thứ hai. Thủ thuật tương tự để thêm câu lệnh sql thứ hai cũng có thể được áp dụng cho vòng lặp chèn câu trả lời, nhưng bạn cần lặp lại nếu câu hỏi đầu tiên là câu đúng
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());
}
....
}
Bây giờ bạn có thể chạy lệnh cuối cùng cập nhật câu hỏi với lastAnswerID
(Lưu ý cuối cùng, tôi cho rằng các trường question_id và answer_id thuộc kiểu số, không phải varchar, điều này yêu cầu các tham số cho các trường này phải là Int32 không phải là varchar)