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