-
jiura (17.01.12 16:35) [0]Здравствуйте!
Использую Access и компоненты ADOQuery и ADOConnection. В определенный момент при нажатии на кнопку пользователя я добавляю новую пустую строку в базу данных, а именно:
‘
ADOQuery1.SQL.Add('INSERT INTO Orders (S1) VALUES('''')');
‘
Т.е. добавляю строку с пустым значением в столбце. Сама таблица orders содержит автоатиеский счетчик, который после добавления записи увеличивается на один. Мне необходимо узнать его номер. Т.е. номер последней актуальной записи.
Два нюанса.
Если я делаю так (S1 - счетчик):
ADOQuery1.SQL.Add('SELECT S1 FROM Orders');
ADOQuery1.Active:=True;
Showmessage(INttostr(ADOQuery1.RecordCount));
То он все равно не выводит последнюю запись, так как пустые записи добавленные до этого по ходу оказываются вверху таблицы и номер счетчика выводится неверно.
А если делаю так (S1 - счетчик):
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT max(S1) FROM Orders');
ADOQuery1.Active:=True;
То он вроде как выводит поседею запись, но как узнать ее номер я не знаю. Помогите пож-ста. -
1. Select @@Identity - возвращает последнее значение счетчика в текущем подключении.
2. Чтобы спозиционировать курсор на запись зная ее ID необходимо
Использовать метод Locate
AdoQuery.Locate ();ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT @@Identity');
ADOQuery1.Active:=True;
ID = AdoQuery.fields[0].value;
AdoQury2.locate ('S1',ID,[])
По моему так, сейчас нет delphi под рукой -
var
RecordsAffected, Identity: integer;
begin
with ADOCommand1 do begin
CommandText:= 'INSERT INTO aTable (Name) VALUES (''Name'')';
Execute(RecordsAffected, EmptyParam);
CommandText:= 'SELECT @@IDENTITY';
Identity := Execute.Fields[0].Value;
end;
Edit1.Text:= IntToStr(RecordsAffected) +':'+ IntToStr(Identity);
end; -
> То он все равно не выводит последнюю запись, так как пустые
> записи добавленные до этого по ходу оказываются вверху таблицы
> и номер счетчика выводится неверно.
А ты не номер счётчика выводишь, а количество записей в таблице.
Вот представь. Изначальное значение счётчика 0. Я добавил 10 записей. Текущее значение счётчика стало 10. Потом я удалил все 10 записей. Текущее значение счётчика не изменилось. Теперь я добавил одну запись. Текущее значение счётчика - 1. А тыADOQuery1.SQL.Add('SELECT S1 FROM Orders');
ADOQuery1.Active:=True;
Showmessage(INttostr(ADOQuery1.RecordCount));
выводишь RecordCount который будет равен единице.
Смотри вариант sniknik © -
Опечатка
> Текущее значение счётчика - 1
Текущее значение счётчика - 11. -
Alex_C (25.01.12 21:00) [5]
> 1. Select @@Identity - возвращает последнее значение счетчика
> в текущем подключении.
Правильно ли я понимаю - Select @@Identity - последнее для ДАННОГО подключения, т.е. то, что я сейчас вставил, Select Max(S1) - это ВООБЩЕ последнее для ВСЕХ подключений? -
> Select Max(S1) - это ВООБЩЕ последнее для ВСЕХ подключений?
Не знаю, как конкретно в Access, но вообще Select Max(S1) - максимальное из всех подтверждённых (comitted)