Полная версия этой страницы:
Qt, Interbase и ODBC
Litkevich Yuriy
11.1.2008, 13:00
У меня на виндовозе стоит ОпенСорсовская версия Qt4, собраная по умолчанию, есть прога которую я делал в Borland C++Builder 5 и использующая БД Interbase.
На другой машине стоит Firebird-2.0.1.12855 и Борлондовская прога свободно там работает, этот же результат хочу получить на Qt'ях.
Вопрос такой, как лучше прицепиться к этой БД с помощью Qt и возможно ли это для ОпенСорсовской версии Qt4?
Есть ли в ОпенСорсовской версии нужные штуки?
И еще некоторые люди рекомендуют использовать унифицированный механизм под названием ODBC.
А примеры как-то все заточены под MySQL.
Собственно вопросу не удивляйтесь, я не програмер, а разработчик РЭА и с БД месяца 3 как познакомился.
Цитата(Litkevich Yuriy @ 11.1.2008, 13:00)
Вопрос такой, как лучше прицепиться к этой БД с помощью Qt и возможно ли это для ОпенСорсовской версии Qt4?
Есть ли в ОпенСорсовской версии нужные штуки?
Так как ты поставил версию Qt по умолчанию, то тебе прийдется накатить плагин для ODBC, читай:
Как собрать ODBC плагин под WindowsВ опенсурсе полный набор, так что не беспокойся...
Цитата(Litkevich Yuriy @ 11.1.2008, 13:00)
А примеры как-то все заточены под MySQL.
В Qt работа c QMYSQL и QODBC различается только:
QSqlDatabase::addDatabase("QMYSQL"); // Для MySql
QSqlDatabase::addDatabase("QODBC"); // Для ODBC
Остальное все одинаково.
Но так как у тебя стоит InterBase с помощью Qt можно и для него плагин накатить:
Как собрать QIBASE плагин под Windows.
В принципе я бы именно этот способ тебе и рекомендовал, но решать тебе.
Litkevich Yuriy
11.1.2008, 13:45
А чем отличается плагин от просто библиотеки?
У меня была такая мысль:
скомандовать:
mingw32-make.exe confclean
configure.exe -platform win32-g++ -qt-sql-odbc
mingw32-make.exe
чтобы вернуть в иходное состояние и собрать по новой, только незнал прокатит с ODBC или нет.
Да и потом уменя на машине (с MinGW) Qt'я собирается примерно 2,5 часа
, долго.
А вот по поводу плагина, какие достоинства и не достатки его применения перед моим вариантом. Это просто быстрее или я при этом что-то теряю?
При указании поддержки того же ODBC в configure и его сборки ODBC статически "привязывается" к Qt, а при сборке в качестве плагина динамически, и не "привязывется" к Qt, что быстрей и легче.
Других различий не знаю.
Litkevich Yuriy
11.1.2008, 14:12
Несколько не догнал, что значит привязывается?
когда я скомпилю свою прогу, и потащу с ней зарание определенные Qt'явые dll'ки на другую машину, в этом случае в зависимости от того как я собирал, надо будет поступать по разному?
Цитата(Litkevich Yuriy @ 11.1.2008, 14:12)
Несколько не догнал, что значит привязывается?
По всей видимости имелось ввиду, что собирается как часть Qt библиотеки, а не как дополнение.
Litkevich Yuriy
12.3.2008, 13:25
...продолжаю, использую ODBC для соединения с IntrBase через драйвер Firebird_ODBC_1.2.0.69-Win32.exe
Немогу побороть проблему:
База содержит руский текст в кодировке Win1251
В "Источнике данных ODBC" если выставляю такую же кодировку, то в своей тестовой проге таблицы содержащие русские символы пустые, видны только шапки столбцов, если ставлю NONE, то вижу квадратики вместо русских символов, как можно поборотся?
может кто сталкивался?
Ну так в Qt по умолчанию используется Unicode, попробуй перевести в 1251 и заживешь...
Litkevich Yuriy
12.3.2008, 14:00
если в функции main пишу так:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
то все отображается коректно, а как-нибудь можно задать кодек только для конкретного класса, т.е. чтобы основной был другим.
собственно используется связка QSqlTableModel и QTableView, хочу чтобы толко для них или одного из них, даже незнаю кому именно, устанавливался индивидуальный кодек, можно ли так сделать?
По всей видимости без переопределения класса QTextCodec нет, так как setCodecForCStrings статическая функция и использует статическую переменную.
Не понятно, зачем тебе в одном месте использовать 1251, а в другом Unicode?
Litkevich Yuriy
12.3.2008, 14:30
например, писать код в UTF-8, можно в лине и в виндовозе - кодировка универсальная,
А попалась ранее созданая БД с кодировкой Win1251, не переделывать же из-за нее прогу
Так сделай кодировку настраиваемой.
Litkevich Yuriy
12.3.2008, 14:42
как? и где?
--
у меня пока в голове вертится такая мысль:
создать свою модель, а вней делать запрос с указанием кодировки и конвертированием выборки в юникод, но пока не придумал как к этому делу подойти
Цитата(Litkevich Yuriy @ 12.3.2008, 14:42)
как? и где?
В инишку пишешь БД и ее кодировку, а в коде относительно них и пляшешь.
Litkevich Yuriy
12.3.2008, 15:00
не получится, у меня три БД и все с разными кодировками DOS-rus(Paradox), WIN1251 (IntrBase 5.x), UTF-8 (Firebird 2.x), из первых двух данные собираются, + данные через COM-порт с девайсов и в третью кладутся
Цитата(Litkevich Yuriy @ 12.3.2008, 15:00)
DOS-rus(Paradox), WIN1251 (IntrBase 5.x), UTF-8 (Firebird 2.x)
Однако!
Тады нужно искать, как такое сделать, я пока даже и не знаю.
Litkevich Yuriy
12.3.2008, 16:02
блин, все облазил, попробывал так:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); //UTF-8Windows-1251
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
думал раз уж в ODBC менеджере я указваю кодировку, то манеджер будет из нее в локальную конвертировать, а локальную я в программе указал.
фигушки не работает, тогда не понимаю как вообще это в Qt'ях работает, гдето упоминалось, что поумолчанию при работе с БД тип данных Qstring используется, наверное это мешает.
И непойму почему в Qt'ях непредусмотренно задание кодировки БД.
(в борланде индивидуально для каждого псевдонима можно кодировку выбрать)
А ты когда устанавливаешь кодек, до чтения строк из БД или после?
Просто нужно устанавливать до чтения в ту кодировку, а которой находится БД.
Litkevich Yuriy
12.3.2008, 16:29
приведенные выше строки определены в функции main, буквально так:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); //UTF-8Windows-1251
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
...
}
на буржуйских форумах люди тоже с этим парятся, тем кому надо кодировку БД отличную от основной, в коде делают селекты руками прекодируют зарание инициализированными кодеками, при вставке и обновлении процесс тот-же только в обратную сторону, а это ЗАД, неужели это единственный способ?
Два вопроса:
1) Какую кодировку ты указываешь при подключении к базе?
Я бы использовал для Firebird UTF8, для InterBase UNICODE_FSS.
2) Почему не использовать штатный драйвер Firebird/InterBase из поставки Qt Open Source?
Litkevich Yuriy
13.3.2008, 12:18
Цитата(Tonal @ 13.3.2008, 11:49)
1) Какую кодировку ты указываешь при подключении к базе?
в "Источнике данных ODBC" указавал родную для БД, Unicod'ы разные и NONE
Цитата(Tonal @ 13.3.2008, 11:49)
2) Почему не использовать штатный драйвер Firebird/InterBase из поставки Qt Open Source?
во-первых, читай предыдущие посты о применямых БД,
во-вторых, есть подозрение, что драйвер ODBC не совместим с драйвером ibase,
первый отменяет определения типов заданных ibase'ом (пошерстил немного исходники)
Litkevich Yuriy
13.3.2008, 14:50
Вобщем порыскав по инету, пришел к следующему выводу:
Надо дать Qt'ям в Юникоде, как-то это можно сделать в самой БД, а настройки ODBC, Qt'я говорят в гробу видела, т.е. одни ест другие нет и это вроде как честно с точки зрения Юникодовского приложения, так как не оно должно заниматься перекодировками.
Плохо то, что БД разные, и видимо средствами ODBC нельзя унифицировано указать БД в какой кодировке она должна работать с внешним миром. Прийдется индивидуально задавать.
С Paradox'ом просто - русские символы понимает сходу, ну и две другие базы родственные должно катить:
SET NAMES [charset];
попробую так.
Цитата(Litkevich Yuriy @ 13.3.2008, 15:18)
Цитата(Tonal @ 13.3.2008, 11:49)
1) Какую кодировку ты указываешь при подключении к базе?
в "Источнике данных ODBC" указавал родную для БД, Unicod'ы разные и NONE
Тут я не в курсях - только игрался.
Цитата(Litkevich Yuriy @ 13.3.2008, 15:18)
Цитата(Tonal @ 13.3.2008, 11:49)
2) Почему не использовать штатный драйвер Firebird/InterBase из поставки Qt Open Source?
во-вторых, есть подозрение, что драйвер ODBC не совместим с драйвером ibase,
первый отменяет определения типов заданных ibase'ом (пошерстил немного исходники)
Что значит "не совместим"?
У меня Qt собрана с -plugin-sql-ibase -plugin-sql-mysql -plugin-sql-odbc -plugin-sql-sqlite (раньше ещё pg-собирал). Только что, в демосе sqlbrowser подключил их все.
Что я не так делаю?
Драйвер ibase работает со всеми версиями Interbase/Firebird.
Litkevich Yuriy
13.3.2008, 21:52
у меня одновременно незахотели собираться
-plugin-sql-odbc
-plugin-sql-ibase
только когда один из них, может конечно я чего нетак делал, но пока не до этого, сейчас Borland C++ Builder 5 рулит
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.