Mysql
 sql >> база данни >  >> RDS >> Mysql

Две заявки за вмъкване със свързани полета

Възможно е известно опростяване. Преди всичко трябва да затворите всичките си команди в транзакция, защото това е класическият случай, при който вмъкнатите записи са в стриктни взаимоотношения и няма смисъл да имате някакъв частично завършен набор от записи.

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

Сега можете да промените вашия sql въпрос за вмъкване, за да добавите второ изявление, което връща последния вмъкнат идентификатор

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

    ..

 }

Забележете как в конструктора MySqlCommand се предава препратката към текущата транзакция. Това е необходимо за работа с връзка, която има отворена транзакция.

Нещата са малко по-сложни за втората част. Същият трик за добавяне на втори sql оператор може да се приложи и към цикъла, който вмъква отговорите, но трябва да се върнете назад, ако първият въпрос е правилният

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

Сега можете да изпълните последната команда, която актуализира въпроса с lastAnswerID

(Последна бележка, предполагам, че полетата question_id и answer_id са от числов тип, а не varchar, това изисква параметрите за тези полета да бъдат Int32, а не varchar)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP сесията е в конфликт с AJAX

  2. MySQL СЪЗДАВАНЕ НА ТАБЛИЦА АКО НЕ СЪЩЕСТВУВА -> Грешка 1050

  3. MySQL Изберете горните N реда

  4. Google Maps Запазва полигон и точки в MySQL с помощта на PHP

  5. MySQL заявка за показване на записи с текуща дата отгоре и други в низходящ ред