powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / запрос на добавление, как вернуть значение поля
8 сообщений из 8, страница 1 из 1
запрос на добавление, как вернуть значение поля
    #32307038
sveta78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавляю запись в таблицу с помощью запроса

Код: plaintext
1.
2.
3.
SQL.Text:='set nocount on insert into UsersPass (userid, password) values(:userid, :pass)';
parameters.ParamByName('userid').Value:=UserQuery.FieldByName('userid').Value;
parameters.ParamByName('pass').Value:=edtPassword.Text;
ExecSql;


следующим шагом мне надо использовать значение поля (userid), только что добавленной записи. Это поле автоинкрементное.Чтобы узнать значение (userid) я делаю запрос:

Код: plaintext
1.
2.
3.
Close;
 SQL.Text:='select userid from users where login=:par';
 Parameters.ParamByName('par').Value:=EditLogin.Text;
 Open;

И использую поле запроса UserQuery.FieldByName('userid').Value;

А КАК СДЕЛАТЬ ЧТОБЫ НЕ ВЫПОЛНЯТЬ ВТОРОЙ ЗАПРОС И ЧТОБЫ ЗНАЧЕНИЕ (USERID) ВЕРНУЛ ПЕРВЫЙ ЗАПРОС НА ДОБАВЛЕНИЕ???
...
Рейтинг: 0 / 0
запрос на добавление, как вернуть значение поля
    #32307174
sveta78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые знатоки, неужели моё решение единственное???
...
Рейтинг: 0 / 0
запрос на добавление, как вернуть значение поля
    #32307199
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написать хранимую процудуру. В ней делать вставку и через дополнительный выходной параметр и SCOPE_IDENTITY() возвращать значение счетчика.
...
Рейтинг: 0 / 0
запрос на добавление, как вернуть значение поля
    #32307214
LAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А по-моему оба этих запроса можно выполнить сразу, т.е.

SQL.Text:='set nocount on insert into UsersPass (userid, password) values(:userid, :pass) select userid from users where login=:par';
parameters.ParamByName('userid').Value:=UserQuery.FieldByName('userid').Value;
parameters.ParamByName('pass').Value:=edtPassword.Text;
Parameters.ParamByName('par').Value:=EditLogin.Text;
Open;

Поскольку последним оператором является select, то надо использовать Open и он вернет то что тебе надо
...
Рейтинг: 0 / 0
запрос на добавление, как вернуть значение поля
    #32307268
sveta78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pkarklin если не трудно, научи пожалусто, как это сделать?
...
Рейтинг: 0 / 0
запрос на добавление, как вернуть значение поля
    #32307286
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если речь идет про сиквел, то на сервере примерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE PROC usp_UserAdd @Password varchar( 50 ), @userid int OUTPUT
AS
  SET NOCOUNT ON
  INSERT INTO UsersPass(password) VALUES(@Password)
  SET @userid = SCOPE_IDENTITY()
RETURN( 0 )
GO


На клиенте, ложим TADOStoredProc, устанавливаем свойства и потом в коде:

Код: plaintext
1.
2.
3.
4.
...
Parameters.ParamByName('@Password').Value:=edtPassword.Text;
ExecProc;
UserID := Parameters.ParamByName('@userid').Value;
...
...
Рейтинг: 0 / 0
запрос на добавление, как вернуть значение поля
    #32307349
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убейте автоинкрементность Вашего поля, и работайте так:
ПЕРЕД добавлением записи каким-либо способом сгененрируйте очередное значение вашего "автоинкрементного" поля, а затем, зная это поле, работаете как обычно. Единственное, Вам придется реализовать эту псевдоинкрементность вне контекста транзакций, ну, чтобы разные юзеры генерили разные номера полей.
В InterBase для этой цели существуют ГЕНЕРАТОРЫ, и есть масса компонентов, которые используют описанную схему:
- в событии OnNewRecord генерится очередное значение
- запись восится в базу с уже известным значением
- выполняется Refresh по уже известному ключу

Если Ваша СУБД не поддерживает ГЕНЕРАТОРЫ, то см. демку из комплекта Delphi, там они завели специальную таблицу с одной записью (и с одним полем), которая играет роль генератора. Чтобы получить очередное значение, клиент кратковременно блокирует эту запись в своей транзакции, считывает значение поля, увеличивет его на 1, делает POST и разблокирует его для других клиентов. Дальше то же самое.
...
Рейтинг: 0 / 0
запрос на добавление, как вернуть значение поля
    #32307359
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Малиновский Владимир

Убейте автоинкрементность Вашего поля, и работайте так

Интересно, для чего ломать то, что уже работает?

Единственное, Вам придется реализовать эту псевдоинкрементность вне контекста транзакций, ну, чтобы разные юзеры генерили разные номера полей.

Ага, и поимеем себе геморой на ровном месте. Пусть это делает сервер.

Чтобы получить очередное значение, клиент кратковременно блокирует эту запись в своей транзакции, считывает значение поля, увеличивет его на 1, делает POST и разблокирует его для других клиентов.

Узкое местечко получается, однако.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / запрос на добавление, как вернуть значение поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]