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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: unixODBC + mdbtools для работы с MS-Access в Linux  (Прочитано 9687 раз)
Zmeishe
Гость
« : Сентябрь 09, 2009, 09:52 »

Linux Mandriva 2007
Qt-4.5.1
доп пакеты
libunixODBC1-2.2.12-2mdv2007
libunixODBC1-devel-2.2.12-2mdv2007
unixODBC-2.2.12-2mdv2007
mdbtools собран из сырцов от Mandriva 2008 "mdbtools-0.6-0.20060524.2mdv2008.0.src.rpm"

Qt собрана с ключём -plugin-sql-odbc

db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("MDB");
db.open(); ругается на то, что отсутствует DSN в файле $HOME/.odbc.ini

Прописываю в файле $HOME/.odbc.ini следующую секцию
[MDB]
Description = MS Access file
Driver = /usr/local/lib/libmdbodbc.so
Database = /home/dm/work/address.mdb

после db.open(); программа валится с ошибкой сегментации

Через консоль проверяю работоспособность unixODBC и mdbtools
[dm@zmeishe]$ /usr/bin/isql MDB
SQL> select * from streets
...выдаёт содержимое таблицы...
SQLRowCount returns 425
425 rows fetched
SQL> quit

Всё работает.

Почему через Qt вылетает ? Что ещё нужно прописать ? Где ?
demos/sqlbrowser - тоже вылетает

Кстати, QODBC с базой IBASE работает великолепно.
Записан
KADABRA
Гость
« Ответ #1 : Сентябрь 09, 2009, 10:04 »

Цитировать
Почему через Qt вылетает ?
На какой строке вылетает?
Записан
Zmeishe
Гость
« Ответ #2 : Сентябрь 09, 2009, 10:25 »

Вылетает непосредственно на db.open();
Записан
KADABRA
Гость
« Ответ #3 : Сентябрь 09, 2009, 14:04 »

Вылетает непосредственно на db.open();
А внутри open, если отладить?
Записан
Zmeishe
Гость
« Ответ #4 : Сентябрь 09, 2009, 14:58 »

Попробовал.
Показал, что вылетает на SQLGetInfo в этом куске кода файла qsql_odbc.cpp
Код:
void QODBCDriverPrivate::checkSchemaUsage()
{
    SQLRETURN   r;
    SQLUINTEGER val;

    r = SQLGetInfo(hDbc,
                   SQL_SCHEMA_USAGE,
                   (SQLPOINTER) &val,
                   sizeof(val),
                   NULL);
    if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO)
        useSchema = (val != 0);
}

Записан
KADABRA
Гость
« Ответ #5 : Сентябрь 10, 2009, 10:46 »

Цитировать
Показал, что вылетает на SQLGetInfo в этом куске кода файла qsql_odbc.cpp
Какое значение hDbc при этом?
Можно попробовать обновить unixODBC до последней версии - что-то там поправили с SQLGetInfo.
Записан
Zmeishe
Гость
« Ответ #6 : Сентябрь 10, 2009, 12:48 »

Обновил до unixODBC-2.2.14 не помогло.
Валится в том же месте.
hDbc имеет значение адреса 0x8261fb0 типа SQLHANLE
« Последнее редактирование: Сентябрь 10, 2009, 12:54 от Zmeishe » Записан
Zmeishe
Гость
« Ответ #7 : Сентябрь 10, 2009, 13:08 »

Дело в следующем:

Для Qt последний параметр нах не нужен в вызове этой функции.
SQLGetInfo(hDbc,
                   SQL_SCHEMA_USAGE,
                   (SQLPOINTER) &val,
                   sizeof(val),
                   NULL);

А в пакете mdbtools в файле odbc.c в реализации SQLGetInfo не проверяя его на NULL берут разадресовывают и присваивают значение.
Усё, ошибка сегментирования.
Щас поправлю за них.
Записан
Zmeishe
Гость
« Ответ #8 : Сентябрь 10, 2009, 15:07 »

Ну, поправил.
База открывается.
Запросы выполняются только при условии, sqlQuery->setForwardOnly( true );

Код:
int i = 0;
while(sqlQuery->next())
{
  qDebug() << ++i;
}
Выводит 1, 2, 3 ... 425
Т.е. записи он получил.

На этом всё.
Попытка получить значение какого-нибудь поля приводит к ошибке сегментации.

Код:
QSqlRecord rec = sqlQuery->record();
int column = rec.indexOf( "ID" );
while( sqlQuery->next() )
{
  sqlQuery->value( column ).toString(); // ошибка сегментации.
  qDebug() << ++i;
}
 
Типа, данные есть, но не получишь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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