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

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

Страниц: 1 ... 9 10 [11] 12 13 14   Вниз
  Печать  
Автор Тема: Транзакции Interbase  (Прочитано 150668 раз)
sarbash
Гость
« Ответ #150 : Июль 15, 2010, 08:23 »

В общем-то, я думаю, не очень критично, просто не во всех случаях есть необходимость в селективных ХП, но если по-другому не работает, то выбор остается небольшой... Мне интересно, можно ли вообще получить с QFIREBIRD возвращаемые значения из исполняемой ХП? То есть, на самом деле, это не просто любопытство, а есть в этом необходимость. Особенно это касается поддержки RETURNING, т.к. оно возвращает значения точно так же как и исполняемые ХП -- синглтоном. Если ХП и можно придать селективность, то что делать с RETURNING?

P.S. Я тут подумал и решил... Функционал по получению RETURN-значений от ХП критичен, можно, конечно, разными обходными путями вопрос решить, но зачем? Или ткните меня носом, если я в упор не вижу, что мне делать, чтобы извлечь RETURN-параметры, или я ещё раз попытаюсь допилить драйвер, чтобы всё работало и без глюков.
« Последнее редактирование: Июль 15, 2010, 23:04 от sarbash » Записан
sarbash
Гость
« Ответ #151 : Июль 16, 2010, 16:47 »

В общем, еще одна попытка решить проблему с возвращаемыми значениями ХП.
Прошлый патч я не сохранил, не помню, что там нагородил, этот вроде нормально работает.
Просьба потестить и оставить отзыв... Если всё это вообще кому-то ещё нужно, кроме меня.  Смеющийся
Записан
varkon
Гость
« Ответ #152 : Июль 16, 2010, 17:34 »

В общем, еще одна попытка решить проблему с возвращаемыми значениями ХП.
Прошлый патч я не сохранил, не помню, что там нагородил, этот вроде нормально работает.
Просьба потестить и оставить отзыв... Если всё это вообще кому-то ещё нужно, кроме меня.  Смеющийся
Слушай, прежде чем тестировать патч - а как ты получаешь это возвращаемое значение? Как именно оно у тебя не работает?
Записан
sarbash
Гость
« Ответ #153 : Июль 16, 2010, 20:54 »

Слушай, прежде чем тестировать патч - а как ты получаешь это возвращаемое значение? Как именно оно у тебя не работает?

Из моей переписки в ibpp-discuss@lists.sourceforge.net:
Цитировать
Le 23 mars 2010 à 07:13, Сергей Сарбаш a écrit :

> Hello, All.
>
> I suppose you know about this new feature of the Firebird 2.1 server.
> So, just the question. Has anyone already tried to implement this?
> Thank you.


There is nothing to implement in IBPP to use this nice feature.  I use it everyday.  The server returns the "returning" value just as it would do for a stored procedure returning a single value.  So just Statement->Get(...) after your Execute() and you're done.

The code sample by Borr says it all, too.

Enjoy Улыбающийся
--
Olivier Mascia

После "EXECUTE PROCEDURE"-query возвращаемые значения возвращаются процедурой. Улыбающийся
Вот коммент из qsql_ibase.cpp по этому поводу:
Код:
    // Stored Procedures are special - they populate our d->sqlda when executing,
    // so we don't have to call isc_dsql_fetch

Проще говоря, как написано в справке по QIBASE:
Цитировать
QIBASE Stored procedures

InterBase/Firebird return OUT values as result set, so when calling stored procedure, only IN values need to be bound via QSqlQuery::bindValue(). The RETURN/OUT values can be retrieved via QSqlQuery::value(). Example:

Код:
 QSqlQuery q;
 q.exec("execute procedure my_procedure");
 q.next();
 qDebug() << q.value(0); // outputs the first RETURN/OUT value

И чтобы всё именно так и работало, необходимый функционал реализован в qsql_ibase.cpp.
Я попытался подобный функционал реализовать и для QFIREBIRD. Без моего патча из НЕселективной процедуры получить возвращаемые значения никак. Подобная ситуация и с "INSERT ... RETURNING".

И последнее. Возможно, нужно ещё допилить и QFBResult::exec(), но тут я пока не уверен, возможно, всё уже сделано в недрах ibpp.
Записан
varkon
Гость
« Ответ #154 : Июль 17, 2010, 11:39 »

Проще говоря, как написано в справке по QIBASE:
Цитировать
QIBASE Stored procedures

InterBase/Firebird return OUT values as result set, so when calling stored procedure, only IN values need to be bound via QSqlQuery::bindValue(). The RETURN/OUT values can be retrieved via QSqlQuery::value(). Example:

Код:
 QSqlQuery q;
 q.exec("execute procedure my_procedure");
 q.next();
 qDebug() << q.value(0); // outputs the first RETURN/OUT value

И чтобы всё именно так и работало, необходимый функционал реализован в qsql_ibase.cpp.
Я попытался подобный функционал реализовать и для QFIREBIRD. Без моего патча из НЕселективной процедуры получить возвращаемые значения никак. Подобная ситуация и с "INSERT ... RETURNING".

И последнее. Возможно, нужно ещё допилить и QFBResult::exec(), но тут я пока не уверен, возможно, всё уже сделано в недрах ibpp.

стоп-стоп. Я прошу прощения -  ввиду объема своих задач не все успеваю - ну так а где здесь возвращаемый параметр? Точнее где его бинд? Или это должно делаться в вызове метода?
Записан
varkon
Гость
« Ответ #155 : Июль 17, 2010, 11:46 »

Я попробую пояснить чего имею ввиду. К примеру борландовские компоненты ставят в 0-позицию $RETURNING_VALUE для мссиквела - и что бы его считать - соотвественно надо обратится к параметру по имени или по индексу. В твоем коде почему то допущен нонсенс (ИМХО). Какое может быть value у запроса?
Записан
sarbash
Гость
« Ответ #156 : Июль 17, 2010, 19:57 »

Я вижу вашу загруженность, сам тоже завален.
Нонсенс допущен тролями. Не знаю, что там у мссиквела за $RETURNING_VALUE, честно, не работал с ним.
Борландовские компоненты и Qt -- это несколько разные библиотеки. Запрос возвращает value, не понимаю, что не так с этим?
Реализация такая. Ещё раз прочитайте мой пост, особенно цитату из справки на тему "QIBASE Stored procedures". Возвращаемое значение будет в резолт-сете, по-любому. Либо синглтон, чего на данный момент в драйвере просто нету, почему я и создал столько суеты вокруг ХП, либо multirow-набор. Вообще, в QIBASE хитро сделано, чтобы с помощью query.next() получить OUT-значения неселективных ХП. Там и isSelect() и exec() и gotoNext() для этого соответственным образом переопределены.
Я понадеялся, что всё необходимое для exec() уже есть в ibpp, достаточно лишь немного подпилить QFIREBIRD по аналогии с QIBASE.
Вообще, в этом плане использование ibpp в драйвере намного удобнее, чем свой велосипед изобретать...

P.S. Из справки:
Цитировать
Stored procedures that uses the return statement to return values, or return multiple result sets, are not fully supported. For specific details see SQL Database Drivers.
Наверное, можно было возврат значений сделать через биндинг, но мне проще было реализацию копировать с QIBASE, при этом опять-таки возможности зависят от конкретных драйверов конкретных БД, о чём и в справке сказано.
« Последнее редактирование: Июль 17, 2010, 22:43 от sarbash » Записан
varkon
Гость
« Ответ #157 : Июль 18, 2010, 01:17 »

Борландовские компоненты и Qt -- это несколько разные библиотеки.
Верю.
Так таки можно все же привести код который не работает но должен?
Записан
varkon
Гость
« Ответ #158 : Июль 18, 2010, 01:20 »

Наверное, можно было возврат значений сделать через биндинг
ну вообщето уат-параметр  - его таки надо биндить.
Записан
sarbash
Гость
« Ответ #159 : Июль 18, 2010, 18:22 »

Так таки можно все же привести код который не работает но должен?

Код:
q.exec("insert into RNAMES (NAME) values (:NAME) returning ID");

Ваши предложения по получению ID?
« Последнее редактирование: Июль 18, 2010, 18:29 от sarbash » Записан
const
Гость
« Ответ #160 : Сентябрь 15, 2010, 10:07 »

Я тут выше писал про проблемы с прочтением времени с базы. Выяснилось что дело в том, что файрбёрд хранит данные о милисекундах в виде 10-х долей. Соответвтеснно если получать время то получим из базы чтото типа 12:12:12:1210. Qt при перекодировании в Qtime проверяет её на входимость в диапазоны, в частности входимость милисекунд в диапазон ms<1000. При этом естественно большинство значений туда не попадает.
Как я понимаю, данное свойство файрбёрда необходимо учесть на уровне плагина. Отпишите плиз автору на гуглокод, у меня там аккаунта нет, а то мало ли тут не увидит.
Записан
Urvin
Гость
« Ответ #161 : Сентябрь 28, 2010, 17:13 »

Пожалуйста, откомпилируйте под Qt 4.7!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #162 : Сентябрь 28, 2010, 22:47 »

>>Пожалуйста, откомпилируйте под Qt 4.7!
зачем?
Записан

Юра.
sarbash
Гость
« Ответ #163 : Октябрь 21, 2010, 14:46 »

А что у нас с поддержкой массивов? Или никому не приходилось с ними иметь дело?
Что-то меня смутил простой break; на 627-й строке qsql_ibpp.cpp...
Записан
vlad-mal
Гость
« Ответ #164 : Ноябрь 12, 2010, 09:58 »

Попробовал сегодня поработать (Qt 4.7 /MinGW/ + FB2.5) со "стандартным" драйвером QIBASE: нормально возвращает значение returning, только next() выполнить нужно, а с QFIREBIRD - фиквам, с ошибкой.
Цитировать
QSqlQuery::value: not positioned on a valid record

Недопилено еще...Грустный
« Последнее редактирование: Ноябрь 12, 2010, 10:08 от vlad-mal » Записан
Страниц: 1 ... 9 10 [11] 12 13 14   Вверх
  Печать  
 
Перейти в:  


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