Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Qt, Interbase и ODBC
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
Litkevich Yuriy
У меня на виндовозе стоит ОпенСорсовская версия Qt4, собраная по умолчанию, есть прога которую я делал в Borland C++Builder 5 и использующая БД Interbase.
На другой машине стоит Firebird-2.0.1.12855 и Борлондовская прога свободно там работает, этот же результат хочу получить на Qt'ях.

Вопрос такой, как лучше прицепиться к этой БД с помощью Qt и возможно ли это для ОпенСорсовской версии Qt4?
Есть ли в ОпенСорсовской версии нужные штуки?
И еще некоторые люди рекомендуют использовать унифицированный механизм под названием ODBC.

А примеры как-то все заточены под MySQL.

Собственно вопросу не удивляйтесь, я не програмер, а разработчик РЭА и с БД месяца 3 как познакомился.
ViGOur
Цитата(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
А чем отличается плагин от просто библиотеки?

У меня была такая мысль:
скомандовать:

mingw32-make.exe confclean
configure.exe -platform win32-g++ -qt-sql-odbc
mingw32-make.exe


чтобы вернуть в иходное состояние и собрать по новой, только незнал прокатит с ODBC или нет.
Да и потом уменя на машине (с MinGW) Qt'я собирается примерно 2,5 часа :(, долго.

А вот по поводу плагина, какие достоинства и не достатки его применения перед моим вариантом. Это просто быстрее или я при этом что-то теряю?
balbes
При указании поддержки того же ODBC в configure и его сборки ODBC статически "привязывается" к Qt, а при сборке в качестве плагина динамически, и не "привязывется" к Qt, что быстрей и легче.

Других различий не знаю.
Litkevich Yuriy
Несколько не догнал, что значит привязывается?
когда я скомпилю свою прогу, и потащу с ней зарание определенные Qt'явые dll'ки на другую машину, в этом случае в зависимости от того как я собирал, надо будет поступать по разному?
ViGOur
Цитата(Litkevich Yuriy @ 11.1.2008, 14:12) *
Несколько не догнал, что значит привязывается?
По всей видимости имелось ввиду, что собирается как часть Qt библиотеки, а не как дополнение.
Litkevich Yuriy
...продолжаю, использую ODBC для соединения с IntrBase через драйвер Firebird_ODBC_1.2.0.69-Win32.exe
Немогу побороть проблему:
База содержит руский текст в кодировке Win1251
В "Источнике данных ODBC" если выставляю такую же кодировку, то в своей тестовой проге таблицы содержащие русские символы пустые, видны только шапки столбцов, если ставлю NONE, то вижу квадратики вместо русских символов, как можно поборотся?
может кто сталкивался?
ViGOur
Ну так в Qt по умолчанию используется Unicode, попробуй перевести в 1251 и заживешь... :)
Litkevich Yuriy
если в функции main пишу так:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));

то все отображается коректно, а как-нибудь можно задать кодек только для конкретного класса, т.е. чтобы основной был другим.
собственно используется связка QSqlTableModel и QTableView, хочу чтобы толко для них или одного из них, даже незнаю кому именно, устанавливался индивидуальный кодек, можно ли так сделать?
ViGOur
По всей видимости без переопределения класса QTextCodec нет, так как setCodecForCStrings статическая функция и использует статическую переменную. :)

Не понятно, зачем тебе в одном месте использовать 1251, а в другом Unicode? :)
Litkevich Yuriy
например, писать код в UTF-8, можно в лине и в виндовозе - кодировка универсальная,
А попалась ранее созданая БД с кодировкой Win1251, не переделывать же из-за нее прогу
ViGOur
Так сделай кодировку настраиваемой. :)
Litkevich Yuriy
как? и где?

--
у меня пока в голове вертится такая мысль:
создать свою модель, а вней делать запрос с указанием кодировки и конвертированием выборки в юникод, но пока не придумал как к этому делу подойти
ViGOur
Цитата(Litkevich Yuriy @ 12.3.2008, 14:42) *
как? и где?
В инишку пишешь БД и ее кодировку, а в коде относительно них и пляшешь.
Litkevich Yuriy
не получится, у меня три БД и все с разными кодировками DOS-rus(Paradox), WIN1251 (IntrBase 5.x), UTF-8 (Firebird 2.x), из первых двух данные собираются, + данные через COM-порт с девайсов и в третью кладутся
ViGOur
Цитата(Litkevich Yuriy @ 12.3.2008, 15:00) *
DOS-rus(Paradox), WIN1251 (IntrBase 5.x), UTF-8 (Firebird 2.x)
Однако! :)

Тады нужно искать, как такое сделать, я пока даже и не знаю.
Litkevich Yuriy
блин, все облазил, попробывал так:
  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); //UTF-8Windows-1251
  QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));

думал раз уж в ODBC менеджере я указваю кодировку, то манеджер будет из нее в локальную конвертировать, а локальную я в программе указал.
фигушки не работает, тогда не понимаю как вообще это в Qt'ях работает, гдето упоминалось, что поумолчанию при работе с БД тип данных Qstring используется, наверное это мешает.

И непойму почему в Qt'ях непредусмотренно задание кодировки БД. :(
(в борланде индивидуально для каждого псевдонима можно кодировку выбрать)
ViGOur
А ты когда устанавливаешь кодек, до чтения строк из БД или после?
Просто нужно устанавливать до чтения в ту кодировку, а которой находится БД.
Litkevich Yuriy
приведенные выше строки определены в функции 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"));
...
}

на буржуйских форумах люди тоже с этим парятся, тем кому надо кодировку БД отличную от основной, в коде делают селекты руками прекодируют зарание инициализированными кодеками, при вставке и обновлении процесс тот-же только в обратную сторону, а это ЗАД, неужели это единственный способ?
:wacko:
Tonal
Два вопроса:
1) Какую кодировку ты указываешь при подключении к базе?
Я бы использовал для Firebird UTF8, для InterBase UNICODE_FSS.
2) Почему не использовать штатный драйвер Firebird/InterBase из поставки Qt Open Source?
Litkevich Yuriy
Цитата(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
Вобщем порыскав по инету, пришел к следующему выводу:
Надо дать Qt'ям в Юникоде, как-то это можно сделать в самой БД, а настройки ODBC, Qt'я говорят в гробу видела, т.е. одни ест другие нет и это вроде как честно с точки зрения Юникодовского приложения, так как не оно должно заниматься перекодировками.

Плохо то, что БД разные, и видимо средствами ODBC нельзя унифицировано указать БД в какой кодировке она должна работать с внешним миром. Прийдется индивидуально задавать.
С Paradox'ом просто - русские символы понимает сходу, ну и две другие базы родственные должно катить:
SET NAMES [charset];

попробую так.
Tonal
Цитата(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
у меня одновременно незахотели собираться
-plugin-sql-odbc
-plugin-sql-ibase
только когда один из них, может конечно я чего нетак делал, но пока не до этого, сейчас Borland C++ Builder 5 рулит ;)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.