Russian Qt Forum
Март 28, 2024, 19:31
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Базы данных
>
Выполнение встроенных процедур MS SQL Server
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Выполнение встроенных процедур MS SQL Server (Прочитано 12362 раз)
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Выполнение встроенных процедур MS SQL Server
«
Ответ #15 :
Март 13, 2017, 08:44 »
Цитата: titan83 от Март 12, 2017, 14:35
Извините, не удержался))
"Не используй строки Люк, используй типы - это путь силы." (с) Мастер Йода.
А вообще мне лично так нравится больше:
Код:
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
Гость
Re: Выполнение встроенных процедур MS SQL Server
«
Ответ #16 :
Март 13, 2017, 12:30 »
Цитата: Пантер от Март 13, 2017, 08:44
Цитата: titan83 от Март 12, 2017, 14:35
Извините, не удержался))
"Не используй строки Люк, используй типы - это путь силы." (с) Мастер Йода.
А вообще мне лично так нравится больше:
Код:
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
Сообщений: 5876
Жаждущий знаний
Re: Выполнение встроенных процедур MS SQL Server
«
Ответ #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
Гость
Re: Выполнение встроенных процедур MS SQL Server
«
Ответ #18 :
Март 13, 2017, 16:30 »
Цитата: Пантер от Март 13, 2017, 13:03
Код:
query.exec(QString ("SELECT * FROM table_name WHERE id=%1").arg(idString));
Если в idString передать: "0; DROP TABLE table_name", то удалится таблица. Бинд это разрулит, ибо такая строка точно не закастится в тип id. Бинд работает на низком уровне, он не преобразуется в строку внутри Кьюта, а передается драйверу БД.
Благодарю.
Записан
twp
Гость
Re: Выполнение встроенных процедур MS SQL Server
«
Ответ #19 :
Март 21, 2017, 16:41 »
Цитата: Пантер от Март 13, 2017, 08:44
Цитата: titan83 от Март 12, 2017, 14:35
Извините, не удержался))
"Не используй строки Люк, используй типы - это путь силы." (с) Мастер Йода.
А вообще мне лично так нравится больше:
Код:
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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...