Как добавить кавычки в динамическую команду SQL? - PullRequest
8 голосов
/ 14 июля 2009

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

EDIT: Запрос:

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

Ответы [ 6 ]

11 голосов
/ 14 июля 2009

Как сказал КМ, не делай этого!

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();
        }
    }
}
7 голосов
/ 14 июля 2009

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

'''Test''' = 'Text'

Это для SQL Server.

3 голосов
/ 14 июля 2009

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

2 голосов
/ 14 июля 2009

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

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

1 голос
/ 14 июля 2009

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

my dodg'y test          -> 'my dodg''y test'
my 'quoted' string      -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''
0 голосов
/ 14 июля 2009

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

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