Opnå Record låsning med Access 2000

Hvordan kan jeg implementere rekord låsning på en database Access 2000 ved hjælp af Delphi?

Har du set dette på Borland Support?

Område: database \ ADO

Referencenummer: 74076

Status: Åben

Rapporteret den: 11/3/99

Severity: almindeligt stødt

Type: Grundlæggende funktionalitet Manglende

Problem:

I øjeblikket, er pessimistisk rekord låsning ikke arbejde

med ADO komponenter fordi ADO ikke

giver en måde at låse en anden end den rekord

nuværende rekord.

Nå der er en måde at låse optegnelser om MSAccess 2000 tabeller.

Først det kræver, at du har den udviklere udgave af

Microsoft Ado Data Control 6.0 (kommer med Visual Studio-programmer).

Hvis du har det, så importere den til Delphi ved hjælp af Importer ActiveX

menupunkt fra Component menu. Du vil se, at ActiveX har

blevet tilføjet som Adodc på ActiveX-paletten.

Opret en formular og sætte så mange Adodc komponenter på det, som du får brug for

samtidige låse. Husk dette: One Adodc kan låse One rekord i One tabel

på et tidspunkt. Så hvis du har brug for at låse flere poster på flere borde, vil du

behov for flere Adodc komponenter (du har valget af dynamisk skabelse også).

Opret derefter en ny tabel i Access MDB og navngive det lader sige "Lock". Put to

felter i det ("lockid" type String og "fldEdt" type heltal).

Nedenfor er to funktioner. En kaldet Lock, som du kan bruge til

låse rekord, eller kontrollere, om den er låst. Den anden kaldes Lås

og du kan bruge den til at låse rekord.

funktion lock (ds: TAdoConnection; LckTable: TAdodc; konst s: string;

rec, CurrentUserId: longint): boolean;

Var

fnd: boolean;

S1: string;

begynde

S1: = format (s, [trim (inttostr (rec))]);

LckTable.ConnectionString: = ds.ConnectionString;

LckTable.CursorLocation: = 2;

LckTable.LockType: = 2;

LckTable.CommandType: = 2;

LckTable.RecordSource = 'Lock';

fnd: = false;

Prøve

LckTable.refresh;

hvis LckTable.Recordset.RecordCount> 0 derefter

begynde

LckTable.Recordset.MoveFirst;

LckTable.Recordset.Find ('lockid =' '' + s1 + '' '', 0,1,1);

ende;

hvis LckTable.Recordset.RecordCount> 0 derefter

Hvis ikke (LckTable.Recordset.EOF) og derefter

hvis LckTable.Recordset.Fields ['lockid']. value = S1 derefter

fnd: = true;

hvis ikke fnde derefter

LckTable.Recordset.AddNew ('lockid «, S1);

LckTable.Recordset.Fields ['fldEdt'] Værdi:. = CurrentUserId;

resultat: = true;

undtagen

resultat: = false;

ende;

ende;

funktion Unlock (konst s: string; rec: longint; LckTable: TAdodc): boolean;

Var

S1: string;

begynde

S1: = format (s, [trim (inttostr (rec))]);

prøve

LckTable.Recordset.Cancel;

LckTable.Recordset.Find ('lockid =' '' + s1 + '' '', 0,1,0);

LckTable.Recordset.Delete (1);

resultat: = true;

undtagen

resultat: = false;

ende;

Nu er du nødt til at gøre nogle kodning i din projekt.

Hvornår lader sige en bruger anmoder om at åbne en post (lad os sige med det unikke id 12)

fra din kunde bord. Du har en Tadodc, der kaldes lckCustomers og er

placeret på form kaldet lckForm. Brug denne kode:

hvis Lock (TCustomer.Connection, lckForm.lckCustomers, 'Kundernes, 12,1), så

begynde

// Posten er blevet succesfuldt låst, og du kan gå videre med din

// Redigering kode

// ...

ende

andet

begynde

// Ther rekord blev allready låst af en anden bruger.

// Giver en besked og afbryde redigeringen, eller fortsætte kun læse.

// ...

ende;

Nu, hvis du ønsker at låse rekord, efter redigering bare ringe:

Lås ('Kundernes, 12, lckForm.lckCustomers);

Advarsel: Lås tabel får at være meget store, så når de første bruger logger ind

programmet, tømme låsen bordet ved hjælp af en forespørgsel som "slet fra låsen.

Du kan kontrollere, om du er den første bruger ved at tjekke for eksistensen af ​​en LDB

fil ved siden af ​​din mdb fil. Hvis den ikke findes, du er den første.

Det er om det. Held og lykke.