Beberapa penyederhanaan dimungkinkan. Pertama-tama Anda harus menyertakan semua perintah Anda di dalam transaksi karena ini adalah kasus klasik di mana catatan yang dimasukkan berada dalam hubungan yang ketat dan tidak masuk akal untuk memiliki beberapa kumpulan catatan yang selesai sebagian.
using(MySqlConnection conn = new MySqlConnection(connStr))
{
conn.Open();
using(MySqlTransaction tr = conn.BeginTransaction())
{
...
// MySqlCommand code goes here
...
tr.Commit();
}
}
Sekarang, Anda dapat mengubah insert question sql untuk menambahkan pernyataan kedua yang mengembalikan id terakhir yang dimasukkan
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());
..
}
Perhatikan bagaimana, pada konstruktor MySqlCommand, diteruskan referensi ke transaksi saat ini. Ini diperlukan untuk bekerja dengan koneksi yang membuka transaksi.
Hal-hal yang sedikit lebih kompleks untuk bagian kedua. Trik yang sama untuk menambahkan pernyataan sql kedua dapat diterapkan juga pada loop yang menyisipkan jawaban, tetapi Anda perlu melakukan loop mundur jika pertanyaan pertama adalah pertanyaan yang benar
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());
}
....
}
Sekarang Anda dapat menjalankan perintah terakhir yang memperbarui pertanyaan dengan lastAnswerID
(Catatan terakhir, saya kira bidang question_id dan answer_id bertipe numerik, bukan varchar, ini mengharuskan parameter untuk bidang ini adalah Int32 bukan varchar)