Search code examples
c#mysqlsql-updateinner-joindataadapter

MySqlDataAdapter Update table that uses Inner Join


I'm tring to add the Insert, Update and Delete commands to a MySqlDataAdapter which has the data added to it with the command:

        //iec211.4521studenti
        string lv_sObsTable = "`" + mv_sDatabase + "`.`" + mv_sGroup + "observatii`";
        string lv_sStudTable = "`" + mv_sDatabase + "`.`" + mv_sGroup + "studenti'";
        string lv_sObservatiiCommand = "SELECT o.idObservatie, o.idStudent, s.nume, o.observatie, o.lastUpdate FROM " + lv_sObsTable + " o INNER JOIN " + lv_sStudTable + " s USING (idStudent) ORDER BY s.nume ASC";
        mv_dtAdapterObservatii = new MySqlDataAdapter(lv_sObservatiiCommand, mv_sqlConnection);
        mv_dtAdapterObservatii.Fill(mv_dsTables, lv_sCurrentTable);

I've serched for an answer and I've found two possible solutions for UPDATE, but both of them give me an error:

        string lv_sObsTB = "`" + mv_sDatabase + "`.`" + mv_sGroup + "observatii`";
        string lv_sStudTB = "`" + mv_sDatabase + "`.`" + mv_sGroup + "studenti`";

        //VERSION 1
        string lv_sCommand = "UPDATE o SET s.idStudent=@idStudent, o.observatie=@observatie FROM " + lv_sObsTB + " AS o INNER JOIN " + lv_sStudTB + " s ON o.idStudent=s.idStudent ";
        MySqlCommand lv_sqlCommand = new MySqlCommand(lv_sCommand);

        lv_sqlCommand.Parameters.Add("@idStudent", MySqlDbType.Int16, 10, "idStudent");
        lv_sqlCommand.Parameters.Add("@observatie", MySqlDbType.VarChar, 255, "observatie");

        mv_dtAdapterObservatii.UpdateCommand = lv_sqlCommand;

        //VERSION 2
        string lv_sCommand = "UPDATE " + lv_sObsTB + " SET " + "idStudent=@" + lv_sStudTB + ".idStudent, observatie=@observatie WHERE idObservatie=@idObservatie AND " + lv_sObsTB + ".idStudent IN (SELECT " + lv_sStudTB + ".idStudent FROM " + lv_sStudTB + ")";
        MySqlCommand lv_sqlCommand = new MySqlCommand(lv_sCommand);

        lv_sqlCommand.Parameters.Add("@" + lv_sStudTB + ".idStudent", MySqlDbType.Int16, 10, "idStudent");
        lv_sqlCommand.Parameters.Add("@observatie", MySqlDbType.VarChar, 255, "observatie");
        lv_sqlCommand.Parameters.Add("@idObservatie", MySqlDbType.Int16, 10, "idObservatie");

        mv_dtAdapterObservatii.UpdateCommand = lv_sqlCommand;

The error message for the first version is : "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM iec211.4521observatii ASS o INNER JOIN iec211.4521studenti s ON o.id' at line 1"

The error message for the second version is:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.4521studenti'.idStudenti, observatie='test' WHERE idObservatie=1 ANDiec211.' at line 1"

I don't know how to use the MySQL commands in combination with MySqlCommand and MySqlDataAdapter.

Until now I've used the following command to obtain data for my table:

        string lv_sObservatiiCommand = "SELECT * FROM `" + mv_sDatabase + "`.`" + mv_sGroup + "observatii` ORDER BY idStudent ASC";
        mv_dtAdapterObservatii = new MySqlDataAdapter(lv_sObservatiiCommand, mv_sqlConnection);
        mv_dtAdapterObservatii.Fill(mv_dsTables, lv_sCurrentTable);

In combination with MySqlCommandBuilder to get the update command and the parameters that needed to be setted:

        lv_sqlCommandBuilder = new MySqlCommandBuilder(mv_dtAdapterObservatii);
        mv_dtAdapterObservatii.UpdateCommand = lv_sqlCommandBuilder.GetUpdateCommand();

Can someone please explain to me how to correctly add the insert, update and delete commands to a MySqlDataAdapter that contains an INNER JOIN between 2 tables ?

I know that each table must be in a different data adapter, and they are. The "4521studenti" table is inside "mv_dtAdapterStudenti", which is not included in the code above.

Thank you for the help and I hope this won't be considered as a bad post. :)


Solution

  • Okey. I think I've figured it out.

    This is the SELECT command for 4521observatii:

            string lv_sStudent = "`" + mv_sDatabase + "`.`" + mv_sGroup + "studenti`";
            string lv_sObservatii = "`" + mv_sDatabase + "`.`" + mv_sGroup + "observatii`";
            string lv_sObservatiiCommand = "SELECT o.idObservatie, o.idStudent, s.nume, o.observatie, o.lastUpdate FROM " + lv_sObservatii + " o INNER JOIN " + lv_sStudent + " s USING (idStudent) ORDER BY s.nume ASC";
            // Read data from the server for the current table and add it to the DataSet
            mv_dtAdapterObservatii = new MySqlDataAdapter(lv_sObservatiiCommand, mv_sqlConnection);
            mv_dtAdapterObservatii.Fill(mv_dsTables, lv_sCurrentTable);
    

    And this is the code for the UPDATE command, inside a different method:

            // `iec211`.`4521observatii`
            string lv_sObsTB = "`" + mv_sDatabase + "`.`" + mv_sGroup + "observatii`";
            // `iec211`.`4521studenti`
            string lv_sStudTB = "`" + mv_sDatabase + "`.`" + mv_sGroup + "studenti`";
            string lv_sSelectStudenti = "(SELECT idStudent FROM " + lv_sStudTB + " WHERE idStudent=@idStudent)";
    
            string lv_sCommand = "UPDATE " + lv_sObsTB + " SET idStudent="+ lv_sSelectStudenti + ", observatie=@observatie WHERE idObservatie=@idObservatie";
            MySqlCommand lv_sqlCommand = new MySqlCommand(lv_sCommand);
    
            lv_sqlCommand.Parameters.Add("@idStudent", MySqlDbType.Int16, 10, "idStudent");
            lv_sqlCommand.Parameters.Add("@observatie", MySqlDbType.VarChar, 255, "observatie");
            lv_sqlCommand.Parameters.Add("@idObservatie", MySqlDbType.Int16, 10, "idObservatie");
    
            mv_dtAdapterObservatii.UpdateCommand = lv_sqlCommand;
            mv_dtAdapterObservatii.UpdateCommand.Connection = mv_sqlConnection;
    

    The idea is that when I use INNER JOIN I bring data from two different tables and put them together. When I used the UPDATE command, the program didn't know which table he was using and gived those errors.

    So I thought what if I update the values of 4521observatii and for the column that is used as FOREIGN KEY I assign the value from 4521studenti.

    I know it's like "Tell me your name so I can tell you your name.", but it worked for me.

    I hope this will help others and you have a better and cleaner solution, pleas tell me :)