Динамический SQL-запрос вызывает ошибку незакрытой кавычки

Я получаю эту ошибку:

Незакрытые кавычки после строки символов ''.

Со следующим кодом:

lSQL = "DELETE FROM tblCourses where courseCode='" + aCourseCode + "'";

Где lSQL — локальная переменная, а aCourseCode — значение хранилища. Какие-либо предложения?


person Hear Smuggler    schedule 02.09.2011    source источник
comment
Есть ли шанс, что aCourseCode содержит одинарную кавычку? Пожалуйста, используйте параметризованные SQL-запросы, чтобы защитить себя от SQL-инъекций. Вот хорошее объяснение uberasp.net/getarticle.aspx?id=46. . Подумайте, что будет делать этот запрос, если aCourseCode — это строка "x' or 1=1 --".   -  person driis    schedule 02.09.2011
comment
Ваш курс, вероятно, называется «История уязвимостей Sql».   -  person Jimmy    schedule 02.09.2011


Ответы (3)


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

using (var conn = new SqlConnection(ConnectionString))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "DELETE FROM tblCourses WHERE courseCode = @courseCode";
    cmd.Parameters.AddWithValue("@courseCode", aCourseCode);
    int deletedRowsCount = cmd.ExecuteNonQuery();
}

Это гарантирует, что даже если переменная aCourseCode содержит некоторые escape-символы и опасные символы, они будут правильно обработаны.

person Darin Dimitrov    schedule 02.09.2011
comment
+1 Не говоря уже о том, что это также позволит избежать любых кавычек в переменной aCourseCode. - person Yuck; 02.09.2011

Вероятно, в вашей переменной aCourseCode есть одинарная или двойная кавычка.

person Lane    schedule 02.09.2011

Лучший способ отформатировать строки — использовать что-то вроде этого:

lSQL = String.Format("DELETE FROM tblCourses where courseCode='{0}'", aCourseCode);

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

Надеюсь, это поможет.

person abraganza    schedule 02.09.2011
comment
Нет, это не лучший способ. Он страдает от тех же проблем, что и исходный код. - person Darin Dimitrov; 02.09.2011
comment
Я согласен ... Я давал ему способ правильно отформатировать строку, а не для операции SQL. - person abraganza; 02.09.2011
comment
Я не понимаю, почему за это проголосовали. Конечно, пункт, упомянутый последним, является более важным, но это все же хороший совет. @Darin, хотя это не решит проблему, но действительно облегчает обнаружение отсутствующих кавычек и, следовательно, затрудняет написание запросов с неправильными кавычками. (Но, конечно, цитирование исчезает, как только вы пишете параметризованный запрос. Это все еще полезная техника в других сценариях.) - person stakx - no longer contributing; 02.09.2011
comment
@stakx, я не понизил этот ответ, но я думаю, что человек, который понизил его, хотел убедиться, что другие люди, имеющие ту же проблему, никогда не будут использовать такой код. И я должен с ним согласиться. - person Darin Dimitrov; 02.09.2011