Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
1

Запросы в БД

03.05.2012, 00:02. Просмотров 1721. Ответов 15
Метки нет (Все метки)

Возник такой вопрос. Что-то ответ в голову не приходит. Может кто-то уже отвечал на него.

После установки соединения с БД запросы к ней можно создавать в любой точке программы. Но как можно ограничить такую "свободу". Мне нужно написать модуль взаимодействий с БД, в котором будут собраны все интерфейсы для общения с БД. И этот модуль должен быть единственной связующей точкой с базой данных.

Если чуть более конкретно, то программа поддерживает расширения в виде dll'ок. Эти dll-ки предоставляют адреса однотипных функций, которые дергаются из основной программы. Так вот нужна гарантия, что никакой запрос к БД не пройдет из этих функций.

Хотя вру, один вариант в голову приходил. Создавать именованные соединения, и тогда конструктор по умолчанию для QSqlQuery query; ничего не даст, т.к. понадобится явно указать имя соединения - QSqlQuery query(someInstanceOfDB);
Но ведь это как-то слабо решает проблему... Достаточно узнать название используемого соединения. Не говоря уж о том, что имена соединений можно получить через QSqlDatabase::connectionNames()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2012, 00:02
Ответы с готовыми решениями:

QT+SQLite запросы
в таблице имеется поле, содержащее определенную дату. как по запросу вывести...

Запросы к роутеру
в программе посылаю запросы к роутеру manager = new QNetworkAccessManager();...

QT и запросы MySQL
Здравствуйте. Вопрос такой: Есть программа подключенная к бд. Вывод таблиц бд...

Запросы SQl в Qt 5.7.0, SetQuery()
В первом случае я хочу получить из двух таблиц связанные данные, но только по...

QNetworkAccessManager последовательные запросы
Допустим нужно получить страничку "Мой кабинет" форума, для этого надо: ...

15
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
03.05.2012, 10:10 2
эм... есть подозрение, что никак... да и не к чему (ИМХО);
создайте singleton аля DB Connector (который будет обращаться к БД через некий интерфейс) и пусть себе работает... а в dll-ку уже создавайте непосредственно коннект и передавайте указатель на интерфейс в этот singleton
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
03.05.2012, 11:52  [ТС] 3
в дллках никаких коннектов быть не должно. нужна гарантия, что все общение программы с бд будет ограничено ТОЛЬКО через предоставленный мною интерфейс и больше никак.
0
Чистый
Автор FAQ
2714 / 1410 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
03.05.2012, 11:59 4
Почему не создать отдельный класс в котором описать все и им пользоваться, или я чего то не догнал
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
03.05.2012, 19:00  [ТС] 5
Потому что открытым соединением можно пользоваться в любой точке программы. После строк:
C++ (Qt)
1
2
3
QSqlDatabase db = QSqlDatabase::addDatabase("MYSQL3");
...
db.open();
любой запрос можно выполнить из любой точки программы:
C++ (Qt)
1
2
QSqlQuery query;
query.exec("TRUNCATE TABLE very_important_table");
и финита ля комедия.

мне нужно способ соблюсти всего два требования:
1. Класс BDInteraction может взаимодействовать с БД.
2. Никакой другой класс с БД взаимодействовать не может.
0
Чистый
Автор FAQ
2714 / 1410 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
03.05.2012, 20:29 6
ну так и создай в конструкторе соединение с базой при этом проверяй если нет соединения открывай если есть ничего не предпринимай, я так с Sqlite работаю
а можно вообще static заюзать
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
03.05.2012, 21:25  [ТС] 7
получить список всех настроенных соединений элементарно, причем опять же в любой точке программы. и ничто не мешает открыть соединение в другом месте. если только каждый раз сбрасывать/устанавливать пароль.
кроме того, в случае многопоточности вполне реально протолкнуть сторонний запрос, пока соединение не закроют.
кроме того стоит вопрос эффективности. обмен с БД может быть очень активным и как на это скажется постоянное открытие/закрытие соединений - не известно.
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
04.05.2012, 08:07 8
Озадачивался этой темой, ответ нашел такой - сторонние библиотеки. Куте не предоставляет ничего принципиально лучшего, мб и ошибаюсь.
А вообще, в моем понимании вам правильно написали, что
Цитата Сообщение от l_a_m Посмотреть сообщение
да и не к чему (ИМХО);
проверочки на стороне сервера делать надо для клиентского приложения дизассемблер еще никто не отменял =)
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
04.05.2012, 19:43  [ТС] 9
для меня важность скрыть все в методах очевидна. важность запретить доступ к БД иными способами меньше, но также есть. обычное сокрытие информации.
если хотите аналогий, то это за тем же, зачем передавать константные ссылки в методы. можно и не константные передавать и написать рядом жирными буквами, что это входной параметр и изменять его ни-ни... но дураков много, и лучше я положусь на компилятор, который обезопасит программу от них.

есть идея вообще не пользоваться QSqlDatabase и QSqlQuery, а использовать непосредственно QSqlDriver и QSqlResult. Нужно выяснить, отобразится ли созданный таким образом коннект в списке, который можно получить через QSqlDatabase::connectionNames();
вроде похожий вопрос уже проплывал на форуме...
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
28.05.2012, 13:53 10
Что-то сегодня тихо, подниму наболевшее =)
http://habrahabr.ru/post/52536/

правильно ли я понял что это то что доктор прописал?)
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
28.05.2012, 14:15 11
Цитата Сообщение от Drus Посмотреть сообщение
дизассемблер еще никто не отменял
ой... да прям уж там... захотят хакнуть - хакнут... а остальное - от лукавого...
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
28.05.2012, 14:23 12
ну хм, никто и не споит тут вопрос был в том как ограничить для "пользователей" неправильное обращение к базе из любого места в коде где вздумается

Добавлено через 1 минуту
почему тему поднял - нужно средствами куте с базой общаться, левосторонние либы не канают
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
28.05.2012, 14:31 13
ну так вперёд, общайтесь, кто ж запрещает то?)))
драйвер под Qt скопилить и вперёд..
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
28.05.2012, 14:38 14
ладно, не хочется чего-то лезть в бутылку. с компилированием драйвера проблем нет, есть проблемы с доверчивой душой драйвера, предоставляющей глобальный доступ всем и вся, хотелось бы минимальным переписыванием исходного кода эту фичу запретить. Понятно или нет я написал уже сути не поменяет
0
Paporotnik
383 / 227 / 12
Регистрация: 06.07.2011
Сообщений: 512
28.05.2012, 17:45  [ТС] 15
в статье напомнили, что доступ через соединение доступен только в том потоке, который соединение создал. пожалуй, это и может стать хоть и кривоватым, но ограничением доступа. надо попробовать будет. спасибо.
0
Drus
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
29.05.2012, 08:12 16
Очень хочу посмотреть на рожу аффтара, когда кто-нибудь напишет:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
class XThread : public OurThread
 
XThread xt("initializer");
 
int main()
 
{
   ...
   DatabaseAccessor::getInstance()
}
вот этого в силу своей нубости не понял, объясните.
Запрет наследования?
0
29.05.2012, 08:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2012, 08:12

Многопоточные запросы POST\GET
Здравствуйте. В MDI-приложении на Qt требуется организовать многопоточную...

Многопоток и MySQL запросы
Добрый день хочу написать многопоточную программу, с использованием MYSQL...

Ищу софт на Qt который форматирует запросы
Собственно: Ищу софт на Qt который форматирует запросы. SQL нестандартный....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru