MySqlDataAdapter使用内部联接的更新表

时间:2016-03-29 14:19:59

标签: c# mysql sql-update inner-join dataadapter

我要将插入,更新和删除命令添加到MySqlDataAdapter,并使用以下命令添加数据:

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

我已经找到了答案,我找到了两种可能的UPDATE解决方案,但它们都给了我一个错误:

        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;

第一个版本的错误消息是:"您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在' FROM iec211附近使用正确的语法。4521observatii ASS o INNER JOIN iec2114521studenti s ON o.id'在第1行"

第二个版本的错误消息是:SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以便在'。4521studenti'.idStudenti, observatie='test' WHERE idObservatie=1 AND iec211 .'附近使用正确的语法。在第1行"

我不知道如何将MySQL命令与MySqlCommand和MySqlDataAdapter结合使用。

到目前为止,我已使用以下命令获取我的表格数据:

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

与MySqlCommandBuilder结合使用以获取更新命令和需要设置的参数:

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

有人可以向我解释如何正确地将插入,更新和删除命令添加到包含2个表之间的INNER JOIN的MySqlDataAdapter吗?

我知道每个表必须位于不同的数据适配器中,并且它们是。 " 4521学生" table在" mv_dtAdapterStudenti"里面,它不包含在上面的代码中。

感谢您的帮助,我希望这不会被视为一个糟糕的帖子。 :)

1 个答案:

答案 0 :(得分:0)

奥基。我想我已经明白了。

这是4521observatii的SELECT命令:

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

这是UPDATE命令的代码,在不同的方法中:

        // `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;

我的想法是,当我使用INNER JOIN时,我从两个不同的表中提取数据并将它们放在一起。当我使用UPDATE命令时,程序不知道他正在使用哪个表并给出了这些错误。

所以我想如果我更新4521observatii的值以及用作FOREIGN KEY的列我会从4521studenti分配值。

我知道它"告诉我你的名字,所以我可以告诉你你的名字。",但它对我有用。

我希望这会对别人有所帮助,你有更好更清洁的解决方案,请告诉我:)。