Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Konstantin-78 Member Откуда: Земля Сообщений: 399 |
Доброе время суток, такой вопрос: У меня DELPHI 10.2, ibx19,19, ни как не найду информацию о поддержке IBX оператора RETURNING. Я его хочу использовать в IBQuery (после вставки строки), ну как тут уже писали, предыдущие версии его не поддерживали. |
2 окт 18, 13:45 [21692597] Ответить | Цитировать Сообщить модератору |
Любезный Member Откуда: Сообщений: 576 |
ЕМНИП, такого предиката в 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 Откуда: Донецк Сообщений: 3766 |
Что-то мне кажется, что если тупо засунуть INSERT RETURNING в обычный TIBQuery или TIBDataset и сделать Open, то всё заработает само. |
2 окт 18, 14:12 [21692645] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 24971 |
Наверное еще никого это простая мысль не посещала. :) |
||
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 Откуда: Сообщений: 46948 |
Нет. Немного не так. Любые значения возвращаются через 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 Откуда: Сообщений: 46948 |
За такой код я бы отрывал руки с запретом на профессию, но в целом таки да, как-то так. 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 Откуда: Донецк Сообщений: 3766 |
Konstantin-78, Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining. Иначе два варианта: 1. Ты сменишь профессию, а твоё поделие придется переделывать другому; 2. Тебе самому придется всё переделывать со временем. |
2 окт 18, 14:54 [21692748] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
Прямо вот так "никогда"? Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку? |
||
2 окт 18, 14:58 [21692756] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 24971 |
Использовать датасеты, которые поддерживают 2 транзакции. Читающая длинная, пишущая - короткая. |
||||
2 окт 18, 15:26 [21692814] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3766 |
Ты имеешь ввиду - редактировать гриды "в гриде"? Зачем это вообще надо? Если уж надо - делаешь форму редактирования запись, после редактирования - стартуешь пишущую транзакцию, делаешь инсерт/апдейт, commit, refresh датасета, всё. Либо использовать датасеты с двумя транзакциями, как сказал ужа wadman. Но, имхо, это нужно чаще всего для редактирования гридов в гридах, что я считаю уродством. |
||
2 окт 18, 15:38 [21692838] Ответить | Цитировать Сообщить модератору |
YuRock Member Откуда: Донецк Сообщений: 3766 |
А датасет должен быть открыт в 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 Сообщений: 6154 |
В этой - не модифицируются. В других - вполне себе (у других пользователей). Получаешь накопление ненужных версий записи. |
||||
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 Сообщений: 27809 |
вот зачем такую стыдобу писать? Мало того, CommitRetaining, так он еще между открытием запроса и получением значения. Кто вас такому научил? Выполнил insert, получил данные, сделал commit, если надо. CommitRetaining для insert/update/delete ни к селу, ни к городу. |
||
2 окт 18, 17:36 [21693049] Ответить | Цитировать Сообщить модератору |
DmSer Member Откуда: Пенза Сообщений: 729 |
Со стандартными компонентами IBX приходится использовать in-memory-dataset (например, TRXMemoryData или что-нибудь посвежей) и его подключать к гриду. В этом случае: 1. Обеспечивается независимость от качества соединения с БД (данные не исчезнут при дисконнекте) 2. При добавлении / изменении / удалении записи не требуется переоткрывать весь датасет 3. По факту получается не очень много дополнительного кода. |
||
2 окт 18, 17:49 [21693067] Ответить | Цитировать Сообщить модератору |
Котовасия Member Откуда: Сообщений: 1187 |
DmSer, да ну нафиг, уж лучше старые фибы. |
2 окт 18, 17:54 [21693074] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |