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

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

существует несколько причин для модульного теста Ваш код, но поскольку время прогрессирует, Вы узнаете, что время, Вы экономите на тестировании, является одной из лучших причин сделать это. В системе я только что поставил, я настоял на том, чтобы делать автоматизированное поблочное тестирование несмотря на заявления, что я потрачу путь больше времени, делая тесты, чем я был бы путем тестирования системы вручную. Со всеми моими сделанными модульными тестами я выполняю больше чем 400 тестовых сценариев меньше чем через 10 минут и каждый раз, когда я должен был сделать небольшое изменение в коде, все, что потребовался я, чтобы быть уверенным, что код все еще работал без ошибок, были десять минут. Можно ли вообразить время, которое можно было бы провести для выполнения тех 400 + тестовые сценарии вручную?

Когда дело доходит до автоматизированного тестирования - быть им поблочное тестирование или приемочные испытания - все думают, что это - потраченное впустую усилие кодировать то, что можно сделать вручную, и иногда это верно - если Вы планируете запустить свои тесты только однажды. Большая часть автоматизированного тестирования - то, что можно несколько раз выполнять их без усилия, и после второго или третьего выполнения, время и усилие, которое Вы имеете , пропал впустую , уже оплачивают.

Один последний совет был бы к не только модульный тест Ваш код, но и начал бы делать тест сначала (см. TDD и BDD для больше)

8
задан John Saunders 14 July 2009 в 12:43
поделиться

6 ответов

As KM said, don't do this!

Do this instead:

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();
        }
    }
}
11
ответ дан 5 December 2019 в 06:54
поделиться

If you want to include a single quote into an SQL field, escape it using single quotes

'''Test''' = 'Text'

This is for SQL Server.

7
ответ дан 5 December 2019 в 06:54
поделиться

Write a stored produre to do your field editing and use SQL parameters to save the value. Quotes won't matter. If you don't want a stored proc at least build your SQL text with parameter markers and use SQL parameters with that.

3
ответ дан 5 December 2019 в 06:54
поделиться

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

Вы должны создавать свой 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-инъекции .

2
ответ дан 5 December 2019 в 06:54
поделиться

In MSSQL you can double up your quotes:

my dodg'y test          -> 'my dodg''y test'
my 'quoted' string      -> 'my ''quoted string'''
'first and last quotes' -> '''first and last quotes'''
1
ответ дан 5 December 2019 в 06:54
поделиться

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

0
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: