Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.05;
Скачать: CL | DM;

Вниз

Получение значение ключевого поля, сразу после его создания   Найти похожие ветки 

 
SaS   (2004-02-07 14:19) [0]

Уважаемые Мастера. Есть Две таблицы, в 1ой поле Id identity, то бишь автоинкремент, необходимо считать его значение, сразу после вставки записи, чтобы использовать его для вставки во вторую таблицу. Для вставки использую AdoDataSet.AppendRecord...
Единственный вариант, до которого добрался сам - это OnPost читать последнюю запись... при событии OnInsert Дельфа не дает...
А при OnPost другой пользователь уже может добавить еще одну запись. Помогите плиз.


 
just me   (2004-02-07 16:44) [1]

можно по OnPost сделать select @@IDENTITY


 
SaS   (2004-02-09 16:28) [2]

Спасибочки.... Разбираюсь...
Вот мысля умная: Может мне запись добавлять через SQL директом, чтобы выходом запроса было значение @@identity, т.к. событие OnPost кажется мне ненадежным.... Попробую и так и так.


 
VLAD-MAL   (2004-02-09 16:32) [3]

Генерация ID ПЕРЕД его использованием:
Варианты:
- специальные процедуры (хранимые);
- GUID.


 
Ega23 ©   (2004-02-09 17:05) [4]

Declare @X int set NoCount ON
Insert into Table1 (....)
values (....)
Select @X=@@IDENTITY
Set NoCount OFF
Select X=@X

Через Query.Open открываем и
FieldByName("X").AsInteger
Вот и ID нашей записи.


 
VLAD-MAL   (2004-02-09 17:09) [5]

http://www.rsdn.ru/article/db/midas_migration.xml

"
Добавление записей в таблицу

Для абстрагирования метода генерации уникальных идентификаторов для каждой записи можно вынести его в хранимую процедуру, которая будет возвращать ID новой записи. Это позволяет легко добавлять записи в подчиненную таблицу, не производя никаких дополнительных манипуляций. В дальнейшем вы можете возложить на эту процедуру, например, генерацию идентификаторов в заданном диапазоне, или обеспечить сквозную нумерацию. Для хранения идентификаторов проще всего иметь отдельную таблицу примерно следующего вида:

create table Seeds (
TableName varchar(30), --имя таблицы
ID int, --ID последней вставленной записи в данную таблицу
LowOffset int --нижняя граница диапазона
)
go



При добавлении пользовательских таблиц необходимо не забывать вставлять в эту таблицу соответствующие записи. Ниже приведен пример SQL-запроса, делающего это:

insert into Seeds(TableName, ID, LowOffset, HiOffset)
values("MyCoolTable", 0, 0, 1000000)
go



Текст процедуры в простейшем случае будет выглядеть так:

create procedure CLIENT_ID
@TableName varchar(30),
@ID int output
as
update Seeds
set ID = ID + 1,
@ID = ID + LowOffset
where TableName = @TableName
go

"


 
SaS   (2004-02-09 23:18) [6]

Так... вариантов много... Я сделал как и говорил, только с одной разницей: вместо @@Identity использвал Scope_Identity, т.к. мне значение после триггеров ни к чему. Для пробы на трех компьютерах запустил такое добавление одновременно, ни одного перехлеста при добавленни по 1000 записей с каждого компа...


 
KSergey ©   (2004-02-10 07:32) [7]

> вместо @@Identity использвал Scope_Identity

Во-во, это очень правильно.
Одно из двух новшеств, собственно и нужных в MS SQL 2k


 
ЮЮ ©   (2004-02-10 08:03) [8]

>Для пробы на трех компьютерах запустил такое добавление одновременно, ни одного перехлеста при добавленни по 1000 записей с каждого компа

А если потребуется сделать тоже самое в рамках одной транзакции ?



Страницы: 1 вся ветка

Текущий архив: 2004.03.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
1-12318
Pa5ha
2004-02-18 18:28
2004.03.05
ListBox


4-12574
Vulko
2003-12-29 00:38
2004.03.05
Как мне узнать, что в буффер попал текст?


1-12388
satron
2004-02-24 23:50
2004.03.05
Как развернуть окно во весь экран


3-12281
Мыш
2004-02-06 20:41
2004.03.05
удаление? записей из запроса


3-12249
Andrey V.
2004-02-08 10:29
2004.03.05
Работа с большим числом