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

StackOverflow https://stackoverflow.com/questions/1124723

  •  13-09-2019
  •  | 
  •  

Вопрос

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

Редактировать: Запрос заключается в:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + 
    tbQuestion.Text + "]', Answer = '[" + 
    tbAnswer.Text + "]', LastEdit = '" + 
    CurrentUser.Login + 
    "'WHERE ID = '" + CurrentQuestion.ID + "'");
Это было полезно?

Решение

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

Делай это вместо этого:

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.

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

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

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

В MSSQL вы можете удвоить свои кавычки:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top