![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с 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?