Как да разберете идентификатора на добавения запис в базата данни

Моята програма работи с MS SQL Server база данни. Програмата се използва от няколко потребители едновременно.

Има 2 таблици (всъщност има повече таблици и са по-сложни, това е само за пример):

MainTab id - поле за автоматично нарастване данни - някои данни

SecondTab id - поле за автоматично нарастване IDMainTab - вторичен ключ. Основната таблица е MainTab. Тези. Трябва да свържа този запис към запис в MainTab.

Когато потребителят натисне определен бутон, първо се създава запис в таблицата MainTab, а след това се създава запис в таблицата SecondTab, като на последния запис в полето IDMainTab трябва да бъде присвоен идентификаторът на новосъздадения запис от MainTab.

Моля, кажете ми как да разреша този проблем. Тоест, как мога да разбера идентификатора на записа, създаден в таблицата MainTab? Ако използвате „SELECT max(id) FROM MainTab“, тогава можете да попаднете на запис, който е създаден след моя.

PS: има втора опция за организиране на моята база данни: не използвайте таблицата MainTab. Но тогава трябва да има таблици SecondTab1, SecondTab2 и т.н., споделящи общ индекс за автоматично нарастване. Кажете ми, моля, възможно ли е да направите това?

> първо се създава запис в таблицата MainTab и след това записът > се създава в таблицата SecondTab, като последният е в IDMainTab > трябва да присвоите идентификатор на новосъздадения запис от MainTabвмъкнете нещо в MainTab изберете @ > вмъкнете @id и нещо друго във SecondTab

Само не е ясно защо кодът на формата не работи:

ADOC.CommandText := "ВМЪКНЕТЕ В СТОЙНОСТИ В BufList (данни) (1);"; TryToExec(ADOC);

ADODS.CommandText := "SELECT @@ ; TryToOpen(ADODS); Edit10.Text := ADODS.FieldByName("si").AsString;

В крайна сметка сесията е същата (запазване на връзката = вярно).

Въпреки че можете простонапишете съхранена процедура/функция (или използвайте бунтовния ADOQuery :).

TryToExec/TryToOpen е просто изпълнение на заявка, обвито в try/с изключение на анализиране на грешки.

PS. Малък софтуер затвори всичко от обикновен смъртен в LINQ :-)

> Но не е ясно защо кодът на формуляра не работи:Време е да започнем да убиваме за думите "кодът не работи".

Как не работи? Изключение? Клас/съобщение за изключение. Неочаквано поведение? Какво искаха. Какво получи.

> В крайна сметка сесията е същата (запазване на връзката = вярно).Така че Microsoft е излъгал в документацията. И ние трябва да ви вярваме повече от микрософтуера.

Къде е кодът за инициализация на компонента?

> Неочаквано поведение? Какво искаха. Какво имаме.Е, всичко вече е обяснено в [5].

> Къде е кодът за инициализация на компонента?Всичко е там по подразбиране, с изключение на подкана за влизане:

обект ADOConnection1: TADOConnection ConnectionString = "Prov > LoginPrompt = False Prov Left = 32 Top = 16 end

обект ADOC: TADOCommand Връзка = DataMod.ADOConnection1 Параметри = <> Отляво = 64 Отгоре = 24 край обект ADODS: TADODataSet Връзка = DataMod.ADOConnection1 Параметри = <> Отляво = 24 Отгоре = 24 край

Низ за връзка: "Password="+Password.Text+";Persist Security Info=True;User ;

> Просто не е ясно защо кодът като този не работи: ADOC.CommandText := "INSERT INTO BufList (data) VALUES (1);"#13#10+ "SELECT @@IDENTITY AS si;"; TryToOpen(ADOC);

p.s. странна конструкция, TryToOpen? за едно отворено обаждане.

> странна конструкция, TryToOpen? за едно обаждане отвореное, може би нещо като за i:=0 до 1000 да започне опитайте ADOC.Open; почивка; с изключение на Sleep(1000); край; край;

> странна конструкцияПросто при грешки в заявката се показва специален прозорец (DBMessageout(. )), в който има текст и самата заявка (удобно при отстраняване на грешки и ако грешката е възникнала в динамично генерирана заявка). Е, можете също да посочите своя текст за грешка.

procedure TryToOpen(DS:TADODataSet; err:string="Възникна грешка при извличане от базата данни."); Започнете опитайте DS.Open; освен на e : изключение do DBMessageOut(err+" "+E.Message, DS.CommandText); край; край;

> ADOC.CommandText := "INSERT INTO BufList (data) VALUES (1) > ;"#13#10+ > "ИЗБЕРЕТЕ @@IDENTITY AS si; > ";Благодаря.

> Започвайки само от версия 2005В момента имаме 2005.