Russian Qt Forum

Qt => Базы данных => Тема начата: Ggg_old от Март 16, 2006, 21:50



Название: проблемы с QIBASE-драйвером
Отправлено: Ggg_old от Март 16, 2006, 21:50
QT4.1.1 VC2003, Firebird1.5
Необходимо из хранимой процедуры получить резалтсет и отобразить его в tableview. Хранимка вызывается как
select * from procedure MY_PROCEDURE;
Если это делать через ODBC -драйвер (Gemini) То все зашибись.
Если через QIBASE - то отображаются только имена колонок, а самих данных нет.

Это я что-то накосячил или это драйвер такой?

P.S.
Я так намучался пока собрал этот QIBASE, что уже ничему удивляться не буду...


Название: проблемы с QIBASE-драйвером
Отправлено: BaltikS от Март 17, 2006, 09:34
А данные не на русском ли языке случайно?


Название: проблемы с QIBASE-драйвером
Отправлено: Ggg_old от Март 17, 2006, 10:33
на русском, а что?


Название: проблемы с QIBASE-драйвером
Отправлено: BaltikS от Март 17, 2006, 14:13
Вот-вот, на английском он выводит нормально, на русском - нет. То есть где строки с русским - не выводит... Но записывает. Как это решать так и не знаю, кто может знает? Подскажите...


Название: проблемы с QIBASE-драйвером
Отправлено: Ggg_old от Март 17, 2006, 17:08
Разобрался, это косяки QT-шного плагина QIBASE. Спасибо за подсказку что этот косяк проявляется, если есть русские буквы в наборе данных.
Все дело в том, что плагин, работая с клиентским API жестко задает юникод-кодировку.
Также плагин не имеет поддержки указания роли ROLE=...
Также плагин имеет какие-то косяки если писать select * from..., правильно надо писать надо select col1,col2 from ...
Вывод - рихтовать плагин.
Есть еще один выход, задать в QT приложении
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
тогда набор данных отображается. Только обязательно надо указывать имена колонок.


Название: проблемы с QIBASE-драйвером
Отправлено: Rainbow от Март 23, 2006, 13:48
Все имеет. Читать документацию. И все работает замечательно.

Вот только косяк был с блобами. Я писал как это пофиксить.  Если надо будет, в посик!


Название: Win1251->Cp866
Отправлено: Ggg_old от Март 23, 2006, 21:22
2 Модератор:
Что такое "посик":?:
Насчет задания роли. Я в QT И Firebird недавно, но когда разбирался с этой проблемой прошлось посмотреть реализацию
bool QIBaseDriver::open(...)
там в общем не сложно, вот ключевые куски:
Код:

static const char enc[8] = "UTF_FSS"; //Жестко задается кодировка
...
QByteArray ba;
ba.resize(usr.length() + pass.length() + sizeof(enc) + 6);
int i = -1;
ba[++i] = isc_dpb_version1;
//Пользователь
ba[++i] = isc_dpb_user_name;
ba[++i] = usr.length();
memcpy(ba.data() + ++i, usr.data(), usr.length());
i += usr.length();
//Пароль
ba[i] = isc_dpb_password;
ba[++i] = pass.length();
memcpy(ba.data() + ++i, pass.data(), pass.length());
i += pass.length();
//Кодировка
ba[i] = isc_dpb_lc_ctype;
ba[++i] = sizeof(enc) - 1;
memcpy(ba.data() + ++i, enc, sizeof(enc) - 1);
i += sizeof(enc) - 1;
//коннект к серверу
QString ldb;
if (!host.isEmpty())
    ldb += host + QLatin1Char(':');
    ldb += db;
    isc_attach_database(d->status, 0, const_cast<char *>(ldb.toLatin1().constData()), &d->ibase, i, ba.data());
....

Для задания роли надо еще прописать в описателе значение для isc_dpb_sql_role_name (IBASE API Guide)
В общем это не сложно, еще добавить пару строк... Я пока забил на это и воспользовался ODBC.


Название: проблемы с QIBASE-драйвером
Отправлено: Rainbow от Март 27, 2006, 10:29
Ну и что ты этим сказать хочешь? А что тебе мешает создать хендл ч-з АРІ FB а объект БД сдалать на базе этого хендла?
Только ненадо мне расказывать сказки что в документации такого нет.


Название: проблемы с QIBASE-драйвером
Отправлено: odin от Февраль 19, 2007, 15:51
всем привет...... недавно писал диплом жене с использованием firebird и столкнулся со всеми вышеперечисленными проблемами..
И что  в итоге
1. При записи данных в БД из своего же приложения глюки с русским отсутствуют....
2. Если выполнять запрос к процедуре с использованием prepare - глюки отсутствуют даже если не указывать колонки...
3. Для и спользования ROLE помогла правка драйвера (запользовал неисольюзущийся connectionOption()) ....