Название: Как такое может быть? Отправлено: shame от Декабрь 09, 2011, 14:43 Есть 2 программы, работающие с базой данных. 2 программа - это часть 1 выполненная в виде отдельной программы. Код идентичный (копипаст). Первая программа работает как надо, а во второй модель не может найти таблицу. Как такое может быть?
Название: Re: Как такое может быть? Отправлено: Пантер от Декабрь 09, 2011, 14:52 По такому описанию можно только одно вответить - "Вот так".
Добавь конкретики. Что за БД? Как подключаешься? Название: Re: Как такое может быть? Отправлено: shame от Декабрь 09, 2011, 14:57 Код: model = new QSqlRelationalTableModel(this); Идентично в обоих программах. Соединение с базой есть, так как поиск с использованием Код: QSqlQuery *sq = new QSqlQuery(); Если нада, могу выложить как делаю соединение, но думаю дело не в нем. Тем более в первой программе все работает и моделька видит таблицу. Название: Re: Как такое может быть? Отправлено: Пантер от Декабрь 09, 2011, 15:07 qDebug()<< model->lastError().text();
Что выводит на консоль? Название: Re: Как такое может быть? Отправлено: shame от Декабрь 09, 2011, 15:20 " Unable to find table in_stock"
Почему QSqlQuery видит таблицу, а модель нет. Я даже пробовал менять на QSqlTableModel. Результат тот же. Название: Re: Как такое может быть? Отправлено: Пантер от Декабрь 09, 2011, 15:30 Поищи по форуму, уже была когда-то такая проблема, но не помню, как решалось. Вроде, там с регистром что-то было.
Название: Re: Как такое может быть? Отправлено: shame от Декабрь 09, 2011, 15:45 В поиске не нашел :( везде постргес, а у меня скулайт. Щаз попробуй еще раз под вендой скомпилить, хотя и там не получалось.
Название: Re: Как такое может быть? Отправлено: Rem Norton от Декабрь 09, 2011, 15:47 Выведи в консоль QStringList QSqlDatabase::tables ( QSql::TableType type = QSql::Tables ) const от своего подключения. Может и нет никакой "in_stock".
А вообще было бы не погано "всех посмотреть" ;D Название: Re: Как такое может быть? Отправлено: shame от Декабрь 09, 2011, 15:50 Если бы не было, то каким образом вторая программа с аналогичным кодом работала? Тем более запрос ее видит, а модель нет. Чувствую щаз создам новый проект с другим названием и перенесу туда код.
Название: Re: Как такое может быть? Отправлено: shame от Декабрь 09, 2011, 16:50 Добавил
Код: QSqlQuery *sq = new QSqlQuery(); Хотя тоже самое, но запущенное в слоте по нажатию кнопки, возвращает результат. Почему в конструкторе он игнорирует моё соединение с базой? PS: перенес создание модели в слот с поиском. при нажатии кнопки вызвался слот и комбобокс заполнился. Название: Re: Как такое может быть? Отправлено: Rem Norton от Декабрь 09, 2011, 17:15 Ошибка вот тут:
QSqlQuery *sq = new QSqlQuery(); Запрос не привязан к базе. Т.е. запрос в никуда. Название: Re: Как такое может быть? Отправлено: shame от Декабрь 09, 2011, 17:21 Ошибки здесь нету, так как берется подключение по-умолчанию. Перенес подключение к базе данных в конструктор и все стало работать. Только не пойму почему когда подключение было в main.cpp файле конструктор подключения не видел, а слоты видели?
Название: Re: Как такое может быть? Отправлено: Rem Norton от Декабрь 09, 2011, 18:02 И все-таки: что такого военного в коде, что его нельзя показать целиком? Там что, пусковые коды межконтинентальных ракет???
Лечить геморой по фотографии - удел народных "целителей". Код в студию! ;D Название: Re: Как такое может быть? Отправлено: shame от Декабрь 09, 2011, 19:47 Та ничего там нету такого, не выкладывал только потому что этот код в любых примерах есть. Сделал соединение к базе данных, создаю модель, которая не видит это соединение. Если так уже хотите то выложу вам весь проект.
Название: Re: Как такое может быть? Отправлено: ultimatet41 от Декабрь 09, 2011, 19:53 Попробуйте перенесите код подключения к базе данных в функцию main().
Название: Re: Как такое может быть? Отправлено: Rem Norton от Декабрь 09, 2011, 21:24 Та ничего там нету такого, не выкладывал только потому что этот код в любых примерах есть. Сделал соединение к базе данных, создаю модель, которая не видит это соединение. Если так уже хотите то выложу вам весь проект. Ну, не мне оно надо. Уменя все (тьфу-тьфу) работет. НО, чтобы не давать пустых советов, на код взглянуть не вредно.Для примера: один мой сотрудник (к счастью бывший) 2 дня орал, что "gcc - отстой глюкавый" потому, что в коде: Код функция прерывалась при любом значении nIntVal. Тоже, кстати результат копипаста. Название: Re: Как такое может быть? Отправлено: shame от Декабрь 11, 2011, 00:02 Вот вам проект, где подключение к базе происходит в main.cpp. Модель потом не видит таблицу, а вызов слота показывает все что находится в этой таблице. Если подключение перенести в конструктор, то модель работает как надо. Баг?
ЗЫ: это о чем я спрашивал в самом начале. Название: Re: Как такое может быть? Отправлено: BRE от Декабрь 11, 2011, 00:15 Баг? Конечно баг, у тебя в программе. :)У тебя конструктор отрабатывает до открытия базы и именно в конструкторе создается модель для таблицы. Название: Re: Как такое может быть? Отправлено: Rem Norton от Декабрь 11, 2011, 00:16 Ошибка в main.cpp. Причем ошибка грубейшая. Правильно так:
Код
P.S. Как же все таки полезно иногда к вопросу прилагать код! 2 дня догадок вслепую - решений 0, после просмотра кода - 2 ответа в течении минуты. Надеюсь, что для ТС это послужит уроком на будущее. Название: Re: Как такое может быть? Отправлено: shame от Декабрь 11, 2011, 00:22 Спасибо. Буду знать. Честно даже и не смотрел что сначала создал объект, а потом только соединение.
|