sql >> Databáze >  >> RDS >> Mysql

Dva vložit dotazy s propojenými poli

Určité zjednodušení je možné. Nejprve musíte uzavřít všechny své příkazy do transakce, protože toto je klasický případ, kdy jsou vložené záznamy ve striktním vztahu a nedává smysl mít nějakou částečně dokončenou sadu záznamů.

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

Nyní můžete změnit sql vložení otázky a přidat druhý příkaz, který vrátí poslední vložené 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());

    ..

 }

Všimněte si, jak je v konstruktoru MySqlCommand předán odkaz na aktuální transakci. To je nutné pro práci s připojením, které má otevřenou transakci.

U druhého dílu jsou věci trochu složitější. Stejný trik pro přidání druhého příkazu sql lze použít také na smyčku, která vkládá odpovědi, ale pokud je první otázka správná, musíte se vrátit zpět.

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());
    }
    ....
}

Nyní můžete spustit poslední příkaz, který aktualizuje otázku pomocí lastAnswerID

(Poslední poznámka, předpokládám, že pole question_id a answer_id jsou typu numeric, nikoli varchar, to vyžaduje, aby parametry pro tato pole byly Int32, nikoli varchar)



  1. co je java.io.EOFEException, Zpráva:Nelze přečíst odpověď ze serveru. Očekává se čtení 4 bajtů, čtení 0 bajtů

  2. Odstraňování problémů Žádný takový soubor nebo adresář při spuštění `php app/console doctrine:schema:create`

  3. Aktualizace dělené tabulky oracle

  4. Jak označit určitý počet řádků v tabulce při souběžném přístupu