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

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

Страниц: 1 ... 3 4 [5] 6 7 ... 14   Вниз
  Печать  
Автор Тема: Транзакции Interbase  (Прочитано 145791 раз)
ax
Чайник
*
Offline Offline

Сообщений: 60


Просмотр профиля
« Ответ #60 : Март 13, 2010, 15:27 »

Версия 0.17 Qt SQL driver for Firebird with IBPP library.
http://code.google.com/p/qtfirebirdibppsqldriver

Изменения в версии 0.17
+ "make install" will copy driver to [QT_INSTALL_PLUGINS]/sqldrivers
- fixed: character sets exception ( Issue 8 )
    Conversions between Firebird and Qt
      "ASCII" = "IBM 866"
      "BIG_5" = "Big5"
      "CYRL" = "KOI8-R"
      "DOS850" = "IBM 850"
      "DOS866" = "IBM 866"
      "EUCJ_0208" = "JIS X 0208"
      "GB_2312" = "GB18030-0"
      "ISO8859_[1-9, 13]" = "ISO 8859-[1-9, 13]"
      "KSC_5601" = "Big5-HKSCS"
      "SJIS_0208" = "JIS X 0208"
      "UNICODE_FSS" = "UTF-32"
      "UTF8" = "UTF-8"
      "WIN125[0-8]" = "Windows-125[1-8]"
    else use QTextCodec::codecForLocale()

по вопросу с query.prepare, query.bind: будет работать если prepare и цикл bind, exec обернуть транзакцией как в примере у Tonal

Вынеси транзакцию за цикл:
Код
C++ (Qt)
   QSqlDatabase DBStoreWrite= QSqlDatabase::addDatabase("QFIREBIRD","DBStoreWrites");
   DBStoreWrite.setConnectOptions("CHARSET=WIN1251");
   DBStoreWrite.setDatabaseName("DBStore");
 
 
   DBStoreWrite.open("SYSDBA","masterkey");
 
   QSqlQuery SqlTest(DBStoreWrite);
   DBStoreWrite.transaction();
   SqlTest.prepare("INSERT INTO Cans (CANNUM,DTTM,CANVALUE) VALUES (:CANNUM,'NOW',:CANVALUE)");
   for (int i=0;i<2;i++)
   {
       SqlTest.bindValue(0,1);
       SqlTest.bindValue(1, i);
 
       SqlTest.exec();
   }
   DBStoreWrite.commit();
 
   DBStoreWrite.close();
 
Заодно и скорость чуть поднимется. Улыбающийся

Без транзакции каждый exec будет обернут в неявную транзакцию и комитится, очищая prepare

Вопросы и пожелания сюда и на http://code.google.com/p/qtfirebirdibppsqldriver/issues/list
Записан
Dimich
Гость
« Ответ #61 : Март 13, 2010, 20:18 »

axax, по моему, для кодировок ASCII, CYRL и UNICODE_FSS не верно указаны кодировки Qt
Могу сослаться на книгу -  Хелен Борри, Firebird - руководство разработчика. Там, в конце книги, указана таблица поддерживаемых Firebird кодировок. Аналогичная таблица приведена в статье "Кодовые страницы Firebird и Interbase"
http://www.ibprovider.com/rus/documentation/charsets_collations.html

ASCII - это семибитная кодировка
CYRL - кодировка для совместимости с досовскими версиями Paradox и dBase
UNICODE_FSS - вариант UTF-8

Мой вариант:
ASCII - "ISO 8859-1"
CYRL - "IBM 866"
UNICODE_FSS - "UTF-8"
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #62 : Март 13, 2010, 20:33 »

Dimich, в части первых двух согласен с тобой.
А вот UNICODE_FSS меня смущает, т.к. в FB <=2.0 есть и UTF-8
Может там какие-то нюансы в UNICODE_FSS есть?
Записан

Юра.
Dimich
Гость
« Ответ #63 : Март 15, 2010, 10:12 »

Начиная с версии 2.0 в Firebird введены новые charset-ы
KOI8-R
KOI8-U
UTF8

В Firebird 1.5.xx UTF8 был всего лишь алиасом UNICODE_FSS
C версии  Firebird 2 UTF8 - новый charset, альтернативная (исправленная) реализация UTF-8

Вольный перевод:
У кодировки UNICODE_FSS много проблем - это старая версия UTF8, которая принимала некорректные строки и не правильно выдавала максимальную длину строки. В FB 1.5.x UTF8 является псевдоним к UNICODE_FSS.
Теперь, UTF8 - новая кодировка, без врожденных проблем UNICODE_FSS.

См: http://www.firebirdsql.org/rlsnotesh/rlsnotes20.html

Еще нестыковка:
KSC_5601 - южнокорейская кодировка (современное обозначение KS X 1001)
Big5-HKSCS - китайская кодировкая для диалекта распространенного в Гонконге

Возвращаясь к нашим баранам:
ASCII - "ISO 8859-1"
CYRL - "IBM 866"
UNICODE_FSS - "UTF-8"
UTF8 - "UTF-8"
KOI8-R - "KOI8-R"
KOI8-U - "KOI8-U"
KSC_5601 - ?
« Последнее редактирование: Март 15, 2010, 10:21 от Dimich » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #64 : Март 15, 2010, 15:20 »

>>KSC_5601 - ?
Тут можно пойти таким путём: в Qt основным ключом является код по IANA, а на её сайте можно посмотреть, что же это такое.
Записан

Юра.
const
Гость
« Ответ #65 : Март 17, 2010, 15:32 »

Цитировать
по вопросу с query.prepare, query.bind: будет работать если prepare и цикл bind, exec обернуть транзакцией как в примере у Tonal
Сразу отличия своего кода от кода Tonal не заметил. Внёс prepare в транзакцию и заработало. спасибо.
Записан
sarbash
Гость
« Ответ #66 : Март 18, 2010, 15:20 »

Когда делаешь mingw32-make install, в каталог с плагинами копируется только dll, без a-файла.
Неплохо бы поправить это дело, если это вообще реализуемо. Если нет, то тоже ничего страшного. Улыбающийся
Спасибо.

Записан
sarbash
Гость
« Ответ #67 : Март 19, 2010, 15:20 »

Как я понял, этот драйвер не может QSqlDriver::lastInsertId().
Поделитесь, пожалуйста, кто как решает проблему с Primary Key при добавлении новой записи? У меня первая мысль - дёрнуть селектом генератор, и использовать полученное значение во вставке.
(Обсуждение можно вынести в отдельный топик, т.к. оно только косвенно касается этого драйвера).
Заранее благодарю.
Записан
gigabyte
Гость
« Ответ #68 : Март 19, 2010, 17:02 »

в программе:
Код:
insert into .... (primary_column) values (null)
А в триггере before insert
пишешь
Код:
if (primary_column is null) then primary_column = gen_id(primary_generator,1)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #69 : Март 19, 2010, 17:11 »

gigabyte, тут даже вставлять в ПК и не надо, просто вставлять нужные поля нужные данные, а тригер сделает своё дело.
Записан

Юра.
gigabyte
Гость
« Ответ #70 : Март 19, 2010, 18:53 »

ну да
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #71 : Март 19, 2010, 19:38 »

И все-таки, как при этом узнать id последней вставленной записи?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #72 : Март 19, 2010, 19:42 »

>>id последней вставленной записи?
Например так:

select max(id)
from tablename
Записан

Юра.
sarbash
Гость
« Ответ #73 : Март 19, 2010, 20:30 »

всем спасибо за участие.
я решил кошерным методом - дернул генератор, полученное значение идёт в качестве id новой записи.
насколько я понимаю ситуацию, именно таким методом это работает и в датасетах дельфёвых, с коими я имел (не)счастье иметь дело в начале пути.
А другого пути просто нету. Триггер - это несомненно хорошо, но он не отдаст полученный id, как вы его узнаете?

P.S. Ещё раз вернулся к книжке "Мир Interbase", дабы освежить воспоминания, там тоже говорится, что при использовании триггера значение id узнать невозможно, остается только дёргать генератор. Улыбающийся

P.P.S. Думаю, на этом данный вопрос можно закрыть.

P.P.P.S. Ага, а вот темы с "The RETURNING Clause" мы тут не вспомнили, хотя вроде в форуме её где-то вскользь касались... А ведь это ещё один способ получить id, хотя он и относится только к Птице 2.1 версии и только к singleton set. Интересно, в QSQlQuery это будет работать? Надо бы проверить...
« Последнее редактирование: Март 19, 2010, 20:37 от sarbash » Записан
gigabyte
Гость
« Ответ #74 : Март 19, 2010, 20:30 »

>>id последней вставленной записи?
Например так:

select max(id)
from tablename
Так можно делать только если id - простое число, если же этот id формируэтся но некоему алгоритму:
AABBBBCCCC, где АА - номер отдела, BBBB - тип документа, СССС - собственно инкремент
то такой алгоритм не подойдет
Записан
Страниц: 1 ... 3 4 [5] 6 7 ... 14   Вверх
  Печать  
 
Перейти в:  


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