Russian Qt Forum
Март 28, 2024, 19:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Выполнение встроенных процедур MS SQL Server  (Прочитано 12362 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #15 : Март 13, 2017, 08:44 »

Извините, не удержался))
"Не используй строки Люк, используй типы - это путь силы." (с) Мастер Йода.
А вообще мне лично так нравится больше:
Код:
    for (int i = 0; i < queryParameters.size(); i++)
        lQueryText.replace(queryParameters.keys().at(i), queryParameters.value(queryParameters.keys().at(i)));
где
lQueryText - QString
queryParameters - QHash<QString, QString>
И душевно работает без QSqlQuery::prepare
И строки использовать намного удобнее, чем over9000 типов, все становится единообразно. Хотя, если оплата за количество строк кода, то смысл есть))
Это небезопасно и может привести к sql инъекции. Плюс, при использовании биндов не надо ничего экранировать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
titan83
Гость
« Ответ #16 : Март 13, 2017, 12:30 »

Извините, не удержался))
"Не используй строки Люк, используй типы - это путь силы." (с) Мастер Йода.
А вообще мне лично так нравится больше:
Код:
    for (int i = 0; i < queryParameters.size(); i++)
        lQueryText.replace(queryParameters.keys().at(i), queryParameters.value(queryParameters.keys().at(i)));
где
lQueryText - QString
queryParameters - QHash<QString, QString>
И душевно работает без QSqlQuery::prepare
И строки использовать намного удобнее, чем over9000 типов, все становится единообразно. Хотя, если оплата за количество строк кода, то смысл есть))
Это небезопасно и может привести к sql инъекции. Плюс, при использовании биндов не надо ничего экранировать.
Каким образом bind защищает от инъекции? Удаляет sql запросы, соответствующие диалекту используемой БД?
Про экранирование - спасибо, это существенная информация.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #17 : Март 13, 2017, 13:03 »

Код:
query.exec(QString ("SELECT * FROM table_name WHERE id=%1").arg(idString));

Если в idString передать: "0; DROP TABLE table_name", то удалится таблица. Бинд это разрулит, ибо такая строка точно не закастится в тип id. Бинд работает на низком уровне, он не преобразуется в строку внутри Кьюта, а передается драйверу БД.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
titan83
Гость
« Ответ #18 : Март 13, 2017, 16:30 »

Код:
query.exec(QString ("SELECT * FROM table_name WHERE id=%1").arg(idString));

Если в idString передать: "0; DROP TABLE table_name", то удалится таблица. Бинд это разрулит, ибо такая строка точно не закастится в тип id. Бинд работает на низком уровне, он не преобразуется в строку внутри Кьюта, а передается драйверу БД.
Благодарю.
Записан
twp
Гость
« Ответ #19 : Март 21, 2017, 16:41 »

Извините, не удержался))
"Не используй строки Люк, используй типы - это путь силы." (с) Мастер Йода.
А вообще мне лично так нравится больше:
Код:
    for (int i = 0; i < queryParameters.size(); i++)
        lQueryText.replace(queryParameters.keys().at(i), queryParameters.value(queryParameters.keys().at(i)));
где
lQueryText - QString
queryParameters - QHash<QString, QString>
И душевно работает без QSqlQuery::prepare
И строки использовать намного удобнее, чем over9000 типов, все становится единообразно. Хотя, если оплата за количество строк кода, то смысл есть))
Это небезопасно и может привести к sql инъекции. Плюс, при использовании биндов не надо ничего экранировать.

Есть еще вот что. СУБД кэширует и оптимизирует (прекомпилирует) все выполняемые запросы. Соответственно, когда в базу передается на выполнение один и тот же запрос, но с разными параметрами (указанными непосредственно в запросе), то база каждый раз будет интерпретировать такой запрос как новый, со своими издержками. Это не есть хорошо, особенно если в это время к базе поступают много запросов одновременно. Поэтому правильно передавать именно шаблон запроса через QSqlQuery::prepare. QSqlQuery::prepare как раз дает команду СУБД извлечь из кэша существующий или создать и оптимизировать новый запрос. Ну и уже потом в запрос передаются параметры через QSqlQuery::bindValue. Т.е. по сути такие запросы очень близки к хранимым процедурам.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.