Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с Ado [D7]


Roma L ©   (2006-12-28 05:14:00) 

Метод ADOTable.last не доходит до конца таблицы. Не могу понять причину такого поведения.


Desdechado   (2006-12-29 11:34:00) [1]

"большие грабли" означает, что несколько параллельно работающих пользователей могут выполнить этот код одновременно, получив одинаковое значение. В итоге при вставке записей либо будет ошибка вставки, либо какой-нибудь пользователь узнает код чужой записи, а не своей. В итоге - каждому по лбу, а тебе - в совокупности от них.


Ega23   (2006-12-29 10:00:00) [2]


> А что делать при многопользовательской работе? Что значит
> "Большие грабли"?
>


Я включу телепатор и попробую догадаться: тебе нужен максимальный ID для вставки следующей записи, а поле не identity? Тогда выполняй скрипт такого вида:


Declare @x int
Select @X=IsNull(Max(id)+1, 1) from table
Insert into table (id, ....) Values (@x, ....)


Roma L   (2006-12-29 03:59:00) [3]

Что если взять ADOQuery и отсортировать по полю "КОД"?


Roma L   (2006-12-29 03:55:00) [4]


> Метод Ega23 ©   (28.12.06 11:41) [7] годится только для
> однопользовательской работы, иначе большие грабли.

А что делать при многопользовательской работе? Что значит
"Большие грабли"?


Roma L   (2006-12-29 03:54:00) [5]

А что делать при многопользовательской работе? Что значит
"Большие грабли"?


Ega23   (2006-12-28 11:47:00) [6]


> Метод Ega23 ©   (28.12.06 11:41) [7] годится только для
> однопользовательской работы, иначе большие грабли.
>


Ega23 © не вдавался в подробности построения прграммной архитектуры сабжа, Ega23 © всего лишь переписал жуть из [5].
Сам Ega23 © так никогда не делает...   :о)


Desdechado   (2006-12-28 11:45:00) [7]

Метод Ega23 ©   (28.12.06 11:41) [7] годится только для однопользовательской работы, иначе большие грабли.


Ega23   (2006-12-28 11:41:00) [8]


begin
 With TADODataSet.Create(nil) do
   begin
     try
       Connection := ADOConnection1;
       CommandTExt := 'Select IsNull(Max(Код), -1) as X from Таблица';
       try
        Open;
        Result := Fields[0].Value
       except
         ShowMessage('Фигня при открытии') ;
         Result := -1;
       end;
     finally
      Close;
      Free;
     end;
   end;
end;


Примерно так.


Desdechado   (2006-12-28 10:52:00) [9]

Это не последняя строка в таблице, этопоследняя строка в SQL-выборке, которая имитирует таблицу. А поскольку неупорядоченная выборка может возвращать данные в произвольном порядке (это стандартное поведение), то пользоваться этим методом нельзя.

Вообще забудь про Table, используй ADODataset и ADOCommand.


Roma L   (2006-12-28 08:57:00) [10]

В программе имеется функция, которая определяет код последней добавленной строки. Но с некоторого момента она начинает возвращить одно и тоже значение (Хотя Код - поле счетчик, и данные постоянно добавляются). Приведу текст функции.

var
  T:TAdoTable;
begin
  t:= TAdoTable.Create(Form1);
  t.Connection:=AdoConnection1;
  t.TableName:='Втаблица';
  t.Active:=true;
  t.last;
  result:=t.FieldByName('Код').AsInteger;
  t.Active:=False;
  t.Free;
end;

Примерно так.


ORMADA   (2006-12-28 08:33:00) [11]

потрясно!
ты с чем сравниваешь то
сделай order by и потом уж сравнивай


MsGuns   (2006-12-28 08:27:00) [12]

>Roma L   (28.12.06 08:23) [2]
>Как ни странно AdoTAble.EOF переходит в true, но по  значению полей видно , что указатель находится на середине таблицы

Что понимается под "серединой таблицы" ?


Roma L   (2006-12-28 08:23:00) [13]

Как ни странно AdoTAble.EOF переходит в true, но по  значению полей видно , что указатель находится на середине таблицы.


ЮЮ   (2006-12-28 06:35:00) [14]


> Метод ADOTable.last не доходит до конца таблицы

Как догадался? Неужели ADOTable.EOF остается False?


Наверх

Титульная страница Поиск, карта сайта Написать письмо