![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Куда пропадает значение счетчика? [D7, ADO]
allrussia © (2006-12-24 11:58:00)Создаю таблицу
'CREATE TABLE TableName (ID COUNTER PRIMARY KEY, COL_MAN TEXT (255))'
вставляю записи
for i:=0 to 10 do
begin
Table1.Insert;
Table1.FieldByName('COL_MAN').AsString:= s [i];
Table1.Post;
end;
все, далее жму кнопку:
Table1.recordno:=5;
Showmessage(Table1.FieldByName('COL_MAN').AsString)
- работает
жму другую кнопку
Table1.recordno:=5;
Showmessage(Table1.FieldByName('ID').AsString)
- НЕ работает!!!???
Все время показывает 0 (должно быть показание счетчика, в данном примере 5).
Самое интересное, если таблицу закрыть, и открыть заново, все фурычит.
Но самое смешное, то что я торможу цикл добавления записей показом сообщения допустим где-то в середине
for i:=0 to 10 do
begin
if i = 5 then ShowMessage ('');
Table1.Insert;
Table1.FieldByName('COL_MAN').AsString:= s [i];
Table1.Post;
end;
...копирую в этот момент файл базы в другое место, открываю ее в Access и вижу, что все записи колонки ID имеют свои номера, какими они и должны быть. Баг или brain.sys?
allrussia (2006-12-28 00:29:00) [1]sniknik, Anatoly Podgoretsky
не помогло, увы, те же грабли с ADODataSet
если курсор ставишь на clUseServer то все ОК
Table1.Properties['Update Resync'].Value:=adResyncAutoIncrement
тоже не момогает
вроде бы здесь и остановиться и использовать clUseServer
но возник такой интересный момент, когда clUseServer метод locateработает очень медленно (в 5-10 раз медленнее clUseClient), зато очень быстро добавляются записи (раз в пять быстрее)
пока остановился на clUseClient а проблему решил созданием спецзаписи, из которой при добавлении новой записи берется инкремент
sniknik (2006-12-24 17:22:00) [2]> вы оба поспешные выводы делаете:
выводы делаются по показанному, а не по тому, что у тебя там на самом деле, никто у тебя за спиной не стоит и этого не видит.
> мне то как раз все равно что использовать, главное чтобы работало
тогда используй стороннего грамотного программиста...
> например у ADODataSet нет свойства TableName и все - гаплык :(
и это правильно, т.к. его (имени таблицы, да и самой таблици) на самом деле на клиенте нет, а ADOTable тебя обманывает (не только в этом) в чем и причина нежелательности его использования (его и остальных упомянутых), там "подгон" под другую логику.
(вот ты бы стал учится ездить на машине если бы на ней скорость показывалась по таблице соответствий типа если 10км/ч. то это на самом деле значит 100, а если 15 то это значит стоим и тд., а переключение передач зависело от дней недели, в понедельник переключение на первую означает вторую, во вторник заднюю, и т.д. утрированно конечно, но... ну, а объяснять как ездить на будеш после? когда уже разобрался во всех этих извращениях и понял, что единственное достойное место этой машины на свалке, а никак не на трассе. и что как думаешь имеет тут смысл объяснять, как ездить или как извратиться чтобы вот именно оно "завелось"?)
> Естесственно я еще попробую разобраться, ведь с выводами спешить не стоит
никто не спешит, тебе не один раз "давали шанс"/объясняли правильную позицию, просто с какогото момента перестанут... (после окончательного вывода) если так и будеш на "неправильных" компонентах свои проблемы показывать... (зачем повторяться, сказали же, и не раз, что смена компонента/логики большинство их(проблем) решит, не поменял сам виноват. количество повторов ограничено.)
allrussia (2006-12-24 16:11:00) [3]вы оба поспешные выводы делаете: мне то как раз все равно что использовать, главное чтобы работало
еще в [9] убрал ADOTable и как понял надо вместо него использовать ADODataSet
тогда проект не работает, например у ADODataSet нет свойства TableName
и все - гаплык :(
Естесственно я еще попробую разобраться, ведь с выводами спешить не стоит
Anatoly Podgoretsky (2006-12-24 15:27:00) [4]
> ну и судя по всему дальнейший разговор смысла не имеет.
Не из-за AdoTable, а из-за знаний 0, а упорства мax и слушать других не хочет.
Anatoly Podgoretsky (2006-12-24 15:24:00) [5]> allrussia (24.12.2006 14:53:11) [11]
Убери ТADOTable или разговаривать не о чем, не хочешь твое дело, но не жалуйся ни на что, ты сам выбрал свой путь.
sniknik (2006-12-24 15:21:00) [6]clUseServer это просто отличный от клиентского режим работы, автоинкремент должен получаться в обоих.
> если это ничем не грозит (?)
грозит, еще как грозит, т.к. ADOTable1. ну и судя по всему дальнейший разговор смысла не имеет.
Anatoly Podgoretsky (2006-12-24 15:18:00) [7]> allrussia (24.12.2006 14:21:09) [9]
Зачем же ты убрал TAdoDataset?
allrussia (2006-12-24 14:53:00) [8]sniknik
а автоинкремент получается только с сервера.
огромный сенькс за наводку!!
ADOTable1.CursorLocation присвоил clUseServer - и все заработало как надо.
если это ничем не грозит (?) то проблема решена!
sniknik (2006-12-24 14:42:00) [9]> не хотите отвечать - не стоит ругаться
это не ругань это факт. при совете "возьми А", ответ "ок,я взял Б, что дальше?/сделал Б", ??? дальнейшее бессмысленно т.к. предполагается "тебе сказали взять А", "а какая разница?/ну а я взял Б не подскажете то что я хочу для него/...", в итоге флейм, и что угодно только не то что нужно.
> что теперь использовать вместо TADOTable
уже сказали, нового добавить нечего. (кстати похоже. см. абзац выше)
> вы писали 3 Post не вызывает записи(insert) в таблицу, изза установки режима отложенных изменений.
> но тем не менее засиси поля COL_MAN доступны сразу же после .Post
записи COL_MAN вносятся на клиенте в клиентский же рекордсет, чего бы им быть недоступными? а автоинкремент получается только с сервера. (+ возможно всякие расчетные/дефаултные на сервере поля, либо присоединенные из других таблиц. но для этого уже используется другое значение для "Update Resync")
allrussia (2006-12-24 14:21:00) [10]sniknik
иначе и разговаривать не зачем.
новичковская же конференция :(
не хотите отвечать - не стоит ругаться
избавься от них, снятием с палитры, чтоб глаза не мозолили, оставшееся используй.
ок избавился,
оставил ADOConnection, ADOXCayalog, ADOCommand
что теперь использовать вместо TADOTable
кстати
вы писали 3 Post не вызывает записи(insert) в таблицу, изза установки режима отложенных изменений.
но тем не менее засиси поля COL_MAN доступны сразу же после .Post
sniknik (2006-12-24 14:04:00) [11]> а все компоненты из закладки ADO и используются+ ADOXCatalog из Activex
все не надо, надо только нужное.
sniknik (2006-12-24 14:02:00) [12]> ошибка - Applcation uses a value of the wrong type for the current operation...
и где ты увидел у меня строку? все что я говорю, понимай буквально плз. иначе и разговаривать не зачем. (не, я могу конечно и ошибиться... но это случается гораздо реже чем вы извращаете мои слова)
и где у меня сказано что нужно чтото присваивать? это значение по умолчанию. т.е. уже стоит если не менял не сбил.
> Не подскажете название нормальных компонент плз.
TADOTable, TADOQuery, TADOstoredProc вот это "ненормальные", избавься от них, снятием с палитры, чтоб глаза не мозолили, оставшееся используй.
allrussia (2006-12-24 14:01:00) [13]TAdoDataset
а все компоненты из закладки ADO и используются+ ADOXCatalog из Activex
Anatoly Podgoretsky (2006-12-24 13:56:00) [14]> allrussia (24.12.2006 13:45:04) [4]
TAdoDataset
allrussia (2006-12-24 13:45:00) [15]sniknik
Table1.Properties['Update Resync'].Value:='adResyncAutoIncrement'?
ошибка - Applcation uses a value of the wrong type for the current operation...
1 поле (тип) в запросе не определилось как автоинкремент.
как это проверить?
2 "сбито"/установлено значение "Update Resync" на adResyncNone например
как проверить, исправить
3 Post не вызывает записи(insert) в таблицу, изза установки режима отложенных изменений.
аналогично 1, 2
4 чтото еще. (т.к. используется Table а не нормальные для ADO компоненты
Не подскажете название нормальных компонент плз. А здесь используется TADOTable.
пока проблема в силе
sniknik (2006-12-24 13:29:00) [16]авто инкрементное значение должно обновляться само после добавления записи... (это значение по умолчанию Properties['Update Resync'].Value = adResyncAutoIncrement) при этом значении после Post (insert) делается SELECT @@Identity.
если этого не происходит... ну возможно несколько вариантов
1 поле (тип) в запросе не определилось как автоинкремент.
2 "сбито"/установлено значение "Update Resync" на adResyncNone например
3 Post не вызывает записи(insert) в таблицу, изза установки режима отложенных изменений.
4 чтото еще. (т.к. используется Table а не нормальные для ADO компоненты (а возможно и коннект не использован, что часто у тех кто пользует Table), то это может быть что угодно, и с чем разбираться ну совершенно неохота)
allrussia (2006-12-24 12:53:00) [17]tesseract
Table1.Refresh - ошибка Key value for this row was changed or deleted at the data store.
Table1.UpdateRecord - ошибка Dataset is not in Edit or InsertMode;
пробовал
Table1.edit;
Table1.UpdateRecord; - результат - 0
и в цикл вставлял - 0
и refresh в цикл вставлял try Table1.Refresh except end; - вообще все записи пустыми становятся
после цикла
забыл сказать, мне во время цикла желательно (нужно) получать значение поля id
tesseract (2006-12-24 12:37:00) [18]после цикла вызови refresh или UpdateRecord.