Проблем с база данни
12 отговора
632 прегледа
Проблем с база данни
Тривиална програма с база данни. Но от време на време компютъра или блокира, или се рестартира, при което купища въведени данни се загубват.
Как да осигуря сигурен запис на диска след употребата на TTable.Post?
Как да осигуря сигурен запис на диска след употребата на TTable.Post?
Много просто но не елегантно решение...
Ако си с D5 (dBase, Paradox работи със сигурност) погледни какво прави метода
TTable.FlushBuffers; TQuery.FlushBuffers
ако го извикаш в OnAfterPost на съответната table - ще запише пормените на диска.
Има и друг на4ин - на по ниско ниво - BDE има подобна функция - ако ти трябва ще ти я кажа.
Защо казвам 4е на4ина не е елегантен - ами по добре ще е да решиш проблема с блокирането - това е по доброто решение.
---
IN VINO VERITAS!
TTable.FlushBuffers; TQuery.FlushBuffers
ако го извикаш в OnAfterPost на съответната table - ще запише пормените на диска.
Има и друг на4ин - на по ниско ниво - BDE има подобна функция - ако ти трябва ще ти я кажа.
Защо казвам 4е на4ина не е елегантен - ами по добре ще е да решиш проблема с блокирането - това е по доброто решение.
---
IN VINO VERITAS!
Re: Много просто но не елегантно решение...
oshte po lesno .Close sledwano ot .Open - towa e za wsishki wersii i wyrshi syshtata rabota!
Re: Много просто но не елегантно решение...
Ама я си представи една заявка с 10000 реда - която трябва да се update-ва - това close - open ще отнеме 1 мин даже и на бърза машина.
Колкото до разли4ните версии - ами има си поддръжка в BDE -то и на4ин да се запишат промените "насилствено" 4рез BDE фунция - об4е на мен не ми харесва подобно решение - макар 4е в някои слу4аи това е единственото решение.
Още един на4ин за който се сещам е да се вклю4и Local Share - то и при това системата сама си записва всяка промяна - не е нужно да се правят подобни глупости с отваряне и затвяряне на таблица.
---
IN VINO VERITAS!
Колкото до разли4ните версии - ами има си поддръжка в BDE -то и на4ин да се запишат промените "насилствено" 4рез BDE фунция - об4е на мен не ми харесва подобно решение - макар 4е в някои слу4аи това е единственото решение.
Още един на4ин за който се сещам е да се вклю4и Local Share - то и при това системата сама си записва всяка промяна - не е нужно да се правят подобни глупости с отваряне и затвяряне на таблица.
---
IN VINO VERITAS!
ДА, ама НЕ
Тези начини и разни други ги опитах. Въведа си няколко записа, давам запис (Post) и рестартирам компютъра без да съм напуснал формата. Ефектът е нулев - нищо не се записва. Опитвах FlushBuffers, ApplyUpdates и т.н., но не става.
Така че викът ми за помощ остава.
Така че викът ми за помощ остава.
Re: ДА, ама НЕ
За Учeниka:
За да се записват при Post данните в/у диска виж. property CachedUpdates: Boolean;
За PhantomAS:
При TTable Close/Open не изтегля всички записи, а само тези които се изобразяват.
За да се записват при Post данните в/у диска виж. property CachedUpdates: Boolean;
За PhantomAS:
При TTable Close/Open не изтегля всички записи, а само тези които се изобразяват.
Редактирано от NDeu на
Re: ДА, ама НЕ
Всичко, което казва NDeu, плюс забележката, че проблемът може да е на по-ниско ниво - при инсталиране на Windows по подразбиране е разрешено кеширане на запис. Така че е възможно Windows-а да не ти записва данните, а не Database Engine-а.
По принцип съм съгласен...
за таблиците - да - макар 4е когато отваряш 10-15 пак ще се замота. Оба4е при Query - тата въпроса както знаеш е доста по - комплексен - времето за отваряне зависи от сложността на заявка и броя таблици вклю4ени в нея.
---
IN VINO VERITAS!
---
IN VINO VERITAS!
Кажи каква база използваш
Paradox, dBase или друга
Освен това въпроса май "намирисва" на несвързан само с Delphi ами и с Winбозата -то при мен нямам проблеми с на4ина който казах.
Ще потърся и другия "по-дълбок" на4ин за запис на данните и ще ти го кажа.
Ама вземи си виж техниката/софтуера - най- малко защото едва ли на някой ще му е приятно да работи на компютър забиващ по 2-3 (или пове4е) пъти на ден.
---
IN VINO VERITAS!
Освен това въпроса май "намирисва" на несвързан само с Delphi ами и с Winбозата -то при мен нямам проблеми с на4ина който казах.
Ще потърся и другия "по-дълбок" на4ин за запис на данните и ще ти го кажа.
Ама вземи си виж техниката/софтуера - най- малко защото едва ли на някой ще му е приятно да работи на компютър забиващ по 2-3 (или пове4е) пъти на ден.
---
IN VINO VERITAS!
Пробвай и това...
Една извадка от ..\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!
в 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!
Re: ДА, ама НЕ
Не съм имал проблем със записите. Поставям
Table.AutoRefresh:=TRUE ,
Table.CachedUpdates:=FALSE
Това е за Delphi 5, за Delphi 4 не съм сигурен, но не беше така.
Table.AutoRefresh:=TRUE ,
Table.CachedUpdates:=FALSE
Това е за Delphi 5, за Delphi 4 не съм сигурен, но не беше така.
Re: Проблем с база данни
Използвай
uses Bde;
DbiSaveChanges(Table1.handle);
Но имай в предвид, че не работи с SQL таблица.
uses Bde;
DbiSaveChanges(Table1.handle);
Но имай в предвид, че не работи с SQL таблица.
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!
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!