插入数据库的代码
query = "INSERT INTO Question(Image, AnswerA, AnswerB, AnswerC, AnswerD, CorrectAnswer)"
+ $"VALUES(\""{name}\",\""{answerList[0]}\",\"{answerList[1]}\",\""{answerList[2]}\",\"{answerList[3]}\",\"{name}\"};";
我在此行中收到错误“; expected”:
+ $"VALUES(\""{name}\",\""{answerList[0]}\",\"{answerList[1]}\",\""{answerList[2]}\",\"{answerList[3]}\",\"{name}\");";
答案 0 :(得分:4)
在三个地方,你有一个未转义的第二个双引号,结束引用的字符串就在那里:
\""{name
和
\""{answerList[0]
和
\""{answerList[2]
那些打破你的C#,如果你逃脱它们,他们就会打破你的SQL。所以不要这样做。几乎可以肯定,你应该使用单引号而不是双引号(感谢Icarus):
query = "INSERT INTO Question(Image, AnswerA, AnswerB, AnswerC, AnswerD, CorrectAnswer)"
+ $"VALUES('{name}','{answerList[0]}','{answerList[1]}','{answerList[2]}','{answerList[3]}','{name}'};";
然而,这是非常糟糕的编码风格。它很容易受到SQL注入攻击,如果你的一个答案恰好有撇号,它会崩溃,并且在字符串中引用引号甚至只是匹配的引号是非常容易出错的,正如你所发现的那样。
所以重新开始并使用参数重写代码,这些参数可以简洁地解决所有这些问题:
SqlCommand cmd = new SqlCommand();
// ...etc.
cmd.Parameters.Add("@name", SqlDbType.NVarChar);
cmd.Parameters.Add("@answerList0", SqlDbType.NVarChar);
// ...etc.
cmd.Parameters["@name"].Value = name;
cmd.Parameters["@answerList0"].Value = answerList[0];
// ...etc.
query = "INSERT INTO Question(Image, AnswerA, AnswerB, AnswerC, AnswerD, CorrectAnswer)"
+ "VALUES(@name,@answerList0,@answerList1,@answerList2,@answerList3,@name};";
答案 1 :(得分:0)
尝试使用如下构建字符串:
$@"query = ""INSERT INTO Question(Image, AnswerA, AnswerB, AnswerC, AnswerD, CorrectAnswer)""
""VALUES(""{name}"",""{ answerList[0]}"",""{answerList[1]}"",\""{
answerList[2]}"",""{answerList[3]}"",""{name}""};"";";
在构建字符串时从不使用+
,因为它会评估两者,然后将它们附加到第三个而不是仅创建一个字符串。