Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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-й сервиспак. Там Борландовцы много чего пофиксили.



Страницы: 1 вся ветка

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

Наверх





Память: 0.49 MB
Время: 0.005 c
3-22558
a_a_k
2002-03-15 15:59
2002.04.08
CalcFields


1-22763
koks
2002-03-27 09:59
2002.04.08
Ламерский вопрос - но в хелпе ничего нет нашел.


7-22862
Garrison
2001-12-14 17:14
2002.04.08
Большие числа


1-22650
PEC
2002-03-28 12:00
2002.04.08
Привет народ !


3-22582
Malder
2002-03-17 11:26
2002.04.08
IBguard.exe и IBserver.exe





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский