sql >> Database teknologi >  >> RDS >> Mysql

To indsæt forespørgsler med linkede felter

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)



  1. java.lang.OutOfMemoryError:[hukommelse opbrugt] under læsning af data fra Sqlite Android

  2. Sådan indsætter du de dynamiske tabelrækkedata i databasen på én gang

  3. Doven indlæsning fra databasen, når brugeren ruller ned på siden (ligner Twitter og Facebook)

  4. SQL-fejl 'Forældrenøgle ikke fundet' for forkert brugte fremmednøgler?