Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Вернуть уникальный номер только что добавленной записи Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 3
Здравствуйте. Сразу прошу прощения, может эта тема уже подымалась, но ответа так и не нашел. Подскажите, как вернуть уникальный номер только что добавленной записи в SQL Server 2008. Работаю с компонентами ADOQuery.Не могу понять, правильно ли я все делаю. Возвращает номер как надо, но не получится ли так, что при работе нескольких пользователей уникальный номер может получить не тот. Привожу кусок кода. Заранее спасибо.

DataModule1.qryQExec.SQL.Clear;
DataModule1.qryQExec.SQL.Append('INSERT ........');
DataModule1.qryQExec.ExecSQL;
DataModule1.qryQExec.SQL.CLose;
DataModule1.qryQExec.SQL.Append('SELECT @@identity as UniqueNum');
DataModule1.qryQExec.Open;
9 авг 18, 07:43    [21635302]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
ma1tus
Member

Откуда:
Сообщений: 544
Molchan,

Get last row data after insert into using Delphi AdoQuery
9 авг 18, 09:02    [21635373]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 3
ma1tus,

ничего не могу понять:(
9 авг 18, 09:10    [21635380]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
Evgeny A. Maltsev
Member

Откуда: Russia, Moscow
Сообщений: 2
Molchan,

https://docs.microsoft.com/ru-ru/sql/t-sql/functions/scope-identity-transact-sql?view=sql-server-2017
9 авг 18, 09:12    [21635381]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
alekcvp
Member

Откуда:
Сообщений: 1056
А там в запросе, после DataModule1.qryQExec.SQL.CLose; точно Clear не пропущен?..
9 авг 18, 09:43    [21635422]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1692
Molchan,

Если в кратце, то делать
SELECT @@identity - нельзя вообще.
SELECT IDENT_CURRENT - тоже нельзя. И тоже вообще.
SELECT SCOPE_IDENTITY() - Можно и нужно. Она возвращает данные последней вставленной записи в текущей сессии
Соответственно, как только ты сделал DataSet.Close, следующий SELECT SCOPE_IDENTITY() будет равен 0.

Если ты работаешь с DataSet.Append, то делать надо так:
var
 Identity:Integer;
begin
 DataSet.Append;
....
 DataSet.Post; //После Post, ADO сам делает запрос SELECT SCOPE_IDENTITY и присваивает его AutoInc полю.
 Identity:=DataSet.FieldByName('<Твоё поле Identity, чаще всего Fields[0]>').AsInteger;


Если через SQL скрипт, то так:
var
 Identity:Integer;
begin
 DataSet.SQL.Add('INSERT INTO....');
...
 DataSet.SQL.Add('SELECT SCOPE_IDENTITY() AS Identity');
 DataSet.Open;
 Identity:=DataSet.FieldByName('Identity').AsInteger;
 DataSet.Close;
9 авг 18, 13:44    [21636018]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1692
Valery_B

Если через SQL скрипт, то так:
 DataSet.SQL.Add('INSERT INTO....');
 DataSet.SQL.Add('SELECT SCOPE_IDENTITY() AS Identity');

Ну и конечно, так тоже делать нельзя. В .ехе не должно быть SQL текста.
Надо написать Сторед процедуру, в конце которой сделать
SELECT SCOPE_IDENTITY()
9 авг 18, 13:52    [21636055]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 3
Valery_B,

Спасибо, разобрался!:)
10 авг 18, 03:28    [21637079]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
DimaBr
Member

Откуда:
Сообщений: 10596
DataModule1.qryQExec.Text := 'INSERT ........   SELECT @@identity as UniqueNum');
DataModule1.qryQExec.Open;
10 авг 18, 09:24    [21637213]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
DimaBr
Member

Откуда:
Сообщений: 10596
Valery_B
Ну и конечно, так тоже делать нельзя. В .ехе не должно быть SQL текста.

то есть такой код не правильный?
Dataset.Open;
....
Dataset.Insert;
Dataset['Field'] := NewValue;
Dataset.Post;
NewRecordId := Dataset['Id'];
10 авг 18, 09:29    [21637220]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1692
Да да.
Именно так делать НЕЛЬЗЯ.
DimaBr
DataModule1.qryQExec.Text := 'INSERT ........   SELECT @@identity as UniqueNum');
DataModule1.qryQExec.Open;

Забудь об @@Identity. Можно использовать только SCOPE_IDENTITY
10 авг 18, 10:51    [21637347]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
DimaBr
Member

Откуда:
Сообщений: 10596
Valery_B
Забудь об @@Identity. Можно использовать только SCOPE_IDENTITY

Если нет тригеров, то эти функции идентичны
10 авг 18, 10:56    [21637356]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
AndyMandy
Member

Откуда: СПб
Сообщений: 178
DimaBr
Valery_B
Забудь об @@Identity. Можно использовать только SCOPE_IDENTITY

Если нет триггеров, то эти функции идентичны

Только, что разработчик добавил триггер в БД. БД используется многими приложениями, часть приложений поломалось, исходников нет. :)
10 авг 18, 11:25    [21637422]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
DimaBr
Member

Откуда:
Сообщений: 10596
AndyMandy
Только, что разработчик добавил триггер в БД. БД используется многими приложениями, часть приложений поломалось, исходников нет. :)

Только что разработчик поменял входные параметры хранимки и её имя, исходников нет
10 авг 18, 11:30    [21637430]     Ответить | Цитировать Сообщить модератору
 Re: Вернуть уникальный номер только что добавленной записи Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28962

09.08.2018 13:52, Valery_B пишет:
> В .ехе не должно быть SQL текста.

да ты ушицы ул!

Posted via ActualForum NNTP Server 1.5

10 авг 18, 18:58    [21638264]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить