如何将引号添加到动态SQL命令?

时间:2009-07-14 11:10:25

标签: sql dynamic-sql

我在数据库中存储和编辑一些字段,该字段涉及一个或多个句子的长字符串。每当我在文本框中输入单引号并想要保存它时,它会引发异常,例如 “'l'附近的语法不正确。 字符串''后面的未闭合引号。“ 有什么想法可以避免吗?

修改 查询是:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + 
    tbQuestion.Text + "]', Answer = '[" + 
    tbAnswer.Text + "]', LastEdit = '" + 
    CurrentUser.Login + 
    "'WHERE ID = '" + CurrentQuestion.ID + "'");

6 个答案:

答案 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有效)。我认为使用存储过程对此来说是过度的。