![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
грабли в ADO + JET... [D5, Jet 4]
wicked © (2002-03-14 10:03:00)не подскажет ли кто, как бороться с автоинкрементными полями access 2000?..
проблема в том, что при чтении описаний полей из таблицы он их читает как readonly и потом не даёт вставить запись (говорит, что не может модифицировать поле <xx>), если же readonly с такого поля убрать, то не даёт вставить запись по другой причине - недостаточная информация про ключ записи...
заранее извините, если решение очевидно, но сам не додумался...
Dust (2002-03-18 15:38:00) [1]Тогда подброшу такой вариант:
Через TADOSQL делаем INSERT INTO ... VALUES (...)
Затем открываем в этом-же запросе SELECT`ом ЭТУ-же таблицу,
затем Query.Last - и вытаскиваем значение ключевого автоинкрементного поля. В однопользовательской БД работает - в многопользовательской возможны ошибки, когда добавлена запись другим юзером.
П.С. Для ADO в 5-м Delphi оччень рекомендую натянуть 1-й сервиспак. Там Борландовцы много чего пофиксили.
wicked (2002-03-18 15:13:00) [2]2 MaXim1999
ссылка - http://web.orbitel.bg/vassil/
там и ищи...
2 Модератор
пора прибивать ветку... проблема решена... :)
erik (2002-03-18 13:17:00) [3]Я решил проблему более кординально. Никогдп неиспользую автоинкриментные поля. На App сервере сделал класс который генерирует уникальные значения для полей последовательно. Очень круто работает! Могу выслать кому надо.
P.S. Если на MsJet использовать инкрементрые поля и одновременый доступ нескольких пользователей к базе то будут ошибки!
MaXim1999 (2002-03-18 13:08:00) [4]Так одни и те-же база и программа на разных машинах дают такую ерунду: то работает а то нет, даже на одной и той-же машине по разному бывает.
Для wicked: а где его достать TBetterADODataset подбрось ссылку плз, а то некогда искать.
wicked (2002-03-18 10:49:00) [5]2 MaXim1999
а проиндексованы одинаково?.... проверь и это....
2 All
выяснил я, в чём дело...
оказывается, грабли были хорошо замаскированы - часть пряталась в борландовской реализации датасета - при вставке пустой записи в буффер автоинкрементного поля попадает мусор... вообще-то он не всегда туда попадает, а только если присваивать значения каким-либо полям новой записи в обработчике OnAfterInsert... соответственно, TCustomADODataset пытается запихнуть этот мусор OLE DB провайдеру...
вторая часть граблей - в самом провайдере Jet OLE DB... оказывается, он принимает и ЗАПИСЫВАЕТвсе значения полей, переданные ему, в том числе и автоинкрементные... соответственно, получался key violation...
лечится проблема путём отучения TCustomADODataset"а передавать значения автоинкрементного поля провайдеру... например, через использование TBetterADODataset - он не передаёт провайдеру поля, в которых FieldKind не равно fkData...
делайте выводы, господа, что есть суксь, а что есть рулезь... :)
MaXim1999 (2002-03-18 10:07:00) [6]Да, забыл сказать в некоторых случаях на одной и той-же базе все работае нормально на одной машине, а на другой машине глючит.
MaXim1999 (2002-03-18 09:57:00) [7]Помогите плз. У меня тут аналогичная проблема вылезла: есть несколько баз с едентичной структурой, но при подключении к одним записи в таблицы вставляются, а при подключении к ругим "Isufficient base table information for updating or refreshing". Такое впечатление что издевается :(
wicked (2002-03-14 17:49:00) [8]это TBetterADODataset, надстройка над TADODataset... и так как он есть потомком TDataSet, то по двойному клику в design time вызывается редактор "persistent" полей...
ну ладно... мы отвлеклись... судя по всему, это проблемы с самим jet"ом, поскольку аналогичный код без проблем работает под mssql...
Johnmen (2002-03-14 16:49:00) [9]>wicked © : Давай выражаться более четко !
>>>при двойном клике на dataset"е<<<
И где же это такое dataset, что на нем можно кликать ?
wicked (2002-03-14 16:35:00) [10]2 Johnmen ©
:) может мы о разных вещах говорим?...
я имел в виду список "persistent" полей, который выскакивает при двойном клике на dataset"е... из запроса я его не убирал...
Johnmen (2002-03-14 15:55:00) [11]>wicked © : Так ты и не обращайся к полям, которых нет в списке полей ! Иначе ест-но ошибка !
wicked (2002-03-14 15:43:00) [12]2 Johnmen ©
потому что я пробовал... убирал из Fields Editor"а автоинкрементное поле, а потом в коде пробовал обращаться к нему через FindField... результат нулевой - AV... "insert into" думаю пройдёт, но по идеологическим соображениям не подходит - хотелось вставлять записи из Grid"а... хотя, чувствую, придётся попуститься...
2 S
обязательных полей в той таблице нету... специально поубирал ради научного интереса...
S (2002-03-14 14:03:00) [13]Посмотри а Acess какие поля у тебя обязательные и только их заполняй. А про счетчики забудь т.к. он только для чтения. Если тебе необходимо менять значения в твоем счетчике то завиди еще один. И уже его не меняй тогда все пойдет без гимороя.
Johnmen (2002-03-14 13:39:00) [14]Не совсем понял, почему 2-е не подходит.
А м.б. просто : INSERT INTO ... без всяких НД ?
wicked (2002-03-14 12:37:00) [15]2 Johnmen ©
спасибо, но ни 1-е (у меня все false, уже когда-то натыкался), ни 2-е (я его активно потом использую) не подходит... :(
Johnmen (2002-03-14 12:10:00) [16]1. попробуй Required:=False;
2. в FieldEditor пропиши только те поля, которые хочешь менять...
wicked (2002-03-14 11:56:00) [17]да не о том я... не хочу я его менять... хочу, чтоб записи вставляло БЕЗ дурацкихошибок и геморроя...
sniknik (2002-03-14 11:42:00) [18]Может и ошибаюсь но автоикрементное поле и в MS SQL изменить нельзя только читать. Так что ненавидь летше весь Microsoft :).
wicked (2002-03-14 11:37:00) [19]ну вот... это вообще... после того, как одно из полей (не автоинкрементное) удалено и восстановлено, одна вставка проходит нормально, а дальше всё то же...
ненавижу access :-[
must die "n burn...
wicked (2002-03-14 10:52:00) [20]да нет... здесь скорее техническая сторона... :(
так ни у кого идей нет?...