8

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

编辑: 查询是:

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

6 回答 6

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();
        }
    }
}
于 2009-07-14T12:40:28.467 回答
8

如果要在 SQL 字段中包含单引号,请使用单引号对其进行转义

'''Test''' = 'Text'

这是针对 SQL Server 的。

于 2009-07-14T11:12:46.893 回答
3

编写存储产品来进行字段编辑并使用 SQL 参数来保存值。报价无关紧要。如果您不想要存储过程,至少使用参数标记构建 SQL 文本并使用 SQL 参数。

于 2009-07-14T11:12:26.973 回答
2

很难给你一个具体的答案,因为你没有列出你正在使用的数据库或应用程序语言。

您必须动态构建 SQL,并且字符串中的引号被解释为字符串的结尾。根据您使用的数据库,您需要转义您打算在 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 注入攻击我建议使用存储过程或参数列表调用数据库。

于 2009-07-14T12:18:29.663 回答
1

在 MSSQL 中,您可以将引号加倍:

my dodg'y test          -> 'my dodg''y test'
my 'quoted' string      -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''
于 2009-07-14T11:13:44.990 回答
0

正如一些人已经说过的,添加一个额外的报价就可以了。我可以确认这也是 Oracle 的情况(其他人给出的这个答案对 MSSQL 和 SQL Server 有效)。我认为为此使用存储过程是矫枉过正的。

于 2009-07-14T13:02:10.753 回答