powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вернуть уникальный номер только что добавленной записи Delphi
15 сообщений из 15, страница 1 из 1
Вернуть уникальный номер только что добавленной записи Delphi
    #39685172
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Сразу прошу прощения, может эта тема уже подымалась, но ответа так и не нашел. Подскажите, как вернуть уникальный номер только что добавленной записи в SQL Server 2008. Работаю с компонентами ADOQuery.Не могу понять, правильно ли я все делаю. Возвращает номер как надо, но не получится ли так, что при работе нескольких пользователей уникальный номер может получить не тот. Привожу кусок кода. Заранее спасибо.

Код: pascal
1.
2.
3.
4.
5.
6.
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;
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685208
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685214
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tus,

ничего не могу понять:(
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685215
Evgeny A. Maltsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685239
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А там в запросе, после DataModule1.qryQExec.SQL.CLose; точно Clear не пропущен?..
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685538
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan,

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

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



Если через SQL скрипт, то так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
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;
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685546
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B
Если через SQL скрипт, то так:
Код: pascal
1.
2.
 DataSet.SQL.Add('INSERT INTO....');
 DataSet.SQL.Add('SELECT SCOPE_IDENTITY() AS Identity');


Ну и конечно, так тоже делать нельзя. В .ехе не должно быть SQL текста.
Надо написать Сторед процедуру, в конце которой сделать
Код: sql
1.
SELECT SCOPE_IDENTITY()
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685803
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valery_B,

Спасибо, разобрался!:)
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685858
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
DataModule1.qryQExec.Text := 'INSERT ........   SELECT @@identity as UniqueNum');
DataModule1.qryQExec.Open;
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685861
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BНу и конечно, так тоже делать нельзя. В .ехе не должно быть SQL текста.
то есть такой код не правильный?
Код: pascal
1.
2.
3.
4.
5.
6.
Dataset.Open;
....
Dataset.Insert;
Dataset['Field'] := NewValue;
Dataset.Post;
NewRecordId := Dataset['Id'];
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685914
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да да.
Именно так делать НЕЛЬЗЯ .
DimaBr
Код: pascal
1.
2.
DataModule1.qryQExec.Text := 'INSERT ........   SELECT @@identity as UniqueNum');
DataModule1.qryQExec.Open;


Забудь об @@Identity. Можно использовать только SCOPE_IDENTITY
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685916
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BЗабудь об @@Identity. Можно использовать только SCOPE_IDENTITY
Если нет тригеров, то эти функции идентичны
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685944
Фотография AndyMandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrValery_BЗабудь об @@Identity. Можно использовать только SCOPE_IDENTITY
Если нет триггеров, то эти функции идентичны
Только, что разработчик добавил триггер в БД. БД используется многими приложениями, часть приложений поломалось, исходников нет. :)
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39685949
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndyMandyТолько, что разработчик добавил триггер в БД. БД используется многими приложениями, часть приложений поломалось, исходников нет. :)
Только что разработчик поменял входные параметры хранимки и её имя, исходников нет
...
Рейтинг: 0 / 0
Вернуть уникальный номер только что добавленной записи Delphi
    #39686245
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.08.2018 13:52, Valery_B пишет:
> В .ехе не должно быть SQL текста.

да ты ушицы ул!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вернуть уникальный номер только что добавленной записи Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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