Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Вниз

Пропадают записи   Найти похожие ветки 

 
anton_cor   (2003-03-01 17:37) [0]

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

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

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

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


 
Mike_Goblin   (2003-03-01 17:48) [1]

Да кэшируются
Чтобы принудительно сбросить кэш на диск, вызовите FlushBuffers


 
??   (2003-03-01 18:13) [2]

Не знаю поможет ли это, у меня пропадали записи, и после сброса кеша, и после коректного завершения программы, потому, я и не пробовал на парадоксе БД.


 
spogi   (2003-03-02 03:51) [3]

znaesh?
dobavlyay zapisi vot tak:

Table1.Active:=True;
Table1.Edit;
Table1.Append;
Table1DataField.Value:=StrToDate(Edit1.Text);
Tabel1SalaryField.Value:=StrToCurr(Edit2.Text);
Table1NameField.Value:=Edit3.Text;
Table1CountField.Value:=StrToInt(Edit4.Text);
Table1.Post;
Table1.Refresh;
Table1.Active:=False;

rabotaet 101%, porabotay, a kogda tvoy komp nauchitsya soxranit tvoyu bazu, vikin nenujnix strok... :))))


 
VAleksey   (2003-03-02 05:57) [4]

У тебя таблица открыта в IDE ?


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

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


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

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


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

Не факт


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

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


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

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

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


 
anton_cor   (2003-03-03 08:45) [10]

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


 
Grandpa   (2003-03-03 08:47) [11]

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


 
kate   (2003-03-03 09:28) [12]

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


 
gek   (2003-03-03 09:30) [13]

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


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

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

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



 
VAleksey   (2003-03-03 13:38) [15]

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


 
stranger71   (2003-03-03 15:06) [16]

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

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

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


 
MsGuns   (2003-03-03 15:47) [17]

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

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



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

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


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

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


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

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


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

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

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


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

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


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


> Anatoly Podgoretsky © (04.03.03 10:28)


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


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

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

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



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

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

Наверх





Память: 0.5 MB
Время: 0.049 c
9-76248
Axis_of_Evil
2002-10-25 11:39
2003.03.24
Worms


3-76328
Ocean
2003-03-03 11:17
2003.03.24
AdoQuery1.ExecSQL вызывает ошибку kernel32 (WinME)


8-76522
Gayrus
2002-12-13 10:30
2003.03.24
Bass


6-76556
Фыеукщшв
2003-02-03 16:20
2003.03.24
Как работать через PROXY?


1-76484
Vitalij
2003-03-12 13:33
2003.03.24
создание компонент





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский