Проблем с база данни

12 отговора 632 прегледа
#1

Проблем с база данни

Тривиална програма с база данни. Но от време на време компютъра или блокира, или се рестартира, при което купища въведени данни се загубват.
Как да осигуря сигурен запис на диска след употребата на TTable.Post?

Отговор
в отговор на Учeниka #2

Много просто но не елегантно решение...

Ако си с D5 (dBase, Paradox работи със сигурност) погледни какво прави метода
TTable.FlushBuffers; TQuery.FlushBuffers
ако го извикаш в OnAfterPost на съответната table - ще запише пормените на диска.
Има и друг на4ин - на по ниско ниво - BDE има подобна функция - ако ти трябва ще ти я кажа.
Защо казвам 4е на4ина не е елегантен - ами по добре ще е да решиш проблема с блокирането - това е по доброто решение.

---
IN VINO VERITAS!
Отговор
в отговор на PhantomAS #3

Re: Много просто но не елегантно решение...

oshte po lesno .Close sledwano ot .Open - towa e za wsishki wersii i wyrshi syshtata rabota!

Отговор
в отговор на SDR #4

Re: Много просто но не елегантно решение...

Ама я си представи една заявка с 10000 реда - която трябва да се update-ва - това close - open ще отнеме 1 мин даже и на бърза машина.
Колкото до разли4ните версии - ами има си поддръжка в BDE -то и на4ин да се запишат промените "насилствено" 4рез BDE фунция - об4е на мен не ми харесва подобно решение - макар 4е в някои слу4аи това е единственото решение.
Още един на4ин за който се сещам е да се вклю4и Local Share - то и при това системата сама си записва всяка промяна - не е нужно да се правят подобни глупости с отваряне и затвяряне на таблица.

---
IN VINO VERITAS!
Отговор
в отговор на PhantomAS #5

ДА, ама НЕ

Тези начини и разни други ги опитах. Въведа си няколко записа, давам запис (Post) и рестартирам компютъра без да съм напуснал формата. Ефектът е нулев - нищо не се записва. Опитвах FlushBuffers, ApplyUpdates и т.н., но не става.
Така че викът ми за помощ остава.

Отговор
в отговор на Учeниka #6

Re: ДА, ама НЕ

За Учeниka:
За да се записват при Post данните в/у диска виж. property CachedUpdates: Boolean;
За PhantomAS:
При TTable Close/Open не изтегля всички записи, а само тези които се изобразяват.

Редактирано от NDeu на

Отговор
в отговор на NDeu #7

Re: ДА, ама НЕ

Всичко, което казва NDeu, плюс забележката, че проблемът може да е на по-ниско ниво - при инсталиране на Windows по подразбиране е разрешено кеширане на запис. Така че е възможно Windows-а да не ти записва данните, а не Database Engine-а.

Отговор
в отговор на NDeu #8

По принцип съм съгласен...

за таблиците - да - макар 4е когато отваряш 10-15 пак ще се замота. Оба4е при Query - тата въпроса както знаеш е доста по - комплексен - времето за отваряне зависи от сложността на заявка и броя таблици вклю4ени в нея.

---
IN VINO VERITAS!
Отговор
в отговор на Учeниka #9

Кажи каква база използваш

Paradox, dBase или друга
Освен това въпроса май "намирисва" на несвързан само с Delphi ами и с Winбозата -то при мен нямам проблеми с на4ина който казах.
Ще потърся и другия "по-дълбок" на4ин за запис на данните и ще ти го кажа.
Ама вземи си виж техниката/софтуера - най- малко защото едва ли на някой ще му е приятно да работи на компютър забиващ по 2-3 (или пове4е) пъти на ден.

---
IN VINO VERITAS!
Отговор
в отговор на Учeниka #10

Пробвай и това...

Една извадка от ..\Delphi5\BDE\bde32.hlp - за пове4е информация виж там
в BDE function reference \ Table functions
-------------------------------------------------
пробвай с тази функция
като я извикаш така
Check(DbiSaveChanges (MyTable.Handle));

тази функция трябва да е в BDE.dcu
--------------------------------------------------------
Delphi syntax

function DbiSaveChanges (hCursor: hDBICur): DBIResult stdcall;

Description

DbiSaveChanges forces all updated records associated with hCursor to disk.

Parameters

hCursor Type: hDBICur (Input)
Specifies the cursor handle.

Usage

If the table associated with hCursor is a temporary table (created with DbiCreateTempTable), DbiSaveChanges saves all buffered changes to disk and makes the table permanent. This table will not be removed when the cursor is closed.

SQL: This function is not supported with SQL tables.

DbiResult Meaning

DBIERR_NONE All changes have been saved successfully.
DBIERR_INVALIDHNDL The specified cursor is invalid or NULL.
DBIERR_NODISKSPACE The changes could not be saved because there is no disk space available.
DBIERR_NOTSUPPORTED This function is not supported for SQL tables.

---
IN VINO VERITAS!
Отговор
в отговор на Учeниka #11

Re: ДА, ама НЕ

Не съм имал проблем със записите. Поставям
Table.AutoRefresh:=TRUE ,
Table.CachedUpdates:=FALSE
Това е за Delphi 5, за Delphi 4 не съм сигурен, но не беше така.

Отговор
в отговор на Учeниka #12

Re: Проблем с база данни

Използвай

uses Bde;

DbiSaveChanges(Table1.handle);

Но имай в предвид, че не работи с SQL таблица.

Отговор
в отговор на Учeниka #13

Re: Проблем с база данни

Хе, юнаци, решението е просто
BDE-то има параметър дали автоматично да фльшва
данните във физическата таблица
казва се LOCAL SHARE, По Default е FAlse
може да се сетне в BDE Admin, System->Init
или със следния програмен код:

procedure UpdateLocalShare;
var
Reg : TRegistry;
const
BDE_LOCAL_SHARE_KEY = '\Software\Borland\Database Engine\Settings\SYSTEM\INIT';
begin
Reg := TRegistry.Create;
With Reg Do
begin
RootKey := HKEY_LOCAL_MACHINE;

{ Write the BDE keys }
OpenKey(BDE_LOCAL_SHARE_KEY, True);
WriteString('LOCAL SHARE', 'TRUE');
end;
Reg.Free;
end;

Enjoy!

Отговор