Ver. 1.0 Beta, Don't have a compiler? Now you can write simple scripts ONLINE! This is a basic version -does not include all the Pascal statements. Only to learn basics

Klasa z tekstową bazą danych w Delphi

Delphi

Klasa z tekstową bazą danych w Delphi

DBText – Tekstowa baza danych w delphi


Ważne!


Jeśli szukasz sposobu na rozwiązanie zadania by zbudować jakąś bazę danych skorzystaj z linku o programowaniu baz danych w pascalu. W delphi jest bardzo podobnie. turbo_pascal,baza_danych.html.


Ten rozdział poświęcony jest korzystaniu z gotowego modułu, który pomaga przy tworzeniu bazy danych czegokolwiek. Służy zapoznaniu się z pewnym prostym rozwiązaniem, ale zakłada, że posiadasz podstawową wiedzę na temat tworzenia programu w Delphi



Informacje wstępne


DBText to tekstowa, darmowa baza danych, która pozwala na dowolne rozszerzanie rekordu i zapis do pliku. Jej format wewnątrz pliku tekstowego:



DBText1.0
Id=”1”; Imie=”Andrzej”; Nazwisko=”Kowalski”; Opis=”Opis Andrzeja”
Id=”2”; Imie=”Adrian”; Wiek=”34”;

DBText 1.0 - Tekstowa baza danych w delphi. Wersja do pobrania


W kolejnych rekordach nie muszą występować te same nazwy kolumn.
Kolejne rekordy to kolejne linijki w pliku tekstowym



Baza jest odporna na inne znaki kodu ASCII. Wewnątrz zawartości pola nie występuje znak przeniesienia linii. Gdy jest potrzeba zapisania przeniesienia baza używa: #x0A#x0C



Potrzebna znajomość klas:
TDBTabela
TRekord



Może przydać się
TDBase




Baza może być kodowana. Wtedy zapis nie odbywa się do pliku tekstowego, tylko do binarnego. Format pliku:



DBKoder1.0
4 bajty – suma kontrolna
1 bajt rozmiar słownika „max_sl”




Opis słownika:
1 bajt – długość kodowanego słowa (n)
n bajtów – kodowane słowo



Słowo kodowane jest za pomocą znaku ASCII o numerze „m”, który oznacza kolejny numer kodowanego słowa. „m” jest z przedziału 0..”max_sl-1”



W słowniku znajdują się nazwy znalezionych w bazie kolumn oraz używane znaki ASCII – posortowane. Od tego, którego jest najwięcej do tego, którego najmniej.



Następnie do końca pliku
indeksy wyrazów ze słownika



Klasa TRekord

Definicja

TRekord = class (TList)
   function Add(const klucz, wartosc : string) : integer; overload;
   function Add(const klucz : string; wartosc : integer) : integer; overload;
   function Add(const klucz : string; wartosc : boolean) : integer; overload;
   function AddDate(const klucz : string; wartosc : TDateTime) : integer; overload;
   function Add(const klucz : string; wartosc : Real; miejsc : Integer = 0) : integer; overload;
   function Get(const klucz : string) : string;
   function GetF(const klucz : string) : real;
   function GetI(const klucz : string) : integer;
   function GetId(const klucz : string) : integer; // Oddaje pozycję klucza na liscie
   function Enabled : boolean; // Czy nie usunięte
   function Id : integer;
   function jestWartosc(const _wartosc : string) : boolean;
   function PobierzKlucz(const s: string; var i:integer) : string;
   function PobierzWartosc(const s: string; var i:integer) : string;
   function PobierzCalosc : string;
   procedure DodajZeStringa(const s : string);
   procedure Clear; override;
   constructor Create(const s : string); overload;
   constructor Create; overload;
   function Klonuj : TRekord;
 end;

W praktyce używa się:

r := TRekord.Create;
r.Add('Imie', 'Robert');
r.Add('Wiek', 43);

Caption := r.Get('Imie') + ' ' + IntToStr(r.GetI('Wiek'));

Add przyjmuje różne parametry:
można dodawać string, real, integer, boolean.

Wszystkie dane zamieniane są w bazie na string!

Nie ma powodów do obaw, programy korzystające z DBText są naprawdę szybkie. Poza tym w szczególności stosuje się je do aplikacji, które wykonują obliczenia na niewielkich ilościach danych -np. kilka tysięcy rekordów.

Dane można pobrać
r.GetI – Integer
r.GetF – Float
r.Get – string


Ideą Add i Get było naśladowanie tablic asocjacyjnych php
Stąd r.GetI('Imie') da wynik zero. Wpisanie na klawiaturze Add i Get jest szybkie, szybsze od Query.Fields.FindField().AsInteger


Funkcja Klonuj tworzy w rezultacie swoją kopię (kopię klasy TRekord), której przydziela osobną pamięć


TDBTabela
Definicja

 TDBTabela = class (TList)
    nazwa : string;
    index : integer; // Wewenętrzny indeks przeszukiwania
    nast_index : integer; // Przy dodawaniu rekordów, automatycznie dodawany indeks
    Loading : Boolean;
    ZwolnijPamiec : Boolean;
    Filter : TFuncFiltruj; // Funkcja filtrująca wyniki, działa w powiązaniu z Enabled,
                           // Jesli jej wynikiem jest false, procedury next i prev ominą jej wynik

    function PobierzId : integer;
    procedure Start;
    procedure PobierzDane(_tekst : TStringList);
    procedure WczytajPlik(const _dbNazwaPliku : string);

    function WczytajPlikCzesciowy(const _dbNazwaPliku : string; out_p : TProceduraOdbierajacaZKodera) : Boolean;
    function ZapiszPlikCzesciowy(const _dbNazwaPliku : string; in_p : TProceduraDodajacaDoKodera) : Boolean;

    procedure ZapiszPlik(const _dbNazwaPliku : string);
    procedure ZwrocDane(var _tekst : TStringList);
    procedure Usun(_id : integer);
    function ZnajdzKlucz(const key, val : string) : TRekord; overload;
    function ZnajdzKlucz(const key : string; val : Real) : TRekord; overload;
    function UsunRekordy(rekord : TRekord) : integer;
    function Add(_rekord : TRekord) : integer; overload;
    function Add(s, t: string) : integer; overload;
    function Add(s: string; r : real) : integer; overload;
    function Add(s: string; i : integer) : integer; overload;
    function Add(s: string; b : boolean) : integer; overload;
    function GetId(_id : integer) : TRekord;
    function GetIdPos(_id : integer) : integer; // Oddaje nr listy rekordu o nr id
    function Select(_rekord : TRekord) : integer;
    function SelectId(_rekord : TRekord) : integer;
    function Wyszukaj(const s : string; proc : TDBProceduraDodajaca; ListaPozycjonujaca : TDBTabela = nil) : integer;
    function WyszukajPosortowane(const s, sort : string; proc : TDBProceduraDodajaca) : integer;
    procedure Clear; override;

    destructor Destroy; override;
    constructor Create;
    function Get(const klucz : string) : string;
    function GetF(const klucz : string) : real;
    function GetI(const klucz : string) : integer;
    // Poruszanie sie po tabeli
    function Next : integer;
    function Prev : integer;
    function Koniec : boolean;
    function Poczatek : boolean;
    function Sortuj(kolumna : String) : TDBTabela;
 private
 end;

W praktyce używa się:

r := TRekord.Create;
tab := TDBTabela.Create;
tab.Add(r);

tab.ZapiszPlik('plik.txt');
tab.Free;

Gdy w bazie jest więcej rekordów można pobrać wskaźnik na TRekord za pomocą
r := tab.GetId(4);

Czyszczenie tabeli
Bazę można wyczyścić tab.Clear;

Sortowanie danych
Można ją sortować według pola za pomocą
res_tab := tab.Sortuj('Nazwisko');

res_tab ma na nowo przydzieloną pamięć. Nie trzeba tworzyć klasy tabeli

Wyszukiwanie danych w tabeli tab

var wyniki : TDBTabela;

procedure DodajWynik(r : TRekord);
begin
wyniki.Add(r);
end;

wyniki := TDBTabela.Create;

tab.Wyszukaj('szukane słowa', DodajWynik);

Można wyszukać dane a wynik otrzymać już posortowany według 'Kolumna'

tab.WyszukajPosortowane('szukane słowa', 'Kolumna', DodajWynik);

TDBase
Definicja


 TDBase = class (TList) // Lista obiektów TDBTabela
    dbSystem : TDBTabela; // Lista nazw plików z tabelkami
    AktualizacjaProc : TDBProceduraAktualizujacaPostep; // Wskaznik na procedurę, aktualizującą postęp wczytywania / zapisu
    function Add(_tabela : TDBTabela) : integer;
    function Wczytaj(_dbKatalog : string) : integer;
    function Zapisz(_dbKatalog : string) : integer;
    function Query(const _sql : string) : TResult;
    function Tabela(const _dbNazwa : string) : TDBTabela;
    constructor Create;
    destructor Free;
 end;

TDBase służy do uporządkowania tabel. Dzięki TDBase nie trzeba wczytywać pojedynczo każdej tabeli. Wystarczy:

db := TDBase.Create;
db.Wczytaj('DB');

tab := db.Tabela('Klienci');

na końcu programu można użyć
db.Zapisz('DB');

TDBase tworzy kilka plików w katalogu, stąd jako parametr nie podaje się nazwy pliku lecz katalogu, w którym są zapisane wszelkie dane.

Wady

Baza jest przechowywana w pamięci. Potrafi przepełnić bufor. Przy dużej ilości rekordów (ok. 100 000) wyszukiwanie nieposortowanych danych jest powolne. Przy takim obciążeniu bazy użytkownik jest w stanie zauważyć spowolnienie programu.

Nie obsługuje zapytań SQL.

Zalety

Wygoda użycia. Kod programu tworzony znacznie szybciej. Dowolność ilości kolumn rekordu. Zgodność z graficznymi komponentami: KomponentyTech. Odporność na błędy danych. Zbliżenie do php. Sortowanie, wyszukiwanie dowolnej części wyrazu w bazie.

Pozwala na dodawanie plików binarnych, w dodatku zmienia ich treść, nie da się jej rozszyfrować bez wiedzy programistycznej.

Nie trzeba sterowników do zewnętrznej bazy. Nie trzeba instalować serwera. Idealna dla małych projektów.

Nie trzeba definiować budowy tabel. Wystarczy dodać dane i zapisać. Dobre dla projektów, w których jakaś część danych jest stale powiększana (np. zapis opcji programu)

 

This website uses cookie files in order to provide Google services (advertisements, analitycs) and Facebook. If you want to block using cookies, turn them off in your browser settings. Need a help? Click me