用C#进行此MySQL查询有什么问题?

时间:2019-11-11 08:44:08

标签: c# mysql

我正在尝试通过遍历列表来构建查询,从而将多个行插入表中。我的SQL语法出错,看起来像这样:

            string sql = "insert into achievement(Rank,Event,UserId) values ";
            string valueSQL = "";



            using (command = new MySqlCommand("begin;" +
                " insert into profile(Username,TextInfo) values(@username,@textinfo);" +
                " set @userid = LAST_INSERT_ID(); " +
                  sql +
                " insert into social(URL,UserId) values(@url,@userid);" +
                " COMMIT;", conn))
            {

                command.Parameters.AddWithValue("username", dto.Username);
                command.Parameters.AddWithValue("textinfo", dto.FreeText);
                command.Parameters.AddWithValue("url", dto.SocialURL);

                for(int i = 0; i < dto.achievementDTOs.Count; i++)
                {
                    valueSQL += /*(valueSQL == "" ? "": ",") +*/ "(@rank" + i + ",@event" + i + ",@userid)";
                    command.Parameters.AddWithValue("rank"+i, dto.achievementDTOs[i].Rank);
                    command.Parameters.AddWithValue("event"+i, dto.achievementDTOs[i].Event);
                }
                sql += valueSQL;
                sql += ";";

                command.ExecuteNonQuery();

构建此查询的最终结果应类似于以下内容:

"begin;" +
            " insert into profile(Username,TextInfo) values(@username,@textinfo);" +
            " set @userid = LAST_INSERT_ID(); " +
            " insert into achievement(Rank,Event,UserId) values (@rank0,@event0,@userid) (@rank1,@event1,@userid)" etc. etc. etc. +
            " insert into social(URL,UserId) values(@url,@userid);" +
            " COMMIT;"

1 个答案:

答案 0 :(得分:1)

我已经看到了问题

您的代码:

 string sql = "insert into achievement(Rank,Event,UserId) values ";
            string valueSQL = "";

        using (command = new MySqlCommand("begin;" +
            " insert into profile(Username,TextInfo) values(@username,@textinfo);" +
            " set @userid = LAST_INSERT_ID(); " +
              sql +
            " insert into social(URL,UserId) values(@url,@userid);" +
            " COMMIT;", conn)

所以。仔细看一下sql字符串..您没有添加要插入的值..语法错误会指出这一点。我还没有尝试像这样在一个插入中添加多行,但是,如果那是有效的,那么就可以像您一样形成sql了,但是只有在算出了sql variale之后才能这样做。例如,更像

 string sql = "insert into achievement(Rank,Event,UserId) values ";
            string valueSQL = "";

                for(int i = 0; i < dto.achievementDTOs.Count; i++)
            {
                valueSQL += /*(valueSQL == "" ? "": ",") +*/ "(@rank" + i + ",@event" + i + ",@userid)";
                command.Parameters.AddWithValue("rank"+i, dto.achievementDTOs[i].Rank);
                command.Parameters.AddWithValue("event"+i, dto.achievementDTOs[i].Event);
            }
            sql += valueSQL;
            sql += ";";

            using (command = new MySqlCommand("begin;" +
                " insert into profile(Username,TextInfo) values(@username,@textinfo);" +
                " set @userid = LAST_INSERT_ID(); " +
                  sql
                " insert into social(URL,UserId) values(@url,@userid);" +
                " COMMIT;", conn)