Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2014, 15:04   #1
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию Сгенерированный ID в поле autoincrement

Всем привет!

Делаю так:

Код:
D.Query.SQL.Text:= 'INSERT INTO Cats (sParent) VALUES(''12345'')';
D.Query.ExecSQL;
D.Query.SQL.Text:= 'Select @@IDENTITY as LastId';
D.Query.Open;
ShowMessage(D.Query.fieldbyname('LastId').AsString);
Но результат всегда "0". Кто знает, почему не работает?
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 28.11.2014, 15:29   #2
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Потому что транзакции разные, делай так:
Код:
D.Query.SQL.Text:= 'INSERT INTO Cats (sParent) VALUES(''12345'')'#13#10+
                            'Select @@IDENTITY as LastId';
D.Query.ExecSQL;
ShowMessage(D.Query.fieldbyname('LastId').AsString);
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 28.11.2014, 15:45   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Потому что транзакции разные, делай так
Транзакции не при чем. И у ТС ACCESS, в предыдущем вопросе был по крайней мере. Тем более не будет работать. Поле счетчик создано в таблице?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.11.2014, 15:51   #4
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Несогласен с Аватар... дело в транзакции, инсерт выполняется в одной транзакции(сессии), а идентификатор он хочет получить совершенно в другой транзакции(сессии).
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 28.11.2014, 15:55   #5
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от D-mon Посмотреть сообщение
Потому что транзакции разные, делай так:
Код:
D.Query.SQL.Text:= 'INSERT INTO Cats (sParent) VALUES(''12345'')'#13#10+
                            'Select @@IDENTITY as LastId';
D.Query.ExecSQL;
ShowMessage(D.Query.fieldbyname('LastId').AsString);
Я уже делал так, пишет, что пропущен ( ; ) в инструкции


Цитата:
Сообщение от Аватар Посмотреть сообщение
Транзакции не при чем. И у ТС ACCESS, в предыдущем вопросе был по крайней мере. Тем более не будет работать. Поле счетчик создано в таблице?

Да. Таблица создана так

Код:
D.CreateTable('Cats', 'Id autoincrement primary key, sParent int, sName varchar');
База данных MS Access+ADO

На данный момент я получаю последний Id так:

Код:
SELECT Id FROM Cats ORDER BY id DESC
Ну а потом беру первую запись. Но это неправильно. При большом кол-ве строк это вообще глупо

Цитата:
Сообщение от D-mon Посмотреть сообщение
Несогласен с Аватар... дело в транзакции, инсерт выполняется в одной транзакции(сессии), а идентификатор он хочет получить совершенно в другой транзакции(сессии).
Код:
D.Query.SQL.Clear;
D.Query.SQL.Add('INSERT INTO Cats (sName) VALUES(''12345'')');
D.Query.SQL.Add('Select @@IDENTITY as LastId');
D.Query.ExecSQL;
Так не работает. Пишет, что ошибка в инструкции
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru

Последний раз редактировалось Stilet; 28.11.2014 в 19:44.
grominfo вне форума Ответить с цитированием
Старый 28.11.2014, 15:59   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
транзакции(сессии)
Чего это транзакция и сессия одно и тоже. Сессия это обычно в рамках соединения с базой, повторяю обычно, есть другие варианты. Транзакций в рамках сессии может быть сколь угодно. Так вот, @@IDENTITY в рамках сессии, а не транзакции. И у меня прекрасно работает по коду из #1
Цитата:
Да. Таблица создана так
А зачем её програмно создавать?
Цитата:
CreateTable
Чей это метод. Тип компонента?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.11.2014 в 16:07.
Аватар вне форума Ответить с цитированием
Старый 28.11.2014, 16:13   #7
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

В рамках сессии @@IDENTITY межет менятся много раз. И поэтому
Код:
select @@IDENTITY
нужно делать в рамках транзакции, что бы точно подцепить свой @@IDENTITY.

Цитата:
Сообщение от grominfo Посмотреть сообщение
Я уже делал так, пишет, что пропущен ( ; ) в инструкции
Код:
D.Query.SQL.Text:= 'INSERT INTO Cats (sParent) VALUES(''12345'');'#13#10+
                            'Select @@IDENTITY as LastId;';
D.Query.ExecSQL;
ShowMessage(D.Query.fieldbyname('LastId').AsString);
Нет невыполнимых задач, всё дело времени...

Последний раз редактировалось Stilet; 28.11.2014 в 19:47.
D-mon вне форума Ответить с цитированием
Старый 28.11.2014, 16:19   #8
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от D-mon Посмотреть сообщение
Код:
D.Query.SQL.Text:= 'INSERT INTO Cats (sParent) VALUES(''12345'');'#13#10+
                            'Select @@IDENTITY as LastId;';
D.Query.ExecSQL;
ShowMessage(D.Query.fieldbyname('LastId').AsString);
Ставил уже. Пишет, что обнаружены символы за пределами инструкции

Цитата:
Сообщение от Аватар Посмотреть сообщение
А зачем её програмно создавать?
Программа - это специфический справочник. В ней создаются, удаляются, изменяются справки. Поэтому нужно динамически создавать базы


Цитата:
Сообщение от Аватар Посмотреть сообщение
CreateTable
Чей это метод. Тип компонента?
Это мой класс-обертка над ADO. Сделан для упрощения работы
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru

Последний раз редактировалось Stilet; 28.11.2014 в 20:04.
grominfo вне форума Ответить с цитированием
Старый 28.11.2014, 16:50   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
нужно делать в рамках транзакции, что бы точно подцепить свой @@IDENTITY
Тогда уж явно открывать транзакцию, последовательно выполнять две команды и закрывать транзакцию. Не помню, что бы ADO и JETOLEDB для ACCESS мог пакеты обрабатывать. Но у ТС что-то другое - 0 в любом случае не должен быть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.11.2014, 18:36   #10
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

UP

Ну че, ни у кого нет решения? Везде на форумах советуют именно эту конструкцию, но она не работает ни в моей обертке, ни напрямую в ADOQuery
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поле autoincrement sergeant94 БД в Delphi 2 18.06.2013 15:12
бъет ли ферзь, установленный в поле (k, l) поле (m, n). Antua Помощь студентам 5 24.03.2012 12:03
При удалении записей значения полей с type:=Autoincrement (т.е+) в оставшихся полей не изменяются kenta БД в Delphi 2 29.10.2009 08:28
После ввода в поле по Enter нужно перейти на другое поле! •ScReam•™ Помощь студентам 2 16.06.2009 08:47