С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 1
Регистрация: 17.03.2012
Сообщений: 188
RAD XE3+

IBQuery – при returning не найдет параметр

02.10.2018, 11:36. Показов 1895. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток, форумчане

Вот простой запрос на вставку, с возвратом "ID"

Delphi
1
2
3
4
5
6
7
8
9
10
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.Fields[0].Value;
но после его выполнения, не могу достучаться к возвращенному ID, на строке
Delphi
1
q := IBQuery1.Fields[0].Value;
ошибка:

'IBQuery1: List index out of bounds (0)'.

Что не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2018, 11:36
Ответы с готовыми решениями:

При активации IBQuery и запуске программы вылетает ошибка database not assigned
Здравствуйте, имеется дата модуль с IBDatabase и транзакцией, так же имеется форма где находиться DBGrid, DataSourse и IBQuery, все взаимно...

Найти вероятность того, что при проверке аудитор найдет ошибку
Вероятность, что аудитор при проверке документации фирмы найдет ошибку равна 0.1. Аудитор проверяет 6 фирм. Найти вероятность того, что при...

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string apiDescriptionId)

9
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,355
Записей в блоге: 3
02.10.2018, 11:48
информация с одного из форумов по InterBase...
Q: How can I retrieve the value from a statement like this:
INSERT INTO INVOICE(dtStatement)
VALUES('01/31/2010')
RETURNING ID
I am using a TSQLQuery to execute the statement...

A: To solve the problem you should add a new parameter to TSQLQuery with Name = 'ID' and ParamType = ptOutput. After this you can get ID value using the code:
ID := SQLQuery.ParamByName('ID').Value;
0
0 / 0 / 1
Регистрация: 17.03.2012
Сообщений: 188
02.10.2018, 12:02  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
ID := SQLQuery.ParamByName('ID').Value;
да да, я видел этот форум, ошибка точно такая же

только в IBQuery не нашел, как добавить "Name = 'ID'" и свойства "ParamType" - такого нет

Добавлено через 10 минут
Если вот так, то также толку мало:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  q: integer;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
 
with IBQuery1.FieldDefs.AddFieldDef do
      begin
         DataType := ftInteger;
          Name := 'ID';
      end;
 
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.Fields[0].Value;
ошибка таже
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,355
Записей в блоге: 3
02.10.2018, 12:15
Цитата Сообщение от Kostantin-78 Посмотреть сообщение
только в IBQuery не нашел, как добавить "Name = 'ID'" и свойства "ParamType" - такого нет
Странно, и почему я Вам не верю...
Миниатюры
IBQuery – при returning не найдет параметр  
0
0 / 0 / 1
Регистрация: 17.03.2012
Сообщений: 188
02.10.2018, 12:51  [ТС]
Может в "С", оно и есть, но в Delphi, вот посмотрите сами (см. рис.)

На форуме, вычитал, что версии компонентов доступа к серверу - IBX могут не поддерживать эту особенность,
а вы не подскажите где можно посмотреть версию IBX, которую я использую?
Миниатюры
IBQuery – при returning не найдет параметр  
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,355
Записей в блоге: 3
02.10.2018, 13:05
Цитата Сообщение от Kostantin-78 Посмотреть сообщение
Может в "С", оно и есть
Вы мне можете ответить, чем C++ Builder из состава RAD Studio визуально и инструментально отличается от Delphi из той же RAD Studio?
1. Выделяете компонент IBQuery
2. Нажимаете кнопку с тремя точками в свойстве Params

3. Добавляете параметр
4. Устанавливаете требуемые свойства

Цитата Сообщение от Kostantin-78 Посмотреть сообщение
где можно посмотреть версию IBX
честно говоря - не знаю, я вообще с InterBase не работаю
0
0 / 0 / 1
Регистрация: 17.03.2012
Сообщений: 188
02.10.2018, 13:23  [ТС]
Спасибо за подробное объяснение.
Поставил на форму IBQuery,
изменил параметры "Datatype"," "Name", "ParamType".

ошибка:
Project Project2.exe raised exception class EDatabaseError with message 'IBQuery1: Parameter 'ID' not found'.
Миниатюры
IBQuery – при returning не найдет параметр  
0
5957 / 4533 / 1094
Регистрация: 29.08.2013
Сообщений: 28,130
Записей в блоге: 3
02.10.2018, 20:48
ну так параметра то и нет
параметр это то где двоеточие стоит, а у тебя возвращается значение
его по другому надо получать
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
03.10.2018, 07:59
Есть в коде ТС ошибки.
1. Модифицирующие запросы завершаются командой ExecSQL (после Open ничего и не было).
2. Для таких запросов явные старт и коммит транзакций в Interbase и Firebird еще никто не отменял.
Прим. CommitRetaining не закрывает текущую транзакцию и использовать этот метод в указанной ситуации решение не верное. К тому же, любой Commit требует транзакцию стартовать, чего в приведенном коде нет.
Возможно такие изменения в коде помогут решить проблему:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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].Value := 'qwe';
  try
    IBQuery1.Transaction.StartTransaction;
    IBQuery1.ExecSQL;
    IBQuery1.Transaction.Commit;
  except
    IBQuery1.Transaction.Rollback;
    Exit;
  end;
  q := IBQuery1['id'];
Можно применить несколько иной прием, где вначале надо получить очередное значение идентификатора, затем его использовать при добавлении данных.
Прием применявшийся в старых версиях СУБД, где не было insert ... returning, но надежный (для небольшого количества клиентов СУБД).

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  id : integer;
begin
  IBQuery1.SQL.Text := 'SELECT GEN_ID(GN, 1) AS ID FROM RDB$DATABASE';
  IBQuery1.Open;
  ID := IBQuery1['ID']; //идентификатор новой записи
  IBQuery1.Close;
 
  IBQuery1.Transaction.StartTransaction;
  IBQuery1.SQL.Text := 'insert into Tab (ID, STR) values (ID, :STR)';
  IBQuery1.Params[0].Value := 'qwe';
  IBQuery1.ExecSQL;
  IBQuery1.Transaction.Commit;
end;
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
03.10.2018, 21:20
Описка в строке 10 второго фрагмента выше.
Надо:
Delphi
1
  IBQuery1.SQL.Text := 'insert into Tab (ID, STR) values ('+IntToStr(ID)+', :STR)';
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2018, 21:20
Помогаю со студенческими работами здесь

Предложение Returning
База Oracle. Возник такой вопрос. Я в TUpdateSql вешаю запрос: insert into NPATS_GTP (NAME, NPATSID) values (:NAME,...

Insert into . returning
Хочу получить в коллекцию id записей которые я только что заинсертил, но почему-то не получается это сделать и я не могу понять причину....

Использование Returning в Rule
Не понимаю, что писать в разделе Returning при написании правила. Мне надо возвращать id новой записи (id_user) или можно новую запись...

Read returning value of main() from terminal
How i can read main() returning value from terminal(tty) ? int main(){ return 0; } int main(){ return 1; } How...

PL SQL DEVELOPER. INSERT с RETURNING
Есть у меня следующий код. Но при запуске он не работает. Не знаю в чем дело. По всем ссылкам, которые выдает Гугл конструкция такая же....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru