Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пропадают записи [D5, Paradox]


Страницы:   1 2

anton_cor ©   (2003-03-01 17:37:00) 

Имеется простая база (Paradox) – одна таблица. Работаю с ней через TTable. Все что делаю с базой:

Table1.Active:=true;
Table1.AppendRecord([..,..,..,]);
Table1.Active:=false;

Те просто добавляю записи. Записи добавляются нормально, что видно из стандартного Дельфового примера (который file\new\business\DateBase Form Wisard).
Но иногда могут пропасть последние записи сделанные за время работы программы. От чего зависит так и не понял. Щелкал резетом во время работы программы – один раз пропали последние 10 записей, второй раз все нормально сохранилось.
Помогите понять почему так происходят. Кешиируются они что ли где то?
Или по крайней мере посоветуйте как правильно заносить записи в базу, если мой способ не слишком корректен.

Зарание благодарен.


Anatoly Podgoretsky   (2003-03-04 11:04:00) [1]

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

Это не относится по определению к кешированным апдейтам.
У меня есть несколько сетевых баз (dBase IV), которые уже много лет работают в необслуживаемом режиме без единого вмешательства.
Есть также некоторое количество баз формата Парадокс, с такими же настройками - проблемы есть.


gek   (2003-03-04 10:51:00) [2]


> Anatoly Podgoretsky © (04.03.03 10:28)


Про Local Share = TRUE спорить не буду. Просто никогда не сталкивался и надо признать не слышал
Попробую.
Просто у меня например не всегда правильно обрабатывалось FlushBuffer, поэтому всегда делаю DbiSaveChanges.
За подсказку спасибо.


Anatoly Podgoretsky   (2003-03-04 10:49:00) [3]

anton_cor © (03.03.03 08:45)
Это проблема всех файл-серверных систем, все программы лезут своими грязными руками в файл и пытаются его одновремнно изменить, Парадокс особо подвержен из за его внутренней структуры.
Но если ты не будешь использовать кеширование записей и установишь Local Share то снизишь проблемы до минимума. Да и компьютер не выключай без закрытия программы, тут уже ничем не поможешь.


Anatoly Podgoretsky   (2003-03-04 10:31:00) [4]

BJValentine © (02.03.03 14:48)
А вот это смотреть не надо, смеятся хочется

Table1.Edit;
Table1.Append;
...
Table1.Post;
Table1.Refresh;
Table1.Active:=False;


Anatoly Podgoretsky   (2003-03-04 10:28:00) [5]

gek © (03.03.03 09:30)
Дучше поставить Local Share = TRUE и забыть, работать будет везде. Еще одним источником являются Cached Updates.


Anatoly Podgoretsky   (2003-03-04 10:25:00) [6]

stranger71 (03.03.03 15:06)
Не надо про глючность БДЕ, ищи в другом месте.


Grandpa   (2003-03-04 10:19:00) [7]

Самый надёжный способ обеспечить бесперебойное питание и не щёлкать reset. Сделать нормальный close и обеспечить автоматическую индексацию. У меня база содержит около 30 таблиц (автотранспортное предприятие), распухла за 4 года на 60 мб и нет никаких проблем с потерей данных. При сбоях в индексации использую для ремонта DBCheck c http://olesoft.unet.ru/(free) - потерь не происходит.


MsGuns   (2003-03-03 15:47:00) [8]

>spogi (02.03.03 03:51)
>Table1.Active:=True;
Table1.Edit; Масло масляное ?
Table1.Append;

Самый надежный способ - это добавление запросом в защищенном блоке и проверкой рефрешем (TTable) или переоткрытием запроса (TQuery). Хотя и то, и другое "ворует" производительность.
Но Local Share = TRUE стопроцентово !


stranger71   (2003-03-03 15:06:00) [9]

VAleksey © (03.03.03 13:38)
BDE\Configurations\System\INIT\Local Share = true

Этот вариант помогает, но далеко не всегда. Если база распухает до большого объема, то начинают сыпаться сообщения об ошибках...

Я для себя не нашел метода, работающего на 100%, поэтому стараюсь не использовать БДЕ... ИМХО глючный он, и непредсказуемый - один и тот же кусок кода в разных случаях иногда работает нормально, а иногда теряет данные или паскудит их...


VAleksey   (2003-03-03 13:38:00) [10]

BDE\Configurations\System\INIT\Local Share = true
Тогда записи пропадать не будут.
1) Дело в том что у BDE для скорости есть свой внутренний кэш, и когда ты вызываешь метод Post, то это вовсе не значит. что все твои записи сохранились на диске.
2) Было и у меня так, когда таблицы в IDE открыты. Видимо сессия BDE открытая Delphi сбрасывала свой кэш и переписывала изменения таблицы сделанные программно.


Валерий   (2003-03-03 10:50:00) [11]

DbiSaveChanges(table.handle);
необходимо для предотвращения
потери данных в случае некорректного закрытия программы.
при корректном закрытии программы потери данных не происходит.

Слишком часто использовать DbiSaveChanges
наверное не стоит
<Gek>
<делать это в AfterPost>
так это будет замедлять работу при
групповых операциях.


gek   (2003-03-03 09:30:00) [12]

Самая умная мысль это - DbiSaveChanges(table.handle);
И делать это в AfterPost


kate   (2003-03-03 09:28:00) [13]

в самом начале была умная мысль: делай FlushBuffers, например, перед закрытием программы - потому как БДЕ в любом случае создает кэш и коряво его потом сбрасывает на диск.


Grandpa   (2003-03-03 08:47:00) [14]

Это может происходить из-за индексации. Попробуй переиндексировать. Возможно для таблицы не установлен maintain(т.е. нет автоатического индексирования).


anton_cor   (2003-03-03 08:45:00) [15]

Боже! Я простов шоке! :) Как оказывается не легко добавить одну запись. Спасибо всем кто откликнулся.
Хорошо, судя по обилю ответов _верного_ способа добавить запись нет или он далеко не один.
Тогда хоть подскажие, куда копать. Те это проблема Парадокса, или проблема компонент Делфи? Ибо актуальность базы очень важна и уж лучше переписать... Пока борюсь тем что логирую в текстовый фаил все внесенные данные и потом сравниваю. Сам понимаю что глупо...


Валерий   (2003-03-03 03:52:00) [16]

для сохранения данных используйте Bde Api

if not Table.Active then Exit;
DbiSaveChanges(table.handle);


Cranium   (2003-03-02 23:24:00) [17]

Тот же самый эффект наблюдаю и при работе через TQUERY.... Причем, что интерезно: Одновременно записи вставляются в две таблицы, в одной из них периодически записи пропадают, в другой этого ни случалось ни разу..... :(((


Sherbacov   (2003-03-02 14:48:00) [18]

Не факт


BJValentine   (2003-03-02 14:48:00) [19]

Вызывай после редактирования записи метод Post и всё будет Ок. См. Spogi...


alexb   (2003-03-02 10:15:00) [20]

Если не кешируется после вставки записи(ей) ставь команду CheckBrowseMode. Сделает все что необходимо.
Если кешируется, то ApplyUpdate, чтобы запомнить изменения. В противном случае после переоткрытия таблицы (запроса) все изменения теряются.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо