我正在尝试通过遍历列表来构建查询,从而将多个行插入表中。我的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;"
答案 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)