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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: проблемы с QIBASE-драйвером  (Прочитано 7488 раз)
Ggg_old
Гость
« : Март 16, 2006, 21:50 »

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

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

P.S.
Я так намучался пока собрал этот QIBASE, что уже ничему удивляться не буду...
Записан
BaltikS
Гость
« Ответ #1 : Март 17, 2006, 09:34 »

А данные не на русском ли языке случайно?
Записан
Ggg_old
Гость
« Ответ #2 : Март 17, 2006, 10:33 »

на русском, а что?
Записан
BaltikS
Гость
« Ответ #3 : Март 17, 2006, 14:13 »

Вот-вот, на английском он выводит нормально, на русском - нет. То есть где строки с русским - не выводит... Но записывает. Как это решать так и не знаю, кто может знает? Подскажите...
Записан
Ggg_old
Гость
« Ответ #4 : Март 17, 2006, 17:08 »

Разобрался, это косяки QT-шного плагина QIBASE. Спасибо за подсказку что этот косяк проявляется, если есть русские буквы в наборе данных.
Все дело в том, что плагин, работая с клиентским API жестко задает юникод-кодировку.
Также плагин не имеет поддержки указания роли ROLE=...
Также плагин имеет какие-то косяки если писать select * from..., правильно надо писать надо select col1,col2 from ...
Вывод - рихтовать плагин.
Есть еще один выход, задать в QT приложении
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
тогда набор данных отображается. Только обязательно надо указывать имена колонок.
Записан
Rainbow
Гость
« Ответ #5 : Март 23, 2006, 13:48 »

Все имеет. Читать документацию. И все работает замечательно.

Вот только косяк был с блобами. Я писал как это пофиксить.  Если надо будет, в посик!
Записан
Ggg_old
Гость
« Ответ #6 : Март 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.
Записан
Rainbow
Гость
« Ответ #7 : Март 27, 2006, 10:29 »

Ну и что ты этим сказать хочешь? А что тебе мешает создать хендл ч-з АРІ FB а объект БД сдалать на базе этого хендла?
Только ненадо мне расказывать сказки что в документации такого нет.
Записан
odin
Гость
« Ответ #8 : Февраль 19, 2007, 15:51 »

всем привет...... недавно писал диплом жене с использованием firebird и столкнулся со всеми вышеперечисленными проблемами..
И что  в итоге
1. При записи данных в БД из своего же приложения глюки с русским отсутствуют....
2. Если выполнять запрос к процедуре с использованием prepare - глюки отсутствуют даже если не указывать колонки...
3. Для и спользования ROLE помогла правка драйвера (запользовал неисольюзущийся connectionOption()) ....
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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