Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Как узнать значение поля(тип счетчик) после Insert


Автор: chip_and_dayl 17.12.2009, 14:16
Есть таблица такого вида:

cCode     cName   

CCode-счетчик, сName - String;

Есть код, после выполнения которого, мне нужно узнать, какое значение было присвоено полю cCode
Код

  DataModule1.ADOQuery1.Close;
  DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Add('INSERT INTO Client (cName) VALUES (''' + Edit2.Text + ''')');
  DataModule1.ADOQuery1.ExecSQL;


Вариант ответов типа: поменять тип поля cCode на целое число и самому генерировать ИД(Код), а также делать запрос вида: SELECT cCODE from Table_N where cName=''Edit1.Text'' не устраивают

Автор: Gudinya 17.12.2009, 14:42
Во первых:
Цитата
(''' + Edit2.Text + ''')
 - это ужасный стиль, используй параметры квери(в справке к делфи все есть TParameters)
во вторых: для получения айдишника 
Код

INSERT INTO Client (cName) VALUES ('NEW_TYPE') returning CCode into :vCodeID;

Автор: Frees 17.12.2009, 15:19
Код

  DataModule1.ADOQuery1.Close;
  DataModule1.ADOQuery1.SQL.Clear;
  DataModule1.ADOQuery1.SQL.Add('INSERT INTO Client (cName) VALUES (''' + Edit2.Text + ''') returning CCode');
  DataModule1.ADOQuery1.ExecSQL;
 DataModule1.ADOQuery1.FieldByName('CCode').asInteger;

Автор: Данкинг 17.12.2009, 15:27
Т.е. этот "returning" в Access прокатит? (извиняюсь, пробовать сейчас неохота).

Автор: chip_and_dayl 17.12.2009, 15:29
Забыл сказать, что использую СУБД Access, поэтому запрос, что выше не возможен

Добавлено @ 15:31
Данкинг
ммм, как ты узнал, что Аксес? :)

Автор: Frees 17.12.2009, 15:44
chip_and_dayl,  в drkb статья "Как узнать номер автоинкремента при вставке новой записи?" drkb.ru

Автор: Akella 17.12.2009, 16:04
База локальная или многопользовательская? Может
Код

Select Max(ID) from table1

Автор: chip_and_dayl 17.12.2009, 18:05
Akella
Дво-пользовательская:)

Одни словом писал дополнительный SQL-запрос который находит тот ИД

Код

 DataModule1.QClient.Close;
  DataModule1.QClient.SQL.Clear;
  DataModule1.QClient.SQL.Add('select max(cCode) as tCode from Client where cName=''' + Edit2.Text + '''');
  DataModule1.QClient.Open;


Добавлено через 1 минуту и 10 секунд
Я думал может какое-то свойство ADoQuery хранит внесенные значения в БД, но как оказалось нету

Автор: ТоляМБА 17.12.2009, 18:48
chip_and_dayl, в том то и дело что если база многопользовательская (более одного пользователя) на этом запросе можно словить грабли. Причем словить можно через 5 минут а можно и через месяц или год. Когда возникнет ситуация что оба пользователя одновременно добавят запись, не будут же они совещаться каждый раз при добавлении.

Автор: chip_and_dayl 17.12.2009, 19:07
ТоляМБА
Ммм, так я там не зря добавил условие 

Код

where cName=''' + Edit2.Text + ''''


Я сомневаюсь, что одновременно два пользователя будут добавлять одно и то же название, да еще при условие что название будет тютенька в тютеньку :)

Автор: ТоляМБА 17.12.2009, 19:21
Цитата(chip_and_dayl @  17.12.2009,  21:07 Найти цитируемый пост)
Я сомневаюсь

Цитата
Закон Мерфи. Если какая-нибудь неприятность может случиться, она случается.


Если база многопользовательская, то логично предположить что ведется логирование. Тогда в условие запроса можно ещё добавить что-то типа AND User_ID=CurrentUser. То есть вывести максимальное ID где cName=''' + Edit2.Text + '''' введённое именно этим пользователем.

Автор: Akella 18.12.2009, 00:37
Название будет разное, а ID получится одинаковый.

Автор: Romikgy 20.12.2009, 01:41
Код

SELECT @@IDENTITY

http://msdn.microsoft.com/en-us/library/aa140015%28office.10%29.aspx

Автор: chip_and_dayl 20.12.2009, 11:43
Romikgy
Я в прошлый раз смотрел в сторону глобальной переменной @@Identity, но так и не дошло как оно работает. Сегодня осенило, спс

Автор: Romikgy 21.12.2009, 12:35
chip_and_dayl, мои те поздравления , что осенило smile 
удачи в освоении дельфи...

Автор: dvamaster 22.12.2009, 07:16
а еще добавлю, делай транзакцию (типа сессия на юзверя)
Код

BEGIN TRANSACTION
выполняешь вставку
SELECT @@IDENTITY
используешь @@IDENTITY
COMMIT TRANSACTION

без нее у меня был косяк, когда одновременно добавляли несколько человек

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)