使用内部联接的 MySqlDataAdapter 更新 table
MySqlDataAdapter Update table that uses Inner Join
我正在尝试将插入、更新和删除命令添加到 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);
我搜索了一个答案,我找到了两个可能的更新解决方案,但它们都给我一个错误:
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;
第一个版本的错误信息是:"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"
第二个版本的错误消息 is:You 在您的 SQL 语法中有错误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1 行的“.4521studenti'.idStudenti, observatie='test' WHERE idObservatie=1 AND
iec211.
”附近使用的正确语法
我不知道如何将 MySQL 命令与 MySqlCommand 和 MySqlDataAdapter 结合使用。
到目前为止,我使用以下命令为我的 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);
结合MySqlCommandBuilder获取更新命令及需要设置的参数:
lv_sqlCommandBuilder = new MySqlCommandBuilder(mv_dtAdapterObservatii);
mv_dtAdapterObservatii.UpdateCommand = lv_sqlCommandBuilder.GetUpdateCommand();
有人可以向我解释如何正确地将插入、更新和删除命令添加到包含 2 tables 之间的 INNER JOIN 的 MySqlDataAdapter 吗?
我知道每个 table 必须在不同的数据适配器中,它们确实如此。 “4521studenti”table在"mv_dtAdapterStudenti"里面,上面的代码里没有。
感谢您的帮助,我希望这不会被视为不好的 post。 :)
好的。我想我已经弄明白了。
这是 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 时,我从两个不同的 table 中获取数据并将它们放在一起。当我使用 UPDATE 命令时,程序不知道他正在使用哪个 table 并给出了那些错误。
所以我想如果我更新 4521observatii
的值,对于用作 FOREIGN KEY 的列,我从 4521studenti
.
分配值会怎么样
我知道这就像 "Tell me your name so I can tell you your name.",但它对我有用。
我希望这对其他人有帮助,并且您有更好更清洁的解决方案,请告诉我:)
我正在尝试将插入、更新和删除命令添加到 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);
我搜索了一个答案,我找到了两个可能的更新解决方案,但它们都给我一个错误:
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;
第一个版本的错误信息是:"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"
第二个版本的错误消息 is:You 在您的 SQL 语法中有错误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1 行的“.4521studenti'.idStudenti, observatie='test' WHERE idObservatie=1 AND
iec211.
”附近使用的正确语法
我不知道如何将 MySQL 命令与 MySqlCommand 和 MySqlDataAdapter 结合使用。
到目前为止,我使用以下命令为我的 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);
结合MySqlCommandBuilder获取更新命令及需要设置的参数:
lv_sqlCommandBuilder = new MySqlCommandBuilder(mv_dtAdapterObservatii);
mv_dtAdapterObservatii.UpdateCommand = lv_sqlCommandBuilder.GetUpdateCommand();
有人可以向我解释如何正确地将插入、更新和删除命令添加到包含 2 tables 之间的 INNER JOIN 的 MySqlDataAdapter 吗?
我知道每个 table 必须在不同的数据适配器中,它们确实如此。 “4521studenti”table在"mv_dtAdapterStudenti"里面,上面的代码里没有。
感谢您的帮助,我希望这不会被视为不好的 post。 :)
好的。我想我已经弄明白了。
这是 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 时,我从两个不同的 table 中获取数据并将它们放在一起。当我使用 UPDATE 命令时,程序不知道他正在使用哪个 table 并给出了那些错误。
所以我想如果我更新 4521observatii
的值,对于用作 FOREIGN KEY 的列,我从 4521studenti
.
我知道这就像 "Tell me your name so I can tell you your name.",但它对我有用。
我希望这对其他人有帮助,并且您有更好更清洁的解决方案,请告诉我:)