Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить ID добавленой записи, через ADOQuery 
:(
    Опции темы
ArtemRubtsov
Дата 20.11.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.11.2006

Репутация: нет
Всего: нет



БД MS SQL 
компонент ADOQuery
Есть задача добавить запись в таблицу БД, при этом для нее будет сгенерировано некое уникальное значение счетчика
Вопрос как получить значение этого счетчика для добаваляемой записи, чтобы потом эту запись можно было найти по этому уникальному ID?

так не работает, выдает ошибку в строке 5, пишет что поле ID не найдено
Код

DBQuery.Close;
DBQuery.SQL.Add('INSERT INTO TABLE1 (FIELD1,FIELD2) VALUES(:Param2,:Param3)');
DBQuery.SQL.Add('SELECT * from TABLE1 where ID=:Param1');
DBQuery.Parameters.ParseSQL(frmMain.DBQuery.SQL.Text,true);
DBQuery.Parameters.ParamByName('Param1').Value:= frmMain.DBQuery.FieldValues['ID']; 
DBQuery.Parameters.ParamByName('Param2').Value:= Filed1Value;
DBQuery.Parameters.ParamByName('Param3').Value:=Filed2Value;  
DBQuery.ExecSQL;
Result := DBSource.DataSet.FieldByName('ID').AsInteger;


Это сообщение отредактировал(а) ArtemRubtsov - 20.11.2007, 23:02
PM MAIL   Вверх
Deniz
Дата 21.11.2007, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Примерно так
Код

declare @ID int;
insert into ... values( ... );
set @ID = @@identity;
select ... from ... where id=@ID;



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
pseud
Дата 21.11.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



не знаю как в MS SQL, но в Oracle есть Sequencies

попробуем без всяких примочек, как если бы мы работали с Paradox

Код

DBQuery.Active := False;
DBQuery.SQL.Clear;
DBQuery.SQL.Add('INSERT INTO TABLE1 (FIELD1,FIELD2) VALUES(:Param2,:Param3)');
DBQuery.Parameters.ParamByName('Param2').Value:= Filed1Value;
DBQuery.Parameters.ParamByName('Param3').Value:=Filed2Value; 
DBQuery.ExecSQL;

DBQuery.Active := False;
DBQuery.SQL.Clear;
DBQuery.SQL.Add('SELECT MAX(ID) as max_id from TABLE1');
DBQuery.Active := True;
id := DBQuery.FieldByName('max_id').AsInteger;

DBQuery.Active := False;
DBQuery.SQL.Clear;
DBQuery.SQL.Add('SELECT * from TABLE1 WHERE ID = ' + IntToStr(id));
DBQuery.Active := True;



хотя мой совет - использовать процедуру, в которой:
1. сделать инсерт
2. вернуть ID

а то ведь первый ExecSQL мог и не выполниться

Добавлено через 55 секунд
имеется ввиду процедуру SQL сервера


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 21.11.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



а если между 
Код

DBQuery.Active := False;
DBQuery.SQL.Clear;
DBQuery.SQL.Add('INSERT INTO TABLE1 (FIELD1,FIELD2) VALUES(:Param2,:Param3)');
DBQuery.Parameters.ParamByName('Param2').Value:= Filed1Value;
DBQuery.Parameters.ParamByName('Param3').Value:=Filed2Value; 
DBQuery.ExecSQL;


и

Код

DBQuery.Active := False;
DBQuery.SQL.Clear;
DBQuery.SQL.Add('SELECT MAX(ID) as max_id from TABLE1');
DBQuery.Active := True;
id := DBQuery.FieldByName('max_id').AsInteger;


Произойдёт:
1. Исключение
2. добавление новой записи другим клиентом
PM MAIL   Вверх
pseud
Дата 21.11.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Akella, поэтому я и написал:
Цитата(pseud @  21.11.2007,  11:31 Найти цитируемый пост)
хотя мой совет - использовать процедуру

которая после инсерта вернет ID 



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
ArtemRubtsov
Дата 21.11.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.11.2006

Репутация: нет
Всего: нет



Цитата(Deniz @ 21.11.2007,  07:27)
Примерно так
Код

declare @ID int;
insert into ... values( ... );
set @ID = @@identity;
select ... from ... where id=@ID;

спасибо
я попробую так
PM MAIL   Вверх
Deniz
Дата 22.11.2007, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



ArtemRubtsov, попробуй мой код весь запихать в ADOQuery и выполнить Open


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
SergXPI
Дата 22.11.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.9.2005
Где: г.Харьков

Репутация: нет
Всего: нет



Я использую следующий прием.
При вставке новой записи в любое поле типа String пишу 'новая запись' (можно написать все что угодно).
Суть в том, что по этой записи ты сможеш всегда идентифицировать новую запись и определить ее ID
Код

 Table.Insert;
 Table.FieldByName('Param1').AsString:='новая запись';
 Table.Post;
 IF Table.select('Param1','новая запись',[loCaseInsensitive]) Then
  Begin
   ID:=Table.FieldByName('max_id').AsInteger;
   Table.FieldByName('Param1').AsString:='';
  End; 


для БД MS SQL  суть таже, нужно только синтаксис поменять

Это сообщение отредактировал(а) SergXPI - 22.11.2007, 17:30
PM MAIL   Вверх
Deniz
Дата 23.11.2007, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



SergXPI, нельзя так делать, если кто-то в тот же момент добавит - будет 2, 3, 4 и т.д. новых записей.
Вариант может пройти только если есть возможность прямо управлять транзакциями с определенным уровнем изоляции и коммитеть только после выборки ID.
Вместо 'новая запись' на клиенте можно 1 раз сгенерировать GUID и ставить уже его.



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
SergXPI
Дата 23.11.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 28.9.2005
Где: г.Харьков

Репутация: нет
Всего: нет



Если пользователей несколько, тогда
Код

 Table.Insert;
 Table.FieldByName('Param1').AsString:='новая запись для '+IntToStr(N);
 Table.Post;
 IF Table.select('Param1','новая запись для '+IntToStr(N),[loCaseInsensitive]) Then
 ...


где, N - уникальный номер пользователя
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0958 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.