Как добавить кавычки в динамическую команду SQL?

Я сохраняю и редактирую некоторое поле в базе данных, которое включает длинную строку из одного или нескольких предложений. всякий раз, когда я ввожу одну цитату в текстовое поле и хочу сохранить ее, она выдает исключение, например "неправильный синтаксис рядом с 'l'. Незамкнутая кавычка после символьной строки "." есть ли идея избежать этого?

EDIT: Запрос:

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

6 ответов


Как сказал км,Не делай этого!

Do этой вместо:

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();
        }
    }
}

Если вы хотите включить одинарную кавычку в поле SQL, удалите ее, используя одинарные кавычки

'''Test''' = 'Text'

Это для SQL Server.


напишите сохраненный produre для редактирования поля и используйте параметры SQL для сохранения значения. Цитаты не имеют значения. Если вы не хотите хранить proc, по крайней мере, создайте свой текст SQL с маркерами параметров и используйте параметры SQL с этим.


в MSSQL вы можете удвоить свои котировки:

my dodg'y test          -> 'my dodg''y test'
my 'quoted' string      -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''

трудно дать вам конкретный ответ, потому что вы не перечисляете базу данных или язык приложения, который вы используете.

вы должны динамически создавать свой 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-инъекций. Я бы рекомендовал вызвать базу данных с помощью хранимой процедуры или со списком параметров.


как некоторые уже сказали, добавление дополнительной цитаты сделает трюк. Я могу подтвердить, что это также относится к Oracle (другие дали этот ответ для MSSQL и SQL Server). Я думаю, что использование хранимых процедур для этого излишне.