Russian Qt Forum
Сентябрь 30, 2024, 02:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: драйвер MySQL  (Прочитано 13930 раз)
cooler_3105
Гость
« : Апрель 16, 2009, 23:15 »

Как мне кажется, я собрал плагин мускула успешно (в папке %Qt%\plugins\sqldrivers лежат qsqlmysql4.dll и qsqlmysqld4.dll). Но при компиляции проекта двайвер мускула все равно не находится:
Код:
QSqlDatabase: QMYSQL driver not loaded

QSqlDatabase: available drivers: QIBASE QSQLITE QODBC3 QODBC

Cannot open database: QSqlError(-1, "Driver not loaded", "Driver not loaded")

В чем может быть проблема?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 17, 2009, 06:16 »

Поищи по форуму "Driver not loaded" и будет тебе счастье. Не поверишь, сколько постов с этой фразой найдешь.
Распиши по шагам как собирал плагин.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
cooler_3105
Гость
« Ответ #2 : Апрель 17, 2009, 10:08 »

Я собирал драйвер по схеме
Код:
This is a small HOWTO, explaining on how to convert the MySQL libraries
to something which is usable with MinGW.

1) Go to the MySQL lib directory:

   # cd <path_where_mysql_is_installed>\lib\opt

2) Produce a DEF file:

   # pexports libmysql.dll | sed "s/^_//" > libmysql.def

   *NOTE: pexports and sed come with MinGW utilities and msys.

3) Create the MinGW import library:

   # dlltool -U -d libmysql.def -l libmysql.lib.a

At this moment, a MinGW compatible library libmysql.lib.a is created.
But, the headers are still written this way they are using the M$
calling convention. We need to change this.

4) Open the header <path_where_mysql_is_installed>\include\mysql.h
   and change the following around line 44:

   Change:

   #define STDCALL __stdcall

   into:

   #undef  STDCALL
   #define STDCALL

*NOTE: The following is more a hack instead of a solution.
       Maybe you can come up with a cleaner patch.
       Use some extra #ifdef's or something ...

Now, we will build the Qt MySQL plugin using MinGW.

5) Go to the Qt MySQL plugin source directory:

   # cd <path_where_qt_is_installed>\src\plugins\sqldrivers\mysql

6) Launch qmake to generate the Makefile

   # qmake -o Makefile
"INCLUDEPATH+=<path_where_mysql_is_installed>\include"
     "LIBS+=-L<path_where_mysql_is_installed>\lib\opt" mysql.pro

7) Build the plugin

   # make

Никаких ошибок при компиляции не вылетоло, все было ок, появились дллки в %Qt%\plugins\sqldrivers
При попытке сборки драйвера способом:
Код:
1) Переходим в каталог с библиотеками MySQL:

  # cd <путь_к_установленному_mysql>\lib\opt
2) Создадим файл DEF:

  # reimp -d libmysql.lib
  *Прим: reimp идет вместе с утилитами MinGW и msys.
3) Создаем библиотеку импорта MinGW:

  # dlltool -k --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a
В этот момент создается MinGW-совместимая библиотека libmysql.a


4) Переходим в каталог с исходными файлами плагина Qt MySQL:

  # cd <каталог_инсталляции_qt>\src\plugins\sqldrivers\mysql
5) Запускаем qmake для генерирования Makefile

  # qmake -o Makefile "INCLUDEPATH+=<каталог_инсталляции_mysql>\include" "LIBS+=-L<каталог_инсталляции_mysql>\lib\opt -lmysql" mysql.pro
6) Собираем плагин

  # make
7) Убеждаемся, что libmysql.dll доступен через path. В случае отсутствия libmysql.dll приложение не сможет загрузить плагин и выдаст сообщение что нужного плагина нет. При этом в кэш плагинов - в моём случае - [HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults\Qt Plugin Cache 4.2.false] будет записана неверная информация.

8) Если произошла такая неприятность, чистим кэш плагинов - это можно сделать удалив из реестра ветку

  [HKEY_CURRENT_USER\Software\Trolltech\OrganizationDefaults]

На 6 пункте после выполненя make вылазит следующее:
Код:
mingw32-make -f Makefile.Debug all
mingw32-make[1]: Entering directory `C:/Qt/4.3.0/src/plugins/sqldrivers/mysql'
mingw32-make[1]: Nothing to be done for `all'.
mingw32-make[1]: Leaving directory `C:/Qt/4.3.0/src/plugins/sqldrivers/mysql'
mingw32-make -f Makefile.Release all
mingw32-make[1]: Entering directory `C:/Qt/4.3.0/src/plugins/sqldrivers/mysql'
mingw32-make[1]: Nothing to be done for `all'.
mingw32-make[1]: Leaving directory `C:/Qt/4.3.0/src/plugins/sqldrivers/mysql'
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Апрель 17, 2009, 11:40 »

Нужно было сначала make clean сделать.
Закинь рядом с плагином dll от MySQL.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
cooler_3105
Гость
« Ответ #4 : Апрель 17, 2009, 19:27 »

Мускул собрал Улыбающийся Но теперь вылазит ошибка следующего рода:
Код:
QSqlError(0, "QMYSQL: Unable to open database 'diabetes'", "")
Прошу подсказать что не так.
Записан
cooler_3105
Гость
« Ответ #5 : Май 10, 2009, 19:45 »

Прошу подсказать одну вещь: при подключении к БД под управлением MySQL
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("diabetes");
db.setUserName("cooler");
db.setHostName("195.122.253.11");
надо указывать путь к БД? Если да, то как это сделать? БД лежит на удаленной машине.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Май 12, 2009, 06:22 »

Путь указывать не нужно, нужно указать псевдоним, что ты уже сделал db.setDatabaseName("diabetes");.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Май 12, 2009, 11:15 »

>>нужно указать псевдоним,
А сам псевдоним как для MySQL'я указать, т.е. ассоциировать с конкретной БД?
Записан

Юра.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Май 12, 2009, 18:37 »

Не знаю как под мускулем, но под птицей есть файлик в котором есть записи
mybase=c:\mybase.fdb
И в клиентах указываешь именно mybase
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
cooler_3105
Гость
« Ответ #9 : Май 13, 2009, 08:07 »

Не знаю как под мускулем, но под птицей есть файлик в котором есть записи
mybase=c:\mybase.fdb
И в клиентах указываешь именно mybase
Да, под птицей юзается алиас... Может все таки кто-нибудь знает, как поступать с мускулем?
Записан
developer
Гость
« Ответ #10 : Май 13, 2009, 11:17 »

А ты проверь что ета база существует, а то она не откроется если ее там нету(как на локальной так и на удаленной машине). Проверь еще ip адрес удаленной машины. Также проверь права доступа к етой базе для других удаленных машин(твоя база просто может не пускать тебя с какой-то иной машины). Если ты не имееш прав доступа, тогда на локальной машине нужно их добавить в таблицу user базы mysql. (Внизу дескрипшн етой таблицы).
Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | varchar(60)                       |      | PRI |         |       |   ----------------------------- здесь простым инсертом вводиш хост с которого ты хочеш достучаться
| User                  | varchar(16)                       |      | PRI |         |       |    ----------------------------- здесь вводишь юзера, с правами которого ты будешь стучать(он должеш существовать в базе)
| Password              | varchar(41)                       |      |     |         |       |   ------------------------- здесь пароль
| Select_priv           | enum('N','Y')                     |      |     | N       |       |  ------------------- а здесь и внизу пошли твои права    Y(yes) or N(no). По умолчанию ставлятся в N. Тоесть исли ты не поправишь то твой юзер практически ничего не зможет
| Insert_priv           | enum('N','Y')                     |      |     | N       |       |
| Update_priv           | enum('N','Y')                     |      |     | N       |       |
| Delete_priv           | enum('N','Y')                     |      |     | N       |       |
| Create_priv           | enum('N','Y')                     |      |     | N       |       |
| Drop_priv             | enum('N','Y')                     |      |     | N       |       |
| Reload_priv           | enum('N','Y')                     |      |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     |      |     | N       |       |
| Process_priv          | enum('N','Y')                     |      |     | N       |       |
| File_priv             | enum('N','Y')                     |      |     | N       |       |
| Grant_priv            | enum('N','Y')                     |      |     | N       |       |
| References_priv       | enum('N','Y')                     |      |     | N       |       |
| Index_priv            | enum('N','Y')                     |      |     | N       |       |
| Alter_priv            | enum('N','Y')                     |      |     | N       |       |
| Show_db_priv          | enum('N','Y')                     |      |     | N       |       |
| Super_priv            | enum('N','Y')                     |      |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     |      |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     |      |     | N       |       |
| Execute_priv          | enum('N','Y')                     |      |     | N       |       |
Записан
cooler_3105
Гость
« Ответ #11 : Май 13, 2009, 19:41 »

База существует, права есть...
Т.е. если в строчке
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
я QMYSQL заменяю на QODBC (MySQL ODBC Driver 5.1 настроен на работу с этой БД), то все работает как положено.
Т.е. получается, что при работе с ODBC я настраиваю MySQL ODBC Driver, а при работе с родным драйвером MySQL ничего не настраиваю. Наверное при использовании драйвера MySQL надо тоже что-то где-то прописать...
Записан
developer
Гость
« Ответ #12 : Май 13, 2009, 23:02 »

Может у тебя плохая сеть, или файервол нетак настроен, попробуй отключить его на машине клиента и сервера(ето для начала). У меня была подобная ситуация, и ето было связано с плохой пропускной возможностью.
Записан
cooler_3105
Гость
« Ответ #13 : Май 13, 2009, 23:32 »

developer, спасибо за рекомендации, я проверю.Через сайт доступ к этой базе есть, поэтому скорее всего дело в моем компе. Попробую отключить фаервол. Т.е. насколько я понял, ты с мускулем работал, и говоришь что дополнительно ничего прописывать не надо, да?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #14 : Май 14, 2009, 01:01 »

Код:
m_DB.setDatabaseName( "D:\\Projects\\TravelBase\\TEST.FDB" );
m_DB.setHostName("192.168.1.101");
m_DB.setUserName("SYSDBA");
m_DB.setPassword("masterkey");

Вот простой код как я подключаюсь к БД firebird - т.е. алиасы не использую т.к. мне кажется это лишняя настройка на компе клиентов, но иногда наверное удобно. То есть в setDatabaseName - полный путь к БД, несмотря на то что к этой папке файловый доступ закрыт. Как в MySql не знаю - чтобы проверить доступен ли сервер с БД - пропингуйте через порт на кот. работает MySql. (я так проверяю telnet xxx.xxx.xxx.xxx 3050 - для FB) Меня например в Windows Брандмауер стандартный частенько обломить пытается...
« Последнее редактирование: Май 14, 2009, 01:09 от break » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.077 секунд. Запросов: 23.