Russian Qt Forum

Qt => Базы данных => Тема начата: Zmeishe от Сентябрь 09, 2009, 09:52



Название: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: 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 работает великолепно.


Название: Re: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: KADABRA от Сентябрь 09, 2009, 10:04
Цитировать
Почему через Qt вылетает ?
На какой строке вылетает?


Название: Re: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: Zmeishe от Сентябрь 09, 2009, 10:25
Вылетает непосредственно на db.open();


Название: Re: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: KADABRA от Сентябрь 09, 2009, 14:04
Вылетает непосредственно на db.open();
А внутри open, если отладить?


Название: Re: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: Zmeishe от Сентябрь 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);
}



Название: Re: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: KADABRA от Сентябрь 10, 2009, 10:46
Цитировать
Показал, что вылетает на SQLGetInfo в этом куске кода файла qsql_odbc.cpp
Какое значение hDbc при этом?
Можно попробовать обновить unixODBC до последней версии - что-то там поправили с SQLGetInfo.


Название: Re: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: Zmeishe от Сентябрь 10, 2009, 12:48
Обновил до unixODBC-2.2.14 не помогло.
Валится в том же месте.
hDbc имеет значение адреса 0x8261fb0 типа SQLHANLE


Название: Re: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: Zmeishe от Сентябрь 10, 2009, 13:08
Дело в следующем:

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

А в пакете mdbtools в файле odbc.c в реализации SQLGetInfo не проверяя его на NULL берут разадресовывают и присваивают значение.
Усё, ошибка сегментирования.
Щас поправлю за них.


Название: Re: unixODBC + mdbtools для работы с MS-Access в Linux
Отправлено: Zmeishe от Сентябрь 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;
}
 
Типа, данные есть, но не получишь.