Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];




Вниз

грабли в ADO + JET... 


wicked   (2002-03-14 10:03) [0]

не подскажет ли кто, как бороться с автоинкрементными полями access 2000?..
проблема в том, что при чтении описаний полей из таблицы он их читает как readonly и потом не даёт вставить запись (говорит, что не может модифицировать поле <xx>), если же readonly с такого поля убрать, то не даёт вставить запись по другой причине - недостаточная информация про ключ записи...
заранее извините, если решение очевидно, но сам не додумался...



MaXim1999   (2002-03-14 10:21) [1]

Можно сделать, но в данном варианте довольно медленно: подключить подчиненную таблицу с перечнем всех полей таблицы, которую нужно обновить. Вставлять (изменить) запись не указывая значение инкрементного поля, запомнить (.Post), а потом обновить запрос и получить уже то значение, которое присвоил сам Access. Например в одной программе у меня так:
DocsPositions.DisableControls;
SubDocs.DisableControls;
SubDocs.Insert;
SubDocs.Edit;
SubDocsKodKard.Value:=чего-то-там;
SubDocsKodDoc.Value:=чего-то-там;
SubDocsPrihod.Value:=чего-то-там;
SubDocsRashod.Value:=чего-то-там;
SubDocsOstatok.Value:=чего-то-там;
SubDocs.Post;
SubDocs.Requery();
SubDocs.EnableControls;
DocsPositions.Requery();
DocsPositions.EnableControls;
DocsPositions - то что мне нужно на экран.
SubDocs - просто таблица со всеми полями.
Если кто подскажет проще буду благодарен.



wicked   (2002-03-14 10:52) [2]

да нет... здесь скорее техническая сторона... :(
так ни у кого идей нет?...



wicked   (2002-03-14 11:37) [3]

ну вот... это вообще... после того, как одно из полей (не автоинкрементное) удалено и восстановлено, одна вставка проходит нормально, а дальше всё то же...
ненавижу access :-[
must die "n burn...



sniknik   (2002-03-14 11:42) [4]

Может и ошибаюсь но автоикрементное поле и в MS SQL изменить нельзя только читать. Так что ненавидь летше весь Microsoft :).



wicked   (2002-03-14 11:56) [5]

да не о том я... не хочу я его менять... хочу, чтоб записи вставляло БЕЗ дурацких ошибок и геморроя...



Johnmen   (2002-03-14 12:10) [6]

1. попробуй Required:=False;
2. в FieldEditor пропиши только те поля, которые хочешь менять...



wicked   (2002-03-14 12:37) [7]

2 Johnmen ©
спасибо, но ни 1-е (у меня все false, уже когда-то натыкался), ни 2-е (я его активно потом использую) не подходит... :(



Johnmen   (2002-03-14 13:39) [8]

Не совсем понял, почему 2-е не подходит.
А м.б. просто : INSERT INTO ... без всяких НД ?



S   (2002-03-14 14:03) [9]

Посмотри а Acess какие поля у тебя обязательные и только их заполняй. А про счетчики забудь т.к. он только для чтения. Если тебе необходимо менять значения в твоем счетчике то завиди еще один. И уже его не меняй тогда все пойдет без гимороя.



wicked   (2002-03-14 15:43) [10]

2 Johnmen ©
потому что я пробовал... убирал из Fields Editor"а автоинкрементное поле, а потом в коде пробовал обращаться к нему через FindField... результат нулевой - AV... "insert into" думаю пройдёт, но по идеологическим соображениям не подходит - хотелось вставлять записи из Grid"а... хотя, чувствую, придётся попуститься...

2 S
обязательных полей в той таблице нету... специально поубирал ради научного интереса...



Johnmen   (2002-03-14 15:55) [11]

>wicked © : Так ты и не обращайся к полям, которых нет в списке полей ! Иначе ест-но ошибка !



wicked   (2002-03-14 16:35) [12]

2 Johnmen ©
:) может мы о разных вещах говорим?...
я имел в виду список "persistent" полей, который выскакивает при двойном клике на dataset"е... из запроса я его не убирал...



Johnmen   (2002-03-14 16:49) [13]

>wicked © : Давай выражаться более четко !
>>>при двойном клике на dataset"е<<<
И где же это такое dataset, что на нем можно кликать ?



wicked   (2002-03-14 17:49) [14]

это TBetterADODataset, надстройка над TADODataset... и так как он есть потомком TDataSet, то по двойному клику в design time вызывается редактор "persistent" полей...
ну ладно... мы отвлеклись... судя по всему, это проблемы с самим jet"ом, поскольку аналогичный код без проблем работает под mssql...



MaXim1999   (2002-03-18 09:57) [15]

Помогите плз. У меня тут аналогичная проблема вылезла: есть несколько баз с едентичной структурой, но при подключении к одним записи в таблицы вставляются, а при подключении к ругим "Isufficient base table information for updating or refreshing". Такое впечатление что издевается :(



MaXim1999   (2002-03-18 10:07) [16]

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



wicked   (2002-03-18 10:49) [17]

2 MaXim1999
а проиндексованы одинаково?.... проверь и это....

2 All
выяснил я, в чём дело...
оказывается, грабли были хорошо замаскированы - часть пряталась в борландовской реализации датасета - при вставке пустой записи в буффер автоинкрементного поля попадает мусор... вообще-то он не всегда туда попадает, а только если присваивать значения каким-либо полям новой записи в обработчике OnAfterInsert... соответственно, TCustomADODataset пытается запихнуть этот мусор OLE DB провайдеру...
вторая часть граблей - в самом провайдере Jet OLE DB... оказывается, он принимает и ЗАПИСЫВАЕТ все значения полей, переданные ему, в том числе и автоинкрементные... соответственно, получался key violation...

лечится проблема путём отучения TCustomADODataset"а передавать значения автоинкрементного поля провайдеру... например, через использование TBetterADODataset - он не передаёт провайдеру поля, в которых FieldKind не равно fkData...

делайте выводы, господа, что есть суксь, а что есть рулезь... :)



MaXim1999   (2002-03-18 13:08) [18]

Так одни и те-же база и программа на разных машинах дают такую ерунду: то работает а то нет, даже на одной и той-же машине по разному бывает.

Для wicked: а где его достать TBetterADODataset подбрось ссылку плз, а то некогда искать.



erik   (2002-03-18 13:17) [19]

Я решил проблему более кординально. Никогдп неиспользую автоинкриментные поля. На App сервере сделал класс который генерирует уникальные значения для полей последовательно. Очень круто работает! Могу выслать кому надо.
P.S. Если на MsJet использовать инкрементрые поля и одновременый доступ нескольких пользователей к базе то будут ошибки!



wicked   (2002-03-18 15:13) [20]

2 MaXim1999

ссылка - http://web.orbitel.bg/vassil/
там и ищи...

2 Модератор
пора прибивать ветку... проблема решена... :)



Dust   (2002-03-18 15:38) [21]

Тогда подброшу такой вариант:
Через TADOSQL делаем INSERT INTO ... VALUES (...)
Затем открываем в этом-же запросе SELECT`ом ЭТУ-же таблицу,
затем Query.Last - и вытаскиваем значение ключевого автоинкрементного поля. В однопользовательской БД работает - в многопользовательской возможны ошибки, когда добавлена запись другим юзером.

П.С. Для ADO в 5-м Delphi оччень рекомендую натянуть 1-й сервиспак. Там Борландовцы много чего пофиксили.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.027 c
1-22627           Zool                  2002-03-27 19:37  2002.04.08  
Очень просто


1-22700           sammy                 2002-03-25 19:43  2002.04.08  
Установка Языка


1-22634           dymka                 2002-03-27 14:11  2002.04.08  
Про отчеты.


1-22637           Andrew1               2002-03-27 20:46  2002.04.08  
Как создать (и перемещаться по ним) параграфы в Word e?


14-22840          rick                  2002-03-01 13:34  2002.04.08  
поисковые системы