Как добавить кавычки к динамической SQL-команде?
-
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).Я думаю, что использование хранимых процедур для этого излишне.