Михаиллл18. September 2019 08:25
Можно ли в SQL при команде Inser узнать id , в который записалось.
Добрый день.
Можно ли при команде Inser узнать id , в который записалось.
Пологаю можно в какое-нибудь поле записать уникальное число и потом по нему искать id, но хотелась бы узнать, есть варианты пологичней и с меньшими затратами системы?
Записываю так
QSqlQuery query(db); query.prepare("insert into UESRS (NAME) " "values (:NAME)"); query.bindValue(":NAME", "UserNotRegistered"); if(!query.exec()) { emit sig_error(query.lastError().text()); qDebug()<<"не записалось"; qDebug()<<"query.lastError().text() : "<<query.lastError().text(); msg = "false"; } else { qDebug()<<"Ok"; msg = "true"; }
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
sf
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
МВ
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
ЛС
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Letzte Kommentare
ИМ
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5. Oktober 2024 07:51
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5. Februar 2024 01:50
EVA25. Dezember 2023 10:30
Jetzt im Forum diskutieren
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3. Oktober 2024 04:05
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
Кирилл Гусарев27. September 2024 09:09
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql?redirectedfrom=MSDN&view=sql-server-2017
CREATE TABLE USERS в студию.
И вообще для чего используется таблица?
у меня такая таблица пользователей например:
Таблица хранит данные пользователй
Вот код таблицы:
Еще у ID есть автоинкримент.
Работа с базой идет в многопоточном режиме.
А что дальше надо делать с id пользователя?
Два варианта
,
) FROM RDB$DATABASE; (пример от СУБД будет отличаться, смотри доку по своей СУБД)
1)
Если есть поддержка автоинкримента, значит есть тригер и генератор, значит:
Первым действием получать новый ID например - SELECT GEN_ID(
Далее вставляешь куда угодно, при этом обеспечиваешь уникальность (за этим следит СУБД и дублирования не будет), даже если будет ошибка вставки твой ID просто останется не учтенным, но это без разницы, главная задача уникальности будет обеспечина
2) Делать вставку и сразу чтение в одной транзакции, т.е. записал данные и прочитал их (с MSSQL так делали, проблем не было)
А вообще
- Какая у вас СУБД (от нее зависит много например в MySQL есть команда LAST_INSERT_ID)
- На чем пишете (Например в Django после сохранении данных сразу можно обратиться и получить ID, без проблем)
- Задачу бы более шире узнать, т.к. решение может быть проще и вообще лежать в другой плоскости
Я пишу на с++ в Qt.
База данных Firebird.
Нужно заргистрировать пользователя без данных, после этого вернуть id, под которым пользователь зарегистрирован. Больше ничего делать не нужно.
Вариант 1 используйте - SELECT GEN_ID(my_gen , incr) FROM RDB$DATABASE (https://firebirdsql.org/refdocs/langrefupd20-genid.html)
Когда пишу под FB делаю именно так, проблем не встречал
пример таблицы и тригера ниже
Думаю если будете делать в потоках то мне кажется что просле INSERT сдулать SELECT u.id FROM users u WHERE u.name = 'UserName' и вернуть Id из потока.
Мне кажется плохая идея для FB, впрочем я не знаком с тонкостями работы C++ для MySQL где-то читал там такая фишка работает, но почему-то у меня сложилось мнение что именно MySQL обеспечивает изоляцию. В любом случае по ресурсоемкости будет одно и тоже, мой вариант, он однозначен как топор - будет работать, проблем с уникальностью не будет, а вот с поотками еще вопрос... Только время и нагрузка покажет)
При такой записи имена всех юзеров будут одинаковыми.
В таком случае выдаст наверно первый id из базы, а не последний
вам написали рецепт, если идей лучше нет делайте по рецепту. так как вы написали идентифицировать id нельзя
Да, спасибо буду пытаться сделать по Вашему варианту.
у вас два запрлса первый получает id второй вставляет новую запись используя полученный в первом запросе id. Все это вы делаете в С++ так сказать. не забудьте дописать нужный тригер и создать ненератор, если его нет, если делать базу через ibEpert и поставить флаг автоинкримент, то оно все само сделает
Попробовал Ваш запрос
Но получаю ошибку
Скажите пожалуйста что не так в моем запросе?
Ниже полный код моей таблицы:
А если в базе выполняю эту команду, то получаю 3 числа в столбик, но никак не одно.
Скажите пожалуйста, почему так?
Оно похоже пробегает ко всему столбцу и добавляет столько значений, сколько есть в таблице.
Если делать так, то добавляет только 1 значение к последнему, но как прописать последнее значение?
напишите завтра в телеграмм разберемся, потом тут выложите готовый рецепт @Bardin_A_A
Такой запрос в базе работает
Но в Qt такой код возвращает 0. Скажите пожалуйста, что не так в этом коде?
Процедура не подойдет?
возвращает id и добавляет запись в таблицу.
Скажите пожалуйста, что делать с это процедурой?
Её нужно выполнить в базе данных и потом как то ее вызывать из Qt? Если да, то как потом вызывать процедуру?
Выполнить скрипт на базе через редактор скриптов IBE , а вызывать через QSqlQuery как обычный запрос.
только в доках глянь как получать возвращаемое заначение, я не помню.
q.prepare("execute procedure addser(:name, :ph, :pass, :rat)");
Скажите пожалуйста, как добавить эту процедуру?
Если просто вставляю в скрипт, то оно не работает (что ожидаемо).
Похоже ее нужно добавлять непосредственно в нужную таблицу, но как?
IBexpert Настройки редактор скриптов Ctrl+F12
Не забыть поставить галочку Использовать текщее соединение
https://s.mail.ru/BkqS/KQBWcafHa
только мне кажется в строке
3 - returns (user_id integer) нужно написать, а не return
5 - DECLARE VARIABLE user_id integer; тут по моему надо указать тип переменной integer
Согласен... не было примеров под рукой.
Но у меня почему-то интерфейс отличается, нормально ли это? Или може
да нормально, от версии зависит, и у меня все в одном окне опция стоит, у вас нет
Советы по IBE: ВЫМУЧАННЫЕ массой потерянного времени
1. Использовать последню версию. https://ru.wikipedia.org/wiki/IBExpert в разделе ссылки Бесплатная полнофункциональная версия — Ссылка для скачивания специальной лицензии для бывшего СССР.
2. НИКОГДА не использовать SDI интерфейс. Изменить можно Настройка Настроки среды.
Получилась такая процедура
Но при нажатии на выполнение получаю ошибку, говорящую что скрипт выполнен с ошибкой.
Текст или срин ошибки.
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Dynamic SQL Error.
SQL error code = -901.
variable USER_ID conflicts with parameter in same procedure.
А если так
Подправил скрипт, так приняло:
В Qt Сделал такой запрос и все заработало
Спасибо всем за помощь!
Так а где ты используешь возвращаемый ID?
В клиентской части. Клиентская часть по id будет получать соответствующую информацию.
если просто добавлять запись, то тогда процедра не нужна
Но мне же нужно еще получить этот id и вернуть его пользователю, а при таком запросе ничего не вернется.