代码C#错误获取;预期

时间:2017-09-07 18:35:22

标签: c#

插入数据库的代码

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}\");";

2 个答案:

答案 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}""};"";";

在构建字符串时从不使用+,因为它会评估两者,然后将它们附加到第三个而不是仅创建一个字符串。