|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
08.07.2017, 17:15 | #1 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
Неправильно работает bindValue перед выполнением запроса
Я пишу шаблон функции для извлечения заданных полей из таблицы БД. Код такой:
Код:
Во всех примерах показано именно такое использования привязки. Что я делаю не так? |
08.07.2017, 20:55 | #2 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Сделайте для начала проверку всех возвращаемых значений функциями на предмет ошибок, м.б. запрос вообще не исполнен, например, не было связи.
Ну развейте мысль Код:
При вызове, указывать можно только ReturnType, второй компилер из аргумента выведет сам. ...хотя вроде глупость написал Вам же для WHERE это надо будет. Ну пусть останется, в качестве идеи, что параметры тож можно в шаблон ) Последний раз редактировалось alexzk; 08.07.2017 в 21:18. |
08.07.2017, 21:39 | #3 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
...вообще, в таком виде будет сильно тормознуто и не эффективно. Будет гуй вешатся и т.д.
Я делал так - поток, он открывает БД и по окончании закрывает, как локальную переменную, т.е. больше ниоткуда к БД никак. Дальше поток проверяет очередь из struct { QSqlQuery a; std::function<> res; } если есть чо - исполняет запрос, вызывает ф.-ответ (все это еще меж поточно синхр. нада и учитывать, сам запрос к БД нет, а вот очереди и ответы - да). тогда ваш гет бы создавал QSqlQuery, и ложил его в очередь потока, с ответом - тут нада смареть, какая синронизация сделана. |
08.07.2017, 22:06 | #4 | |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
Цитата:
|
|
08.07.2017, 22:29 | #5 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Дело в том, что как я помню, доступ к БД должен быть из того же потока, что ее и создавал. Там в мелочах каких-то была проблема. Т.е. при многопоточности, оно будет работать, но не всегда( или слишком частые мутексы). Поэтому я так и делал - все в отдельном, чтоб наверняка и гуй не вис.
Последний раз редактировалось alexzk; 08.07.2017 в 22:32. |
08.07.2017, 23:01 | #6 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
Код:
|
08.07.2017, 23:10 | #7 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
у меня в итоге было несколько "геттеров" - каждый со своим запросом, вызыватся они могут из разных потоков (т.е. кто-то из гуи, кто-то из расчетников), поэтому у меня тупо сработало ожидать ответ.
Т.е. в структуре еще поле "ожидатора" - promises/features/conditional_variable, передаю в структуру лямбду, которую вызовет поток БД, эта лямбда должна заполнить ответом локальную переменную в геттере, потом геттер уходит в ожидание, сигнал "хватит ждать" можно или в БД прописать, или прям в лямбде (т.к. она в контексте потока БД). Дождались сигнал - вернули локальную переменную (кстати, луче делать shared_ptr на что-то, в лямбду брать его копию, и заполнять уже указываемую память ответом, так надежнее, если забыть "ожидание", все равно не упадет + не зависит от наличия у потоков своего стека, а это спорный сильно вопрос, MacOS делает его реально маленьким, по нынешним временам). Но это вобщем еще медленнее будет, если вызовы геттера все из 1 потока типа гуя. Конкретно для гуя, можно делать через сигнал-слот с последним параметром коннекта Qt::QueuedConnection. Т.о. слот будет всегда вызван в контексте потока, хозяина объекта. Т.е. лямбда в гетере вызывает сигнал с ответом. Кстати, promise/feature это и есть ожидание типа "сигнал-слот", но для получения в ГУЙ не пойдет - гуй будет висеть. Последний раз редактировалось alexzk; 08.07.2017 в 23:24. |
09.07.2017, 17:14 | #8 | |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
Цитата:
Для возврата результата выполнения запроса из потока ты вызываешь лямбду, в которой локальная переменная геттера захвачена по ссылке. Для чего в структуре QSqlQuery? Почему не передавать просто запрос в QString? Можно ли использовать само поле QSqlQuery для возвращения данных после выполнения запроса? Ведь внутри будут храниться полученные данные. Для возврата значений при помощи вызова лямбды по ссылке захватывается QVariant, QSqlQuery или переменная какого-то другого типа? Все это больше похоже на очень плохой дизайн с кучей сущностей, высокой связностью и запутанностью. И надо помнить, где, например, соединение открыто, а где еще нет. Код:
Последний раз редактировалось Aoizora; 09.07.2017 в 17:45. |
|
09.07.2017, 20:37 | #9 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Умолчательное соединение - вообще плохая идея, оно отовсюду доступно и 2 БД не открыть этим же классом.
Сделайте лучше - я только идей набросал, полный код там порядком. ...ксати да, прогнал - передается строка, который создает Query объект у меня, спутал с QSQlQuery, который действительно в цикле Код:
Последний раз редактировалось alexzk; 09.07.2017 в 20:45. |
10.07.2017, 15:26 | #10 |
Заблокирован
Регистрация: 11.11.2016
Сообщений: 261
|
Как ты запускал поток, проверяющий очередь SQL-запросов? Наследовал класс собственного потока от QThread или использовал std::thread, у которого вызывал detach в функции init(), которая при запуске программи инициализирует все необходимые ресурсы?
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Неправильно выводятся стили из-за PHP запроса | Alex2213 | PHP | 1 | 18.07.2015 21:32 |
Программа работает неправильно. | Настюня | Помощь студентам | 2 | 16.06.2012 18:34 |
Проблема с выполнением запроса к БД | AgentSmit | PHP | 2 | 14.04.2011 02:13 |
Неправильно работает WinExec? | TwiX | Общие вопросы Delphi | 2 | 26.11.2009 21:07 |
"подвисание" перед выполнением макроса | Gavr | Microsoft Office Excel | 1 | 09.08.2009 15:31 |