Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 [все] |
Konstantin-78 Member Откуда: Земля Сообщений: 399 |
Доброе время суток, такой вопрос: У меня DELPHI 10.2, ibx19,19, ни как не найду информацию о поддержке IBX оператора RETURNING. Я его хочу использовать в IBQuery (после вставки строки), ну как тут уже писали, предыдущие версии его не поддерживали. |
2 окт 18, 13:45 [21692597] Ответить | Цитировать Сообщить модератору |
Любезный Member Откуда: Сообщений: 575 |
ЕМНИП, такого предиката в InterBase нет. Следовательно, в IBX он без допиливания не поддерживается. |
2 окт 18, 13:47 [21692600] Ответить | Цитировать Сообщить модератору |
Konstantin-78 Member Откуда: Земля Сообщений: 399 |
Любезный, Значит без внутренней процедуры не обойтись? |
2 окт 18, 13:51 [21692608] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
Konstantin-78, а тупо попробовать? |
2 окт 18, 13:58 [21692617] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3747 |
Что-то мне кажется, что если тупо засунуть INSERT RETURNING в обычный TIBQuery или TIBDataset и сделать Open, то всё заработает само. |
2 окт 18, 14:12 [21692645] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 24929 |
Наверное еще никого это простая мысль не посещала. :) |
||
2 окт 18, 14:14 [21692651] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
Прикинь, оно и работает. |
||
2 окт 18, 14:16 [21692657] Ответить | Цитировать Сообщить модератору |
Konstantin-78 Member Откуда: Земля Сообщений: 399 |
Типа так?: var q: integer; begin IBQuery1.Close; IBQuery1.SQL.Clear; IBQuery1.SQL.Text := 'insert into Tab (ID, STR) values (GEN_ID(GN, 1), :STR) returning ID'; IBQuery1.Params[0].AsString := 'qwe'; IBQuery1.Open; IBTransaction1.CommitRetaining; q := IBQuery1.ParamByName('ID').Value; end; с ошибкой на "q := IBQuery1.ParamByName('ID').Value;" 'IBQuery1: List index out of bounds (0)'. |
||
2 окт 18, 14:23 [21692684] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46934 |
Нет. Немного не так. Любые значения возвращаются через Fields. И запрос с RETURNING рассматривается не как select, а как execute procedure. Posted via ActualForum NNTP Server 1.5 |
||
2 окт 18, 14:29 [21692695] Ответить | Цитировать Сообщить модератору |
Konstantin-78 Member Откуда: Земля Сообщений: 399 |
Вы имели в виду вот так? var q: integer; begin IBQuery1.Close; IBQuery1.SQL.Clear; IBQuery1.SQL.Text := 'insert into Tab (ID, STR) values (GEN_ID(GN, 1), :STR) returning ID'; IBQuery1.Params[0].AsString := 'qwe1'; IBQuery1.ExecSQL; IBTransaction1.CommitRetaining; q := IBQuery1.Fields[0].AsInteger; end; |
||
2 окт 18, 14:40 [21692721] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46934 |
За такой код я бы отрывал руки с запретом на профессию, но в целом таки да, как-то так. Posted via ActualForum NNTP Server 1.5 |
||
2 окт 18, 14:45 [21692727] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
Konstantin-78, только что проверил - работает: var IBSQL1 : TIBSQL; ... begin ... IBSQL1.SQL.Text := 'insert into t (name) values (''Вася'') returning id'; IBSQL1.ExecQuery; id := IBSQL1.FieldByName('id').AsInteger; |
2 окт 18, 14:46 [21692728] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3747 |
Konstantin-78, Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining. Иначе два варианта: 1. Ты сменишь профессию, а твоё поделие придется переделывать другому; 2. Тебе самому придется всё переделывать со временем. |
2 окт 18, 14:54 [21692748] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
Прямо вот так "никогда"? Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку? |
||
2 окт 18, 14:58 [21692756] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 24929 |
Использовать датасеты, которые поддерживают 2 транзакции. Читающая длинная, пишущая - короткая. |
||||
2 окт 18, 15:26 [21692814] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3747 |
Ты имеешь ввиду - редактировать гриды "в гриде"? Зачем это вообще надо? Если уж надо - делаешь форму редактирования запись, после редактирования - стартуешь пишущую транзакцию, делаешь инсерт/апдейт, commit, refresh датасета, всё. Либо использовать датасеты с двумя транзакциями, как сказал ужа wadman. Но, имхо, это нужно чаще всего для редактирования гридов в гридах, что я считаю уродством. |
||
2 окт 18, 15:38 [21692838] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3747 |
А датасет должен быть открыт в read-only транзакции, ессно. |
2 окт 18, 15:39 [21692840] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
Т.е., не использовать датасеты ibx. Или использовать их после допиливания. А чем плоха длинная "пишущая" транзакция "стандартного" датасета ibx, которая 99,999% времени ничего не пишет, кроме короткого быстрого post с последующим немедленным CommitRetaining? Расскажи, пожалуйста. |
||||
2 окт 18, 15:40 [21692843] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
Ну вот если в этой транзакции данные не модифицируются - в чем проблема? |
||
2 окт 18, 15:42 [21692850] Ответить | Цитировать Сообщить модератору |
DarkMaster Member Откуда: Donetsk,Ukraine Сообщений: 6150 |
В этой - не модифицируются. В других - вполне себе (у других пользователей). Получаешь накопление ненужных версий записи. |
||||
2 окт 18, 16:04 [21692896] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
После CommitRetaining начнут копиться версии? |
||||
2 окт 18, 16:11 [21692904] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
Да, kdv пишет, что такое может случиться, в общем случае следует избегать Retaining, но для датасетов ibx вариантов нет, или допиливать или изменения в отдельной транзакции делать, ручками; или таки c Retainig - но учитывать ситуацию и понимать. |
||||
2 окт 18, 16:44 [21692976] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 27795 |
вот зачем такую стыдобу писать? Мало того, CommitRetaining, так он еще между открытием запроса и получением значения. Кто вас такому научил? Выполнил insert, получил данные, сделал commit, если надо. CommitRetaining для insert/update/delete ни к селу, ни к городу. |
||
2 окт 18, 17:36 [21693049] Ответить | Цитировать Сообщить модератору |
DmSer Member Откуда: Пенза Сообщений: 724 |
Со стандартными компонентами IBX приходится использовать in-memory-dataset (например, TRXMemoryData или что-нибудь посвежей) и его подключать к гриду. В этом случае: 1. Обеспечивается независимость от качества соединения с БД (данные не исчезнут при дисконнекте) 2. При добавлении / изменении / удалении записи не требуется переоткрывать весь датасет 3. По факту получается не очень много дополнительного кода. |
||
2 окт 18, 17:49 [21693067] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
DmSer, да ну нафиг, уж лучше старые фибы. |
2 окт 18, 17:54 [21693074] Ответить | Цитировать Сообщить модератору |
DmSer Member Откуда: Пенза Сообщений: 724 |
Я нашёл одно полезное свойство CommitRetaining: если при решении задачи требуется обработать множество строк (например, финансовые операции) и для каждой операции требуется закоммитить транзакцию, то с CommitRetaining запросы с параметрами будут выполнены быстрее, поскольку не будет каждый раз заново выполняться операция PREPARE. Если база находится на отдельном компьютере, а скорость соединения не особо быстрая, то ускорение может быть в несколько раз. |
||
2 окт 18, 17:56 [21693075] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3747 |
Тем, что эта пишущая транзакция сборке мусора будет очень мешать. Если она будет открыта несколько дней (и ничего не делать при этом, как ты говоришь - висеть себе и всё) - то эти несколько дней не будет сборки мусора. |
||
2 окт 18, 17:57 [21693078] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46934 |
Если твои компоненты доступа распрепарируют запрос при коммите, это их проблемы. Обычно препарированный запрос способен нормально жить аж до дисконнекта. Posted via ActualForum NNTP Server 1.5 |
||
2 окт 18, 17:59 [21693081] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3747 |
Разве Prepare делается для каждой транзакции? Не очень верю. Я использую CommitRetaining в одном месте: для мониторинга доступности базы. RORC-транзакции делаю CommitRetaining по таймеру. |
||
2 окт 18, 18:00 [21693082] Ответить | Цитировать Сообщить модератору |
DmSer Member Откуда: Пенза Сообщений: 724 |
Конечно они лучше, тем более сейчас они вроде халявные :) Но вот встанет у меня задача переделать один мой проект (там пара-тройка сотен тыщ строк кода) под Линукс - опаньки, а там есть для Лазаруса допиленный IBX, т.е. задачу можно будет решить за ограниченное время, учитывая, что в проекте не менее тысячи различных запросов к БД. А с фибами будет всё намного сложнее. Кстати, никто проверял, в последних версиях Delphi под Линукс компоненты IBX случайно с Firebird не умеют работать? |
||
2 окт 18, 18:04 [21693089] Ответить | Цитировать Сообщить модератору |
DmSer Member Откуда: Пенза Сообщений: 724 |
Увы, в IBX оно так! |
||
2 окт 18, 18:06 [21693091] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 10719 |
ISC_STATUS isc_dsql_prepare( ISC_STATUS *status_vector, isc_tr_handle *trans_handle, isc_stmt_handle *stmt_handle, unsigned short length, char *statement, unsigned short dialect, XSQLDA *xsqlda); При чем здесь IBX? |
||
2 окт 18, 18:10 [21693094] Ответить | Цитировать Сообщить модератору |
DmSer Member Откуда: Пенза Сообщений: 724 |
Прочитал статью по ссылке, просмотрел функцию isc_dsql_prepare, насладился жёлтой подсветкой. Всё понравилось. А делать-то с этим теперь что? |
||||
2 окт 18, 18:25 [21693111] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46934 |
Ты не поверишь, но запрос не ограничен рамками транзакции в которой его препарировали. Выполняться он способен и в любой другой. Хоть это и влечёт за собой забавные спецэффекты на динамических метаданных. Posted via ActualForum NNTP Server 1.5 |
||
2 окт 18, 18:31 [21693125] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 10719 |
|
||
2 окт 18, 18:32 [21693127] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 10719 |
|
||
2 окт 18, 18:34 [21693131] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46934 |
Это ты зря так думаешь: isc_dsql_allocate_statement( ISC_STATUS *status_vector, isc_db_handle *db_handle, isc_stmt_handle *stmt_handle); Где здесь транзакция? Posted via ActualForum NNTP Server 1.5 |
||
2 окт 18, 18:37 [21693134] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 10719 |
При создании объекта память тоже как-бы принадлежит всему процессу, но объект доступен только по месту создания. А если кто-то полезет по сырому указателю к этому объекту, то ССЗБ |
||
2 окт 18, 18:43 [21693144] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 46934 |
Ну и то, что в execute требуется хэндл транзакции как бы тоже намекает. Там, где запросы привязаны к транзакции, такого не допускают. Posted via ActualForum NNTP Server 1.5 |
||||
2 окт 18, 18:53 [21693160] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3747 |
Недавно писал проект на апи. Создавали и сразу препарировал запрос один раз, в одной транзакции. А затем использую этот хэндл запроса с другими транзакциями. Месяцами работает. |
2 окт 18, 20:30 [21693296] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 [все] |
Все форумы / Delphi | ![]() |