Rozdział 16. Bazy danych BDE

Adam Boduch

W tym rozdziale skupimy naszą uwagę na tworzeniu aplikacji bazodanowych. Na początek dokonamy krótkiego przeglądu baz danych, a następnie zajmiemy się tworzeniem aplikacji opartych o technologię BDE (Borland Database Engine).

1 Czym jest baza danych?
2 Typy baz danych
     2.1 Lokalne bazy danych
     2.2 Bazy danych typu klient-serwer
3 Wielowarstwowość baz danych
4 Bazy danych w Delphi
5 Borland Database Engine
     5.3 Sterowniki baz danych
6 Przykładowa baza danych
7 Komponenty bazodanowe
8 Komponent TTable
     8.4 TDataSource
     8.5 TDataSet
     8.6 Komponent TQuery
9 BDE Administrator
     9.7 Tworzenie nowej bazy danych
10 Tworzenie bazy w kodzie programu
11 Tworzenie tabel
12 Tworzenie rekordów
13 Odczytywanie wartości z tabeli
14 Przykładowy program korzystający z naszej bazy danych
15 Podsumowanie

W tym rozdziale:
*poznasz, na czym polega budowa baz danych;
*poznasz znaczenie terminów lokalna baza danych i aplikacje klient-sewer;
*nauczysz się wykorzystywać technologię BDE;
*napiszesz prosty program korzystający z baz danych.

Czym jest baza danych?

Wiele firm wykorzystuje bazy danych do gromadzenia informacji, gdyż bezwzględnie jest to najlepszy i najefektywniejszy sposób przechowywania danych ? nie wymagający plików tekstowych, rejestrów czy plików INI. Sam nie byłem kiedyś skłonny do korzystania z baz danych, lecz gdy poznałem ich funkcje i działanie, nie potrafiłem już wyobrazić sobie projektowania aplikacji bez ich użycia.

Powiedzmy sobie szczerze: jeżeli nie jesteś zaznajomiony z tematyką baz danych, to słowo to kojarzy Ci się zapewne ze zbiorem różnych danych ? setkami informacji na temat klientów danej firmy, płac pracowników, ich adresów itp. Nie jesteś daleki od prawdy; postaram się przybliżyć Ci funkcjonowanie baz danych w Delphi. Użyjemy do tego mechanizmu firmy Borland ? BDE.

Typy baz danych

Początkującemu użytkownikowi wydaje się, że baza danych to zwyczajny program, który przechowuje gdzieś w pliku potrzebne informacje i? tyle! W rzeczywistości istnieją bazy lokalne oraz bazy typu klient-serwer.

Lokalne bazy danych

Lokalne bazy danych umieszczone są na jednym komputerze, czyli na tej samej maszynie, na której uruchomiony jest nasz program. Służą do prostej komunikacji pomiędzy aplikacją a zbiorem danych; używane są tylko przez naszą aplikację. Przykładem jest program, który przechowuje adresy oraz inne dane pracowników firmy.

Bazy danych typu klient-serwer

Innym systemem ? nieco bardziej skomplikowanym, lecz bardziej popularnym ? jest architektura baz typu klient-serwer. Na serwerze znajduje się program, którego zadaniem jest przechowywanie danych, zarządzanie nimi, a także obsługą aplikacji-klientów. Aplikacja-klient to program, który jest udostępniamy w kilku egzemplarzach (lub nawet setkach kopii) i służy do komunikacji z serwerem. Klient zadaje serwerowi tzw. zapytania, które ten interpretuje i zwraca klientowi.

Istnieje wiele zalet takiego rozwiązania ? dostęp do bazy danych ma większa liczba osób, a same dane są bezpieczniejsze (pod względem możliwości utraty). Zarazem jednak więcej osób ma do nich wgląd. Tworzeniem takich aplikacji zajmiemy się w kolejnym rozdziale.

Wielowarstwowość baz danych

Być może będziesz miał okazję zetknąć się kiedyś z pojęciem jednowarstwowa baza danych lub podobnym, dlatego też wyjaśnię je szczegółowo.

Lokalne bazy danych są nazywane zazwyczaj jednowarstwowymi ? z tego powodu, iż wszelkie operacje są wykonywane bezpośrednio (program posiada bezpośrednie połączenie z bazą danych).

Dwuwarstwowa baza danych to połączenie z bazą danych za pomocą tzw. sterowników (baza klient-serwer). Aplikacja używa sterowników, aby połączyć się z serwerem, a ten bierze na siebie odpowiedzialność za zarządzanie danymi.

Wielowarstwowość to połączenie kilku serwerów. Aplikacje-klienci łączą się z serwerami, które z kolei odpowiadają za przekazanie danych do serwera głównego.

Bazy danych w Delphi

Wykorzystując tak wspaniałe środowisko, jakim jest Delphi, masz możliwość skorzystania z kilku rodzajów baz danych:
*BDE ? dość skomplikowany mechanizm Borlanda, pozwalający na łączenie się z bazami danych typu dBase czy Pardox.
*ADO ? jest to standard firmy Microsoft, polegający na łączeniu się z bazami danych przy wykorzystaniu mechanizmu ADO (ActiveX Data Object).
*dbExpress ? stosunkowo nowa technologia, pozwalająca na łączenie się z różnymi typami baz danych. Dużą zaletą jest uniwersalność tego typu baz danych, dostępnych także dla Linuksa.
*InterBase ? komponenty tej grupy umożliwiają połączenie się z serwerem bazodanowym firmy Borland ? InterBase.
W III części tej książki zajmiemy się dwiema najpopularniejszymi metodami dostępu do baz danych ? BDE oraz dbExpress.

Borland Database Engine

BDE, czyli Borland Database Engine, to zbiór bibliotek DLL i funkcji API, umożliwiających w dość prosty sposób komunikowanie się z systemami baz danych.

Co prawda BDE jest dołączany do Delphi, lecz stanowi zbiór osobnych bibliotek, umieszczonych w katalogu Borland Shared/BDE.

Sterowniki baz danych

Już nieraz wspomniałem w tym rozdziale o tzw. sterownikach. W rzeczywistości sterowniki są funkcjami API dokonującymi operacji na bazach danych. Różne bazy danych, takie jak dBase czy Paradox, posiadają różną budowę ? sterowniki dokonują ?tłumaczenia? funkcji pisanych w Delphi na ?język? zrozumiały dla bazy danych.

Przykładowa baza danych

Mechanizm BDE udostępnia kilka przykładowych baz danych, aby użytkownik mógł sprawdzić w jak najkrótszym czasie działanie komponentów. Przeprowadzimy małe ćwiczenie, prezentujące wykorzystanie tych ?gotowców?.

Najpierw udaj się do katalogu, w którym zainstalowane jest BDE (w moim przypadku jest to F:\Common Files\Borland Shared\Data) i odszukaj plik country.db. To jest właśnie przykładowa baza danych, z której za chwilę skorzystamy (rysunek 16.1).

16.1.jpg
Rysunek 16.1. Pliki bazy danych country

Na rysunku oprócz pliku z rozszerzeniem *.db znajdują się także pliki *.cds oraz *.px, wykorzystywane na potrzeby samego BDE.

#Przejdź do zakładki BDE w palecie komponentów i odszukaj komponent TTable (pierwszy z lewej); umieść go na formularzu.
#Przejdź do zakładki BDE i umieść na formularzu komponent TDataSource (również pierwszy z lewej).
#Z listy rozwijalnej komponentu TDataSource wybierz pozycję Table, która określa umieszczony na formularzu komponent TTable.
#Przejdź do zakładki Data Controls i umieść na formularzu komponent TDBGrid; jego rozmiar dopasuj według własnych upodobań.
#Mając dalej zaznaczony komponent TDBGrid, z listy właściwości kwybierz DataSource (wskazanie komponentu TDataSource).

Po tych czynnościach mamy już gotowy interfejs programu. Teraz nadszedł czas na połączenie się z bazą, ale uprzednio musimy wybrać odpowiednią tabelę.

Ponownie zaznacz komponent TTable; będziemy musieli wybrać bazę danych, z której będziemy korzystać. Z listy rozwijalnej właściwości DatabaseName wybierz DBDEMOS; następnie z listy właściwości TableName wybierz country.db.

Nadszedł teraz decydujący moment ? wartość właściwości Active zmień na True. W tym momencie komponent powinien połączyć się z bazą danych, a na komponencie TDBGrid powinny pojawić się wartości odczytane z owej bazy.

Program w trakcie działania przedstawiony został na rysunku 16.2.

16.2.jpg
Rysunek 16.2. Wartości z bazy danych przedstawione w komponencie TDBGrid

Naturalnie jest to tylko przykład ? w dalszej części rozdziału zajmiemy się tworzeniem własnej bazy danych i samodzielnym dodawaniem rekordów.

Komponenty bazodanowe

Mimo że nie stworzyliśmy jeszcze prawdziwej aplikacji opartej na bazach danych, tj. nie napisaliśmy ani jednego wiersza kodu, to wykorzystałeś już w poprzednim przykładzie kilka komponentów. Co prawda przykład był dość prosty, ale wymagał użycia aż trzech komponentów.

Większość operacji na bazach danych odbywa się dzięki komponentom niewizualnym, aczkolwiek przedstawienie wyniku tej operacji (dodanie nowego rekordu, odczytanie zawartości tabeli) musi być przedstawione w postaci wizualnej kontrolki. Owe kontrolki służące do przedstawienia zawartości baz danych są zamieszczone na palecie Data Controls, a wyróżniają się tym, że ich nazwa poprzedzona jest literami DB. W poprzednim przykładzie użyliśmy komponentu TDBGrid, który reprezentuje zbiór kolumn i wierszy. Przed uruchomieniem programu konieczne jest jednak przydzielenie odpowiedniej wartości do właściwości DataSource (rysunek 16.3).

16.3.jpg
Rysunek 16.3. Inspektor Obiektów z zaznaczoną właściwością DataSource

Owa właściwość DataSource określa zbiór danych, który ma zostać przedstawiony w komponencie.
Inny przykład znajduje się na rysunku 16.4. Tam bowiem zastosowałem komponenty TDBImage oraz TDBNavigator.

16.4.jpg
Rysunek 16.4. Graficzne przedstawienie wartości z tabeli

W tym przykładzie odczytywana jest tabela animals.db, która posiada kolumnę BMP, zawierającą zdjęcie wybranego zwierzaka. Graficzne przedstawienie tego zdjęcia wiąże się z wybraniem z właściwości DataField pozycji BMP jako nazwy kolumny do zaprezentowania.

Komponent TDBNavigate służy do przesuwania się między kolejnymi rekordami tabeli; tutaj także konieczne jest wybranie odpowiedniej wartości z właściwości DataSource.

Komponent TTable

Komponent TTable jest najprostszym środkiem umożliwiającym dostęp do konkretnej bazy danych oraz tabeli.

Tabela jest uporządkowanym zbiorem kolumn i wierszy.

Główne właściwości oraz metody tego komponentu zostały przedstawione w tabelach 16.1 oraz 16.2.

Tabela 16.1. Główne właściwości komponentu TTable

WłaściwośćOpis
TableTypeTyp tabeli (Paradox, dBase, ASCII, FoxPro lub wartość domyślna)
TableNameZ lity rozwijalnej możesz wybrać tabelę należącą do określonej bazy danych
ReadOnlyOkreśla, czy tabela ma być tylko do odczytu
DatabaseNameZ listy rozwijalnej możesz wybrać bazę danych, z której będziemy korzystać
ExclusiveUmożliwia zablokowanie danej tabeli wyłącznie dla naszej aplikacji

Tabela 16.2. Główne metody komponentu TTable

WłaściwośćOpis
CreateTableTworzy tabele na podstawie wcześniej podanych informacji
EmptyTableUsuwa wszystkie rekordy z tabeli
DeleteTableUsuwa tabelę całkowicie
RenameTableZmienia nazwę tabeli
LockTableBlokuje tabelę, tak aby inne aplikacje nie miały do niej dostępu
UnlockTableOdblokowuje tabelę
GotoKeyPrzechodzi do wybranego rekordu

TDataSource

W poprzednim przykładzie również korzystaliśmy z komponentu TDataSource. Nie pełni on żadnej znaczącej funkcji poza tym, że jest pośrednikiem pomiędzy komponentami typu TTable czy TQuery a kontrolkami wizualnymi typu TDBGrid.

TDataSet

Klasa TDataSet jest klasą bazową dla komponentów typu TQuery czy TTable, stąd posiada ona większość metod i właściwości klasy TTable. Właściwości tej klasy przedstawiłem w tabeli 16.3, a jej główne metody ? w tabeli 16.4.

Tabela 16.3. Główne właściwości klasy TDataSet

MetodaOpis
ActiveUstawienie wartości na True powoduje połączenie z bazą danych i odczytanie zbioru danych
BofWłaściwość zwraca True, jeśli kursor znajduje się na pierwszym rekordzie
EofWartość zwraca True, jeżeli kursor znajduje się na ostatnim rekordzie
FieldsWskazanie typu TFields, zwracającego informację na temat pól
FieldValueZwraca w postaci typu Variant wartość określonego pola
FilterOkreśla kryterium filtrowania rekordów
FilteredOkreśla, czy zastosować filtrowanie
ModifiedOkreśla, czy bieżący rekord został zmodyfikowany
RecNoBieżący numer rekordu
RecordCountOgólna ilość rekordów

Pisząc słowo kursor w powyższej tabeli, mam na myśli aktualnie zaznaczoną pozycję.

Tabela 16.4. Główne metody klasy TDataSet

MetodaOpis
AppendPo wywołaniu tej metody stworzony zostaje nowy rekord
CancelAnuluje zmiany dokonane w bieżącym rekordzie
ClearFieldsCzyści zawartość wszystkich pól rekordu
DeleteUsuwa bieżący rekord
EditDaje możliwość edycji rekordu
FetchAllPobiera wszystkie rekordy, począwszy od zaznaczonego
FindFirstRozpoczyna wyszukiwanie
FindNextZnajduje kolejny rekord
FindLastZnajduje ostatni rekord
RefershOdświeża zbiór informacji o bazie danych

Komponent TQuery

W działaniu komponent TQuery (angielskie słowo query oznacza zapytanie) przypomina kontrolkę TTable. Jedyna znacząca różnica, jaką można dostrzec, to operowanie na bazie danych za pomocą języka SQL.

SQL to skrót od angielskich słów Structured Query Language. Jest to język oparty na specjalnych zapytaniach kierowanych do bazy.

Posługując się komponentem TQuery, możesz uzyskać dostęp do takich baz danych, jak Sybase, Oracle, Informix, DB2 czy InterBase oraz lokalnych: Paradox, dBASE, Access i FoxPro.

Komponent TQuery nie posiada właściwości TableName, lecz dzięki zapytaniom SQL mamy możliwość uzyskania dostępu jednocześnie do kilku tabel.

Więcej informacji o samym języku SQL znajduje się w rozdziale 17.

BDE Administrator

BDE Administrator (rysunek 16.5) to narzędzie służące do manipulowania bazami danych.

16.5.jpg
Rysunek 16.5. Program BDE Administrator

Za jego pomocą możemy usunąć, zapisać lub zmodyfikować dowolną bazę danych.

Tworzenie nowej bazy danych

Utworzenie nowej bazy danych może odbyć się zarówno poprzez aplikację BDE Administrator, jak i poprzez odpowiednie funkcje w kodzie programu. Najpierw zajmijmy się tym pierwszym przypadkiem.

#Po otwarciu programu BDE Administrator z menu Object wybierz New.
#Zaakceptuj domyślną pozycję w oknie, które pojawi się w wyniku tej operacji.
#Na liście po lewej stronie pojawi się nowa pozycja, przygotowana do wpisania nowej nazwy ? wpisz MyDatabase.
W tym momencie baza danych została utworzona (rysunek 16.6). Pozostało jeszcze wpisanie ścieżki do katalogu, w którym przechowywane będą pliki bazy danych. Na dysku C: utwórz katalog MyDatabase, a w programie BDE po zaznaczeniu pozycji MyDatabase w polu PATH wpisz C:\MyDatabase.

16.6.jpg
Rysunek 16.6. Nowa baza danych

Zaakceptuj zmiany skrótem Ctrl+A.

Tworzenie bazy w kodzie programu

Z utworzeniem nowej bazy danych z poziomu aplikacji wiąże się użycie komponentu TSession. Umieść ten komponent na formularzu i zmień właściwość AutoSessionName na Tr``ue.

Kod tworzący nową bazę wygląda tak:

procedure TMainForm.btnMakeClick(Sender: TObject);
begin
  if not DirectoryExists('C:\MyDatabase') then
  begin
    CreateDir('C:\MyDatabase');
    Session.AddStandardAlias('MyDatabase', 'C:\MyDatabase', '');
  end;
end;

A zatem ? uogólniając ? za tworzenie bazy odpowiada polecenie AddStandardAlias z komponentu TSession.

Tworzenie tabel

Samo utworzenie tabeli jest realizowane poprzez metodę CreateTable, lecz wcześniej należy ustalić odpowiednie parametry dla kolumn, które mają znajdować się w tabeli.

procedure TForm1.Button1Click(Sender: TObject);
begin
  Table.DatabaseName := 'MojaBaza';
  Table.TableType := ttParadox;
  Table.TableName := 'MainTable';
  if not Table.Exists then
  begin
    with Table.FieldDefs do
    begin
      with AddFieldDef do
      begin
        Name := 'ID'; // nazwa parametru ? ID
        DataType := ftInteger; // typ parametru ? Integer
        Required := True;  // pole jest wymagane
      end;
    end;
    { utwórz tabele }
    Table.CreateTable;
  end;
end;

Powyższy kod powoduje stworzenie tabeli o nazwie MainTable, która będzie posiadać tylko jedną kolumnę ? ID. Określenie elementu do utworzenia odbywa się za pośrednictwem rekordu AddFieldDef. Chęć utworzenia kolejnej tabeli wiąże się z przypisaniem kolejnych danych do rekordu:

      with AddFieldDef do
      begin
        Name := 'Towar'; // nazwa parametru ? ID
        DataType := ftString; // typ parametru ? Integer
        Required := False;  // pole nie jest wymagane
      end;

Podczas tworzenia nowego elementu, konieczne było podanie typu kolumny ? w tym wypadku: fsString (kolumna tekstowa). Inne możliwe typy kolumny znajdują się w tabeli 16.5.

Tabela 16.5. Typy pól bazy danych

Typ polaOpis
ftUknownNieokreślony typ pola
ftStringŁańcuch tekstowy
ftInteger32-bitowa liczba całkowita typu Integer
ftWord16-bitowa liczba typu Word
ftSmallInt16-bitowa wartość typu SmallInt
ftFloatWartość zmiennoprzecinkowa
ftBooleanTrue lub False
ftCurrencyWartość zmiennoprzecinkowa
ftDateTimeData i czas
ftGraphicBitmapa
ftFmtMemoPole Memo
ftTypedBinaryPole binarne (typowane)
ftBlobDuże pole binarne

W moim przypadku kod powodujący utworzenie tabeli wykorzystywanej na potrzeby tego rozdziału wygląda tak:

procedure TMainForm.Button1Click(Sender: TObject);
begin
  Table.DatabaseName := 'MojaBaza';
  Table.TableType := ttParadox;
  Table.TableName := 'MainTable';
  if not Table.Exists then
  begin
    with Table.FieldDefs do
    begin
      with AddFieldDef do
      begin
        Name := 'ID'; // nazwa parametru ? ID
        DataType := ftInteger; // typ parametru ? Integer
        Required := True;  // pole jest wymagane
      end;
      with AddFieldDef do
      begin
        Name := 'Towar'; // nazwa parametru ? towar
        DataType := ftString; // typ parametru ? String
        Required := False;  // pole nie jest wymagane
      end;
      with AddFieldDef do
      begin
        Name := 'Cena'; // nazwa parametru ? cena
        DataType := ftCurrency; // typ parametru ? Currency
        Required := True;  // pole jest wymagane
      end;
      with AddFieldDef do
      begin
        Name := 'Data'; // nazwa parametru ? cena
        DataType := ftDateTime; // typ parametru ? DataTime
        Required := True;  // pole jest wymagane
      end;
    end;
    { utwórz tabele }
    Table.CreateTable;
  end;
end; 

Pełny kod źródłowy zawierający procedury tworzenia tabel znajduje się na płycie CD-ROM w katalogu ../istingi/16/mTable/mTable.dpr.

Tworzenie rekordów

Dodanie nowego rekordu można podzielić na kilka etapów:

#Wywołanie metody Append, które spowoduje wstawienie rekordu na końcu tabeli.
#Przypisanie do poszczególnych kolumn nowych wartości.
#Wywołanie metody Post, która zatwierdzi zmiany i przekaże tę informację do bazy.
Jeżeli mamy już tabelę, dodanie do niej nowego rekordu może przebiegać w sposób następujący:

procedure TMainForm.btnSaveClick(Sender: TObject);
begin
  Table.Append;
  Table.FieldValues['ID'] := 34;
  Table.FieldValues['Towar'] := 'Proszek do prania';
  Table.FieldValues['Cena'] := 2.10;
  Table.FieldValues['Data'] := Now;
  Table.Post;
end;

Zatem na początku wywołujemy metodę Append, a dopiero później przydzielamy konkretne wartości do poszczególnych kolumn. Przydzielanie wartości odbywa się za pośrednictwem właściwości FieldValues. Na samym końcu wysyłamy wszystko do bazy danych. Jeżeli pod tabelę ?podpięty? jest komponent TDBGrid, mamy możliwość podglądu wszelkich operacji dokonywanych w tabeli (rysunek 16.7).

16.7.jpg
Rysunek 16.7. Utworzenie nowego rekordu

Odczytywanie wartości z tabeli

Jeżeli kontrolka TDBGrid pozwala na podgląd zawartości tabeli, nie musimy się martwić o ładowanie i wyświetlanie poszczególnych rekordów. Nie zawsze jednak chcemy, aby pozycje zostały wyświetlone w owym komponencie. Prostym rozwiązaniem tego problemu jest pobieranie zawartości tabeli w pętli przy użyciu polecenia Next, które nakazuje odczytanie kolejnego rekordu:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Table.Active := True;

  while not Table.Eof do
  begin
    Memo1.Lines.Add(Table.FieldValues['Towar']);
    Table.Next;
  end;
end;

Pętla jest wykonywana, dopóki nie zostanie napotkany koniec rekordów (Eof). Dla przykładu prezentuję jedynie odczytywanie kolumny Towar z naszej tabeli. Zwróć uwagę na wywołanie (jeszcze w pętli) polecenia Next.

Nie zapomnij o konwersji! Jeśli odczytujemy wartości z poszczególnych kolumn za pomocą FieldValuesk, otrzymujemy rezultat w postaci zmiennej typu Variant. Jeżeli jednak nie zastosujemy w tym wypadku konwersji, a wartość w kolumnie będzie typu Integer, program wyświetli wyjątek, gdyż próbujemy przypisać do typu String wartość typu Integer. Zwróć na to uwagę, gdyż w przypadku zmiennych Variant kompilator nie wskaże błędu na etapie projektowania aplikacji.

Przykładowy program korzystający z naszej bazy danych

Jeszcze niedawno utworzyłeś własną bazę danych, a później tabelę. Jeżeli dojdziesz już do tego etapu, to wykorzystanie tej prostej bazy danych będzie raczej nieskomplikowane. Powiedzmy sobie szczerze: czego potrzebujesz więcej? Delphi jest na tyle ?intuicyjnym? narzędziem, że dzięki kontrolce TDBGrid mamy zapewniony również tryb edycji różnych pól (po zakończeniu edycji należy wprowadzić uaktualnienie do bazy danych ? metoda Post). Przykład takiego programu znajduje się w listingu 16.1.

Listing 16.1. Prosta baza danych

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids;

type
  TMainForm = class(TForm)
    btnAdd: TButton;
    Table: TTable;
    DBGrid: TDBGrid;
    DataSource: TDataSource;
    btnRemove: TButton;
    btnSave: TButton;
    procedure btnAddClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnRemoveClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.btnAddClick(Sender: TObject);
begin
{ dodawanie nowego rekordu }
  Table.Append;  
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Table.Active := True;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  Table.Active := False;
end;

procedure TMainForm.btnSaveClick(Sender: TObject);
begin
{ akceptacja zmian }
  Table.Post;
end;

procedure TMainForm.btnRemoveClick(Sender: TObject);
begin
{ usuwanie zaznaczonej pozycji }
  Table.Delete;
end;

end.

Działanie tego programu jest widoczne na rysunku 16.8. Zmiany takie, jak dodawanie nowego rekordu czy jego modyfikacja, są dokonywany w sposób wizualny za pomocą kontrolki TDBGrid.

16.8.jpg
Rysunek 16.8. Aplikacja prezentująca przykładowe użycie bazy danych

Podsumowanie

W tym rozdziale nauczyłeś się tworzyć lokalne aplikacje bazodanowe wykorzystujące mechanizm BDE. We wszystkich zaprezentowanych tu przykładach wykorzystano bazę danych Paradox. W kolejnym rozdziale zaprezentuję sposób tworzenia aplikacji korzystających z baz danych bez używania BDE.

Załączniki:

de25kp.jpg Więcej informacji

Delphi 2005. Kompendium programisty
Adam Boduch
Format: B5, stron: 1048
oprawa twarda
Zawiera CD-ROM
[[Delphi/Kompendium|Spis treści]]

[[Delphi/Kompendium/Prawa autorskie|©]] Helion 2003. Autor: Adam Boduch. Zabrania się rozpowszechniania tego tekstu bez zgody autora.

7 komentarzy

To jest w każdej książce a o polach edycyjnych DBEdit ani słowa ?????!!!!!

nie mogę znaleźć TTable, mam środowisko Lazaurus, co zrobić?

Napisałem krótki programik z bazą Paradox ale nie zawsze po zamknięciu programu to co wklepałem jest widoczne mimo że po wszystkim użyłem table1.POST. Próbowałem zamykać i otwierać bazy (table1. active:=false i true) w trakcie programu ale to też nie zawsze pomaga. Może ktoś ma jakiś pomysł? Piszę DBE5.01 i Delphi7.

proponuję poprawić tekst procedury:

procedure TMainForm.btnMakeClick(Sender: TObject);
begin
  if not DirectoryExists('C:\MyDatabase') 
    then CreateDir('C:\MyDatabase');
    Session.AddStandardAlias('MyDatabase', 'C:\MyDatabase', '');
end;

dzięki czemu baza będzie widoczna przez tabele nie tylko przy pierwszym uruchomieniu z tworzeniem,
ale także przy kolejnych gdzie folder bazy i pliki tabel będą już utworzone.

nie rozumie ... baze chyba tworzy ale jak tworze tabele to mi blad jakis tam wywala... te aliasy poprawilem

ale ktos zakodził ten artykuł :) poprzestawiany ukłąd strony: stopka po prawej od artykułu, a menu z prawej jest na dole

Tworząc bazę zakładasz alias "MyDatabase", a przy tworzeniu tabeli odwołujesz się do aliasu "MojaBaza". Błąd bzdetny, ale jeśli ktoś się uczy to może stanowić dla niego problem. Popraw jesli uznasz to zastosowne. Technologia BDE powoli zanika, ale jest to jeden z najbardziej niezawodnych i prostych mechanizmów tworzenia baz danych. Szkoda, że autorzy tak mało miejsca jej poświęcają. Pozdrawiam serdecznie.