我在数据库中存储和编辑一些字段,该字段涉及一个或多个句子的长字符串。每当我在文本框中输入单引号并想要保存它时,它会引发异常,例如 “'l'附近的语法不正确。 字符串''后面的未闭合引号。“ 有什么想法可以避免吗?
修改 查询是:
SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" +
tbQuestion.Text + "]', Answer = '[" +
tbAnswer.Text + "]', LastEdit = '" +
CurrentUser.Login +
"'WHERE ID = '" + CurrentQuestion.ID + "'");
答案 0 :(得分:11)
正如KM所说,不要这样做!
改为此:
private static void UpdateQuestionByID(
int questionID, string question, string answer, string lastEdited)
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
const string QUERY =
@"UPDATE Questions " +
@"SET Question = @Question, Answer = @Answer, LastEdit = @LastEdited " +
@"WHERE ID = @QuestionID";
using (var cmd = new SqlCommand(QUERY, conn))
{
cmd.Parameters.AddWithValue("@Question", question);
cmd.Parameters.AddWithValue("@Answer", answer);
cmd.Parameters.AddWithValue("@LastEdited", lastEdited);
cmd.Parameters.AddWithValue("@QuestionID", questionID);
cmd.ExecuteNonQuery();
}
}
}
答案 1 :(得分:7)
如果要在SQL字段中包含单引号,请使用单引号将其转义
'''Test''' = 'Text'
这适用于SQL Server。
答案 2 :(得分:3)
编写存储的produre进行字段编辑,并使用SQL参数保存值。行情无关紧要。如果您不希望存储过程至少使用参数标记构建SQL文本并使用SQL参数。
答案 3 :(得分:1)
在MSSQL中,你可以加倍报价:
my dodg'y test -> 'my dodg''y test'
my 'quoted' string -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''
答案 4 :(得分:1)
很难给出具体答案,因为您没有列出您正在使用的数据库或应用程序语言。
您必须动态构建SQL,并且sting中的引用将被解释为字符串的结尾。根据您使用的数据库,您需要转义要在sql命令中使用的每个字符串中的单引号。在尝试运行查询之前打印查询可以看出这一点。
您没有提到要从中调用数据库的应用程序,但是在构建命令时,您需要使用您编写的FIX_QUOTES()命令或者由您的语言提供:
SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + FIX_QUOTES(tbQuestion.Text) + "]', Answer = '[" + FIX_QUOTES(tbAnswer.Text) + "]', LastEdit = '" + FIX_QUOTES(CurrentUser.Login) + "'WHERE ID = '" + FIX_QUOTES(CurrentQuestion.ID) + "'"); – A
这种类型的动态查询非常容易sql injection attack。我建议使用存储过程或参数列表调用数据库。
答案 5 :(得分:0)
正如一些人已经说过的那样,添加额外的报价就可以了。我可以确认这也是Oracle的情况(其他人已经给出了这个答案对MSSQL和SQL Server有效)。我认为使用存储过程对此来说是过度的。