Здравствуйте, гость ( Вход | Регистрация )
padla | Дата 22.4.2009, 17:02 |
То-есть мне придется ручками опять устанавливать соединение? | |
defnull | Дата 21.4.2009, 23:55 |
Цитата defnull, я к тому, что может быть лучше утяжелить класс потока и избавится от дополнительного класса Database. Я структуру программы постичь немогу, что и как взамодействует. Честно говоря я не понимаю как вы предлагаете утяжелить поток. Структура предполагалась следующая. Есть поток например DatabaseThread который должен обрабатывать всё что связанно с БД. Есть класс Command в котором содержиться sql запрос и работа с этим запросом. Есть главное окно программы пусть будет Window. Планировалось сделать следующее: есть интерфейс который поддерживают все классы наследующие Command. Когда мы хотим обратиться к бд мы вызываем сигнал который содержит указательна соответствующую команду унаследованную от Command. Сигнал передаётся потоку и далее функция Command назовём её например start работает уже в потоке где создавалось подключение к БД. ТОесть идея в том что всё что связанно с БД обрабатывается в потоке отвечающим за БД. Как это сделать утяжелив исключительно DataThread я не знаю. Поэтому и решил что нужен дополнительный класс Database который создаётся в секции run() потока DataThread и соединяется потом с кем нужно дял выполнения команд вида Command и отсылания сигналов об ошибках. Можете привести пример как можно это на ваш взгляд упростить?? з.з.ы чот пытался процитировать а похожу вместо этого ставил + и - за сообщение %) |
|
SABROG | Дата 21.4.2009, 21:59 |
Небольшой вопрос. А что произойдет если во время работы программы соединение с БД разорвется? Это риторический вопрос или он адресован к конкретной реализации взаимодействия с базой данных через разные потоки? Если первое, то зависит от того написал ли ты проверку на возвращение ошибок при работе с запросами. Если не написал, то возможен любой исход от продолжения нормальной работы программы до AV. А вот с поделками на Delphi обычно это заканчивается выведением окна (иногда бесконечное их создание) о разрыве соединения без дальнейшей возможности к переподключению до перезагрузки программы. Если вопрос с подтекстом типа, что будет если в этот момент передавались данные, то обычно происходит откат и это никак не влияет на целостность базы данных. Но она должна поддерживать команды BEGIN TRANSACTION ... END TRANSACTION. |
|
padla | Дата 21.4.2009, 17:52 |
Небольшой вопрос. А что произойдет если во время работы программы соединение с БД разорвется? | |
Litkevich Yuriy | Дата 18.4.2009, 21:43 |
defnull, я к тому, что может быть лучше утяжелить класс потока и избавится от дополнительного класса Database. Я структуру программы постичь немогу, что и как взамодействует. |
|
defnull | Дата 18.4.2009, 21:38 |
Есть поток DatabaseThread и класс Database, в котором находится QSqlDatabase. а для чего они так разделены? Почему не одним классом?По причине того, что надо обрабатывать в потоке классы Command, в которых содержиться команда SQL и происходит запись и обработка данных. Таким образом Database исключительно обрабатывает ошибки с которыми не может справиться Command (переподключение к БД например) Можно было бы конечно QSqlDatabase наследовать классом Database, но всё равно остаётся проблемы, так как чтобы передавать этот класс Command от например Gui класса классу Database приходится идти через поток. =( з.ы. Sterr и есть я, просто не со своего компа всё делал.. |
|
Litkevich Yuriy | Дата 18.4.2009, 21:27 |
Есть поток DatabaseThread и класс Database, в котором находится QSqlDatabase. а для чего они так разделены? Почему не одним классом? |
|
defnull | Дата 18.4.2009, 21:12 |
Добрый день. Столкнулся с такой проблемой.. Есть поток DatabaseThread и класс Database, в котором находится QSqlDatabase. Для того чтобы работа шла параллельно Database создаётся именно в секции run и соотвественно до этого имеем просто указатель на Database. Но возникает проблема в том, что я не могу соединить слоты Database с объектами вне DatabaseThread до тех пор, пока не сработает метод run.. в результате получаю геморой в создании лишних слотов и сигналов для DatabaseThread. Как можно разрулить ситуацию? или проще вообще не заморачиваться над дополнительным потоком с базой ? (проект учебный в принципе, но хотелось быделать по уму) з.ы. были мысли по поводу соединения сигнала с сигналом, но всё равно надо делать какую-то проверку на то что Database уже выделена память. |
|
Litkevich Yuriy | Дата 12.4.2009, 14:25 |
Как я понимаю даже после того как объект db уничтожен всё равно можно получить соединение бд в вспомогательной функции через QSqlDatabase db = QSqlDatabase::database(); ? да. Правильнее этот класс было бы назвать QSqlConnection, т.к. описывает не БД а соединение с ней. Соединений в программе может быть несколько, в том числе и с одной БД.При вызове статической функции QSqlDatabase::addDatabase("QPSQL"); в нутри этого класса создается соединение. Этот класс необычный (ты невызываешь конструктор для создания объекта, а статическую функцию). Он подобен "Одиночке" (шаблон проектирования). Этот вариант называется соеденение по умолчанию (без указания имени). А еще можно задать имя соединения. подробности в описании класса (у нас на сайте на русском языке) П.С. наиболее употребительные классы модуля SQL создаются как обычные переменные, а не как указатели. И менно благодаря тому, что к соединению можно получить доступ из любого места программы, но незабыв про оговорку насчет потоков. Если нужно получать доступ к одной и тойже БД из разных потоков, можно просто в каждом потоке создать по соединению |
|
Sterr | Дата 12.4.2009, 13:36 |
Если правильно вас понял то в run() создаю соединение QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); Как я понимаю даже после того как объект db уничтожен всё равно можно получить соединение бд в вспомогательной функции через QSqlDatabase db = QSqlDatabase::database(); ? Спасибо! |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 19.4.2024, 22:00 |