Russian Qt Forum

Qt => Базы данных => Тема начата: PinkPanther от Январь 28, 2010, 17:29



Название: Не работает SQLite на других машинах
Отправлено: PinkPanther от Январь 28, 2010, 17:29
Господа, возник странный глюк (а может быть и закономерный, но пока - впервые).
Написал небольшую софтинку, которая, помимо прочего, пишет в базу (SQLite).
У меня на компе все ОК, работает как часы. А на других при открытии базы выдает ошибку, и ничего никуда писать не хочет.
Отдавал людям 4 файла: мой .exe, QtGui4.dll, QtCore4.dll, QtSql4.dll
У меня прога работает из любого каталога, если в нем есть эти файлы. Если базы нет, она создается, если есть, дополняется. У них и не создается, и не дополняется, если я даю им свою версию. Где грабли? Что сделано не так?


Название: Re: Не работает SQLite на других машинах
Отправлено: SABROG от Январь 28, 2010, 17:42
Вероятно sql драйвера собраны в виде плагинов.


Название: Re: Не работает SQLite на других машинах
Отправлено: PinkPanther от Январь 28, 2010, 18:14
Вероятно sql драйвера собраны в виде плагинов.

Гм... ставил 4.6.0 из экзешника, commercial. После ничего не трогал. Плагины? Возможно... Не подскажете, что нужно изменить и как? Пишу в VS2008.


Название: Re: Не работает SQLite на других машинах
Отправлено: panAlexey от Январь 28, 2010, 18:50
Вероятно sql драйвера собраны в виде плагинов.
Гм... ставил 4.6.0 из экзешника, commercial. После ничего не трогал. Плагины? Возможно... Не подскажете, что нужно изменить и как? Пишу в VS2008.
Поставь на виртуал-бокс винду чистую и протестируй свои "отдал" на ней.
скорее всего не хватает <твай проект фолдерз>\plagins\qsqlite4.dll


Название: Re: Не работает SQLite на других машинах
Отправлено: SABROG от Январь 28, 2010, 20:23
Вероятно из-за того, что твой дистрибутив Qt коммерческий все GPL'ные 3rd библиотеки собраны в качестве .dll. Тебе нужно зайти в папку $QTDIR/plugins/sqldrivers и оттуда достать .dll файл. Потом читать раздел "Deploying an Application on Windows" в документации насчет того как таскать плагины с твоей программой и где их надо размещать.


Название: Re: Не работает SQLite на других машинах
Отправлено: SASA от Январь 29, 2010, 11:36
http://doc.crossplatform.ru/qt/4.5.0/deployment.html (http://doc.crossplatform.ru/qt/4.5.0/deployment.html)


Название: Re: Не работает SQLite на других машинах
Отправлено: Akaiten от Январь 29, 2010, 11:54
Недавняя тема Подключение плагинов при переносе на машину без установленной Qt. (http://www.prog.org.ru/topic_11804_0.html)


Название: Re: Не работает SQLite на других машинах
Отправлено: PinkPanther от Январь 29, 2010, 17:16
Спасибо! На днях поставлю Qt на другую машину, и сделаю конфиг по всем правилам. Надеюсь, заработает...


Название: Re: Не работает SQLite на других машинах
Отправлено: panAlexey от Январь 29, 2010, 17:22
Спасибо! На днях поставлю Qt на другую машину, и сделаю конфиг по всем правилам. Надеюсь, заработает...
Да скачай ты виртуал-бокс да поставь на свою машину чистую ось под него да потренируйся.
Виртуалки затем и придумали.


Название: Re: Не работает SQLite на других машинах
Отправлено: PinkPanther от Январь 30, 2010, 10:55
Спасибо! На днях поставлю Qt на другую машину, и сделаю конфиг по всем правилам. Надеюсь, заработает...
Да скачай ты виртуал-бокс да поставь на свою машину чистую ось под него да потренируйся.
Виртуалки затем и придумали.

А зачем? Она и там не заработает. На данный момент попробовал прогу на 6 машинах (2 c Win-7, 4 c XP), на которых она должна была бы, по идее, работать, и ни на одной не заработала, вылетая с одной и той же ошибкой. Понятно, что виноваты дрова SQLite (все остальные ф-ции работают). При этом 2 машины из 6 имеют почти нулевые оси. Понятно, что есть привязка к установленной Qt.


Название: Re: Не работает SQLite на других машинах
Отправлено: SASA от Январь 30, 2010, 11:44
Понятно, что есть привязка к установленной Qt.

Нет. Надо правильно разворачивать приложение. Мой пример с SQLite. Радотает везде

-imageformats\qjpeg4.dll
                   \ ...
                   \qico4.dll
-sqldrivers\qsqlite4.dll
-QtSql4.dll
-QtCore4.dll
-QtGui4.dll
-QtNetwork4.dll
-myApp.exe

Сложнее, если вам надо использовать бинарники из qt, например, ассистант. Прииходиться писать qt.conf.

P.S. Плюс надо поставить студийные дллки - vcredist_x86.exe.
P.S.S Почитайте ссылку, которую я дал. Там всё по-русски.


Название: Re: Не работает SQLite на других машинах
Отправлено: panAlexey от Январь 30, 2010, 13:05
Спасибо! На днях поставлю Qt на другую машину, и сделаю конфиг по всем правилам. Надеюсь, заработает...
Да скачай ты виртуал-бокс да поставь на свою машину чистую ось под него да потренируйся.
Виртуалки затем и придумали.
А зачем?
Для теста и выяснения чего её надо, а на зломученья пользователей.
ладно, я пас.


Название: Re: Не работает SQLite на других машинах
Отправлено: PinkPanther от Январь 30, 2010, 18:04
Нет. Надо правильно разворачивать приложение. Мой пример с SQLite. Радотает везде

-imageformats\qjpeg4.dll
                   \ ...
                   \qico4.dll
-sqldrivers\qsqlite4.dll
-QtSql4.dll
-QtCore4.dll
-QtGui4.dll
-QtNetwork4.dll
-myApp.exe

Сложнее, если вам надо использовать бинарники из qt, например, ассистант. Прииходиться писать qt.conf.


Спасибо! Все, о чем написано в статье, сделал. Правда, пока не ставил vcredist_x86.exe. Сейчас попробую.

P.S. Увы, не помогло. :-(


Название: Re: Не работает SQLite на других машинах
Отправлено: SABROG от Январь 31, 2010, 12:14
А на других при открытии базы выдает ошибку

Какую?


Название: Re: Не работает SQLite на других машинах
Отправлено: PinkPanther от Январь 31, 2010, 18:29
А на других при открытии базы выдает ошибку

Какую?

Код:
bool dbase::createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase(QObject::tr("QSQLITE"));
db.setDatabaseName(QObject::tr("XXXXX"));

db.setUserName(QObject::tr("YYYYY"));
db.setHostName(QObject::tr("Home"));
db.setPassword(QObject::tr("ZZZZZ"));
if(!db.open())
{
Messages::showError(QObject::tr("Ошибка открытия базы:\nНе могу открыть базу данных 'XXXXX'."));
return false;
}
return true;
}

Сначала выкидывает эту ошибку (это ф-ция инициализации базы, взятая почти под кальку у Шлее), притом выкидывает вне зависимости от того, есть ли в директории готовый файл базы, или нет. Потом прога ругается при создании таблиц, потом - при попытке обращений к базе, на запись и чтение. В общем, везде, где доступ к базе проверяется и где реализован вывод сообщения об ошибке. Привязки к каталогу нет - на рабочей машине свободно перемещаю экзешник, DLL-ы и базу, и все работает из любых мест.
(Messages - статический класс с функциями-макросами, которые выводят QMessageBox)


Название: Re: Не работает SQLite на других машинах
Отправлено: SABROG от Январь 31, 2010, 19:29
Для начала включи в проекте (.pro) консоль (CONFIG += console). Собери в debug варианте. Проверь работоспособность на другом компьютере. Если в консоль будет что-то писаться - копируй на форум. Если нет - временно переименуй папку с Qt на рабочей машине, например было c:\qt-everywhere-opensource-src-4.6.1 а стало c:\_qt-everywhere-opensource-src-4.6.1
После этого проверь работоспособность программы на рабочей машине. Если не работает, то дело в плагинах, если работает и в консоль ничего не пишет, то прикрепляй исходники своей программы здесь, чтобы я мог их собрать, будем разбираться.

С QObject::tr() ты береборщил. Сомневаюсь, что Шлее мог такое написать в книге. Вероятно эта та часть, которая не "под кальку". Ты уверен, что хочешь, чтобы пользователи твоей программы переводя программу на их родной язык перевели такие вещи как "SQLITE", "пароль для базы", "логин для базы", "имя компьютера" на какой нибудь чешский язык? После чего естественно ни сама база SQLITE открываться не будет, ни пароль с логином к ней подходить тоже не будут, т.к. всё будет на чешском. Далее ты пишешь ошибку по-русски в Messages::showError(). Если я являюсь мексиканцем, который кроме родного испанского и американского не знает ни слова по-русски, как мне перевести твою ошибку на родной язык, если кроме иероглифов на русском я ничего не вижу. Возьми за правило в исходниках писать только на английском, в том числе и комментарии. Весь интерфейс изначально надо проектировать на английском.


Название: Re: Не работает SQLite на других машинах
Отправлено: panAlexey от Февраль 01, 2010, 00:11
Весь интерфейс изначально надо проектировать на английском.
нафига козе боян? если для русских пишется. у английцев своих писателей полно..
этот твой совет явный перегиб, а может быть и прогиб.


Название: Re: Не работает SQLite на других машинах
Отправлено: SABROG от Февраль 01, 2010, 00:57
Весь интерфейс изначально надо проектировать на английском.
нафига козе боян? если для русских пишется. у английцев своих писателей полно..
этот твой совет явный перегиб, а может быть и прогиб.

Ну и понапишет такой русский для русского, только один на KOI8-R, второй в Windows-cp1251, а третий в cp866. И будут они иероглифы наблюдать под разными локалями. Вот тебе спасибо скажут. К тому же в Linux могут быть проблемы с русским шрифтом, пока грамотно не настроишь ОС под себя. Я это не однократно замечал. И если бы программа была изначально на английском, то я бы хоть как-то с ней мог бы работать. К тому же многие компьютерные термины гораздо понятней на английском языке, чем их не понятный перевод на русском. Ориентироваться надо на весь мир, а не на конкретного потребителя. Сегодня ты пишешь простой чат, чтобы с соседом переписываться, а завтра это уже полноценный DirectConnect клиент, которым пользуется весь мир.


Название: Re: Не работает SQLite на других машинах
Отправлено: panAlexey от Февраль 01, 2010, 12:57
Весь интерфейс изначально надо проектировать на английском.
нафига козе боян? если для русских пишется. у английцев своих писателей полно..
этот твой совет явный перегиб, а может быть и прогиб.
Ну и понапишет такой русский для русского, только один на KOI8-R, второй в Windows-cp1251, а третий в cp866. И будут они иероглифы наблюдать под разными локалями. Вот тебе спасибо скажут. К тому же в Linux могут быть проблемы с русским шрифтом, пока грамотно не настроишь ОС под себя. Я это не однократно замечал. И если бы программа была изначально на английском, то я бы хоть как-то с ней мог бы работать. К тому же многие компьютерные термины гораздо понятней на английском языке, чем их не понятный перевод на русском. Ориентироваться надо на весь мир, а не на конкретного потребителя. Сегодня ты пишешь простой чат, чтобы с соседом переписываться, а завтра это уже полноценный DirectConnect клиент, которым пользуется весь мир.
т.е. просто для того, что-бы избежать кракозябр под разными локалями?
Хм. это дельный совЬет.


Название: Re: Не работает SQLite на других машинах
Отправлено: PinkPanther от Февраль 02, 2010, 07:17
Для начала включи в проекте (.pro) консоль (CONFIG += console). Собери в debug варианте. Проверь работоспособность на другом компьютере. Если в консоль будет что-то писаться - копируй на форум. Если нет - временно переименуй папку с Qt на рабочей машине, например было c:\qt-everywhere-opensource-src-4.6.1 а стало c:\_qt-everywhere-opensource-src-4.6.1
После этого проверь работоспособность программы на рабочей машине. Если не работает, то дело в плагинах, если работает и в консоль ничего не пишет, то прикрепляй исходники своей программы здесь, чтобы я мог их собрать, будем разбираться.

Спасибо, попробую! Собственно, сразу со второго пункта - переименования папки. :-)

Цитировать
С QObject::tr() ты береборщил. Сомневаюсь, что Шлее мог такое написать в книге. Вероятно эта та часть, которая не "под кальку". Ты уверен, что хочешь, чтобы пользователи твоей программы переводя программу на их родной язык перевели такие вещи как "SQLITE", "пароль для базы", "логин для базы", "имя компьютера" на какой нибудь чешский язык? После чего естественно ни сама база SQLITE открываться не будет, ни пароль с логином к ней подходить тоже не будут, т.к. всё будет на чешском. Далее ты пишешь ошибку по-русски в Messages::showError(). Если я являюсь мексиканцем, который кроме родного испанского и американского не знает ни слова по-русски, как мне перевести твою ошибку на родной язык, если кроме иероглифов на русском я ничего не вижу. Возьми за правило в исходниках писать только на английском, в том числе и комментарии. Весь интерфейс изначально надо проектировать на английском.
Дело в том, что это не коммерческий продукт на продажу, и не разработка для очень третьих лиц, а утилита для двух-трех человек, которые занимаются целенаправленным парсингом по заданной мною же, известной заранее и практически не расширяемой теме. Они сидят в Москве, и кроме русского, других языков не знают. Английский - условно. У них установлена русская винда, русские шрифты, русские раскладки и таблицы символов. У Шлее, конечно, этого нет - я вставил QObject::tr исключительно для простоты дальнейшей коммуникации с пользователями, если выскакивает ошибка (что, собственно, и произошло). Чтобы не приходилось получать от них английскую ошибку по буквам.


Название: Re: Не работает SQLite на других машинах
Отправлено: PinkPanther от Февраль 02, 2010, 11:20
Все сходится. "Ребеночек не наш" (с)  ;D
После переименования папки Qt (а точнее, папки plugins в ней) ошибка стала вылезать и на основной машине. Ей нужен этот плагин. Плагин в папке рядом с собой она не хочет. Вероятнее всего, путь к нему прошит в экзешнике явным образом.


Название: Re: Не работает SQLite на других машинах
Отправлено: z11t3 от Февраль 08, 2010, 07:06
у меня правда плагинами используется.. и qt 4.5.0 интегрирован под VS2008
Код
C++ (Qt)
int main(int argc, char *argv[])
{
 
....
QCoreApplication application(argc, argv);
QStringList list_path;
QDir dir =QDir(application.applicationDirPath()+"//plugins//");
list_path << dir.absolutePath() << application.libraryPaths();
application.setLibraryPaths(list_path); //где искать плагины
 

\Qt\4.5.0\bin и
\Qt\4.5.0\plugins
B одной из этих дир драйвера и dll для запуска проекта из под вижул студии, а во второй рантайм (в том числе дебажные) для переезда на другие машины.. я очень долго плясал с бубном пока это не выяснил
UPD.. моя история
я комплил qt 2 часа с "нужными" ключами для odbs драйвера - не помогло
таскал вручную манифесты из %windir%\sxs пачками
надыбал пакет дестрибутизации для MSVC 2008
разбросал драйвера гроздьями по всей системе
настроил удаленный дебаг чтобы прочитать строчки
>'csarchiver.exe': Loaded 'C:\#Gorod\plugins\sqldrivers\qsqlodbc4.dll', Binary was not built with debug information.
>'csarchiver.exe': Unloaded 'C:\#Gorod\plugins\sqldrivers\qsqlodbc4.dll'
убедившись что драйвера то те.. но непригодны
только тупое перечитывание доки qt от безисходности на английском привело меня к пониманию что под винду нужно самостоятельно выполнить две комманды
>>cd %QTDIR%\src\plugins\sqldrivers\odbc
>> qmake odbc.pro
>> nmake
под версию 4.5.0
 
Говорила мне мама -"Учи сына английский" =)


Название: Re: Не работает SQLite на других машинах
Отправлено: red5 от Март 24, 2010, 01:25
Здравствуйте. Столкнулся с такой же проблемой.
Не увидел здесь чёткого ответа, поэтому пришлось находить решение методом проб.
Хочу описать решение этой проблемы подробнее, вдруг кому пригодится.
Моя конфигурация:
  Qt SDK for Windows (ver. 2010.01 лицензия LGPL), Qt Creator 1.3.1, MinGW, WinXP SP3
  Приложение собрано в release (CONFIG+=release).

Симптом: не открывается база данных на ПК, где не установлена QT.
Код:
bool ok = db.open(); // Если не находит плагин qsqlite4.dll, то возвращает false

Для того, чтобы приложение, которое использует плагин
C:\Qt\2010.01\qt\plugins\sqldrivers\qsqlite4.dll
загружало его на ПК, на котором не установлено QT той же версии с которым было собрано приложение, требуется:
1) В исходном тексте программы добавить путь, как показано ниже:
Код:
qApp->addLibraryPath(QString("./plugins/")); // без этой строки база данных не откроется
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

2) Структура папок запускаемого приложения должна быть следующей:
MyApp/myApp.exe
MyApp/QtCore4.dll
MyApp/mingwm10.dll
MyApp/Все_остальные_используемые_библиотеки (но не плагины)
MyApp/plugins/sqldrivers/qsqlite4.dll (плагин для работы с sqlite)

Я так понял, что остаток пути до библиотеки (/sqldrivers/qsqlite4.dll) прописан где-то жёстко в самой библиотеке QT.
Наверное, с остальными плагинами аналогично. Под плагинами я понимаю те dll, которые хранятся в папке C:\Qt\2010.01\qt\plugins\

В *.pro файле в LIBS плагин -lqsqlite4  я не указывал.
Плагин я не пересобирал.
Ни какие другие настройки специально не менял.


Название: Re: Не работает SQLite на других машинах
Отправлено: DOOMer от Апрель 06, 2010, 08:10
Попробуйте передавать в качестве параметра методу  addLibrary() полный путь до каталога с плагинами:

Код
C++ (Qt)
qApp->addLibraryPath(qApp->applicationDirPath() + QString("/plugins/"));


Название: Re: Не работает SQLite на других машинах
Отправлено: lit-uriy от Апрель 06, 2010, 09:05
Переведённая цитата из асистента:
Цитировать
Qt не найдет подключаемые модули, если они не хранятся в правильном каталоге.
...
Но где находится каталог plugins? Когда приложение запущено, Qt сначала просматривает каталог исполняемого файла приложения в качестве pluginsbase. Например, если приложение находится в C:\Program Files\MyApp и имеет подключаемый модуль стиля, Qt будет искать в C:\Program Files\MyApp\styles.


Название: Re: Не работает SQLite на других машинах
Отправлено: vasist от Апрель 24, 2010, 18:20
Вот минут 20 назад столкнулся с подобной проблемой, спасибо вам всем большое, благодаря вашим постам всё решилось моментально ;)
отдельная благодарность SASA именно его структура файлов показала куда нужно библиотеки класть :P


Название: Re: Не работает SQLite на других машинах
Отправлено: radislav72 от Май 18, 2010, 05:39
Добавлю небольшой нюанс: red5 все правильно написал (спасибо :)), но пункта 1 с вызовом addLibraryPath можно избежать:
Код:
qApp->addLibraryPath(QString("./plugins/")); // без этой строки база данных не откроется

Для етого нужно плагины поместить в папку sqldrivers в папке приложения. Как писал lit-uriy
Цитировать
Qt сначала просматривает каталог исполняемого файла приложения в качестве pluginsbase. Например, если приложение находится в C:\Program Files\MyApp и имеет подключаемый модуль стиля, Qt будет искать в C:\Program Files\MyApp\styles
А для плагинов-драйверов таким каталогом является sqldrivers.

Проверено на драйверах PostgreSQL.


Название: Re: Не работает SQLite на других машинах
Отправлено: Drafter от Август 05, 2010, 17:31
Мда, тоже долго мучился, матерился, плевался, хотя и делал всё, как сказали выше.
Оказалось, что в папку ./sqldrivers скопировал плагин qsqlite4.dll не из того места. Надо копировать именно из <QtDir>\qt\plugins\sqldrivers, а не из <QtDir>\bin\sqldrivers, например. :)


Название: Re: Не работает SQLite на других машинах
Отправлено: mc-black от Август 18, 2010, 13:00
Я конечно еще ламер в Qt, но даже мне очевидно, что дистрибутиву не хватает dll для работы sqlite, так как коммерческая версия Qt в силу лицензии sqlite не должна линковать ее статически. Просто надо положить dll в одну папку с exe.


Название: Re: Не работает SQLite на других машинах
Отправлено: crossly от Август 18, 2010, 14:58
вам не правильно очевидно.... дело в том что он подложил плагин собранный другим компилятором...


Название: Re: Не работает SQLite на других машинах
Отправлено: DenisKh001 от Апрель 29, 2011, 11:33
У меня следующие файлы-папки:
myFile.exe
libgcc_s_dw2-1.dll
mingwm10.dll
QtCore4.dll
QtGui4.dll
QtSql4.dll
Sqldrivers\qsqlite4.dll
И все работает!
Были проблемы с подключение SQLLite пока не положил Sqldrivers\qsqlite4.dll.