Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dwa zapytania wstawiające z połączonymi polami

Możliwe są pewne uproszczenia. Przede wszystkim musisz zawrzeć wszystkie swoje polecenia w transakcji, ponieważ jest to klasyczny przypadek, w którym wstawiane rekordy są ściśle powiązane i nie ma sensu mieć częściowo wypełnionego zestawu rekordów.

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

Teraz możesz zmienić wstawiane pytanie sql, aby dodać drugą instrukcję, która zwraca ostatnio wstawiony identyfikator

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

    ..

 }

Zwróć uwagę, jak w konstruktorze MySqlCommand przekazywane jest odwołanie do bieżącej transakcji. Jest to wymagane do pracy z połączeniem, które ma otwartą transakcję.

W drugiej części sprawy są nieco bardziej złożone. Ta sama sztuczka polegająca na dodaniu drugiej instrukcji sql może być zastosowana również do pętli, która wstawia odpowiedzi, ale musisz wykonać pętlę wstecz, jeśli pierwsze pytanie jest poprawne

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

Teraz możesz uruchomić ostatnie polecenie, które aktualizuje pytanie o lastAnswerID

(Ostatnia uwaga, przypuszczam, że pola question_id i answer_id są typu numeric, a nie varchar, wymaga to, aby parametry dla tych pól były typu Int32, a nie 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. MySQL na zduplikowanym kluczu... uzyskać istniejący identyfikator?

  2. JSON_ARRAY_INSERT() – Wstaw wartości do tablicy JSON w MySQL

  3. Usuń wiersz Mysql po określonym czasie

  4. kod php do tworzenia dynamicznych wierszy i wstawiania do bazy danych

  5. Przesyłanie obrazów na zdalny serwer, iPhone