sql >> Databasteknik >  >> RDS >> Mysql

Två infogningsfrågor med länkade fält

Viss förenkling är möjlig. Först och främst måste du bifoga alla dina kommandon i en transaktion eftersom det här är det klassiska fallet där posterna som infogas är i strikt relationer och det är inte meningsfullt att ha några delvis färdigställda poster.

using(MySqlConnection conn = new MySqlConnection(connStr))
{
    conn.Open();
    using(MySqlTransaction tr = conn.BeginTransaction())
    {
        ...
        // MySqlCommand code  goes here
        ...
        tr.Commit();
   }
}

Nu kan du ändra din insert question sql för att lägga till ett andra påstående som returnerar det senast infogade ID:t

 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ägg märke till hur, i MySqlCommand-konstruktorn, skickas referensen till den aktuella transaktionen. Detta krävs för att fungera med en anslutning som har en transaktion öppnad.

Saker och ting är lite mer komplexa för den andra delen. Samma knep för att lägga till en andra sql-sats kan även tillämpas på slingan som infogar svaren, men du måste gå bakåt om den första frågan är den korrekta

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 kan du köra det sista kommandot som uppdaterar frågan med lastAnswerID

(En sista notering, jag antar att fälten question_id och answer_id är av typen numerisk, inte varchar, detta kräver att parametrarna för dessa fält kommer att vara en Int32 inte en varchar)



  1. Dela sträng efter avgränsningsposition med hjälp av oracle

  2. Ersätt första instans NULL eller ' ' med ett annat värde - MySQL

  3. Upptäcker om OLD-värdet inte är lika med NEW-värdet och OLD-värdet var NULL

  4. Välja MySql-tabelldata till en array