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).
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.
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).
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
.
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 |
---|---|
TableType | Typ tabeli (Paradox, dBase, ASCII, FoxPro lub wartość domyślna) |
TableName | Z lity rozwijalnej możesz wybrać tabelę należącą do określonej bazy danych |
ReadOnly | Określa, czy tabela ma być tylko do odczytu |
DatabaseName | Z listy rozwijalnej możesz wybrać bazę danych, z której będziemy korzystać |
Exclusive | Umożliwia zablokowanie danej tabeli wyłącznie dla naszej aplikacji |
Tabela 16.2. Główne metody komponentu TTable
Właściwość | Opis |
---|---|
CreateTable | Tworzy tabele na podstawie wcześniej podanych informacji |
EmptyTable | Usuwa wszystkie rekordy z tabeli |
DeleteTable | Usuwa tabelę całkowicie |
RenameTable | Zmienia nazwę tabeli |
LockTable | Blokuje tabelę, tak aby inne aplikacje nie miały do niej dostępu |
UnlockTable | Odblokowuje tabelę |
GotoKey | Przechodzi 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
Metoda | Opis |
---|---|
Active | Ustawienie wartości na True powoduje połączenie z bazą danych i odczytanie zbioru danych |
Bof | Właściwość zwraca True, jeśli kursor znajduje się na pierwszym rekordzie |
Eof | Wartość zwraca True, jeżeli kursor znajduje się na ostatnim rekordzie |
Fields | Wskazanie typu TFields, zwracającego informację na temat pól |
FieldValue | Zwraca w postaci typu Variant wartość określonego pola |
Filter | Określa kryterium filtrowania rekordów |
Filtered | Określa, czy zastosować filtrowanie |
Modified | Określa, czy bieżący rekord został zmodyfikowany |
RecNo | Bieżący numer rekordu |
RecordCount | Ogó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
Metoda | Opis |
---|---|
Append | Po wywołaniu tej metody stworzony zostaje nowy rekord |
Cancel | Anuluje zmiany dokonane w bieżącym rekordzie |
ClearFields | Czyści zawartość wszystkich pól rekordu |
Delete | Usuwa bieżący rekord |
Edit | Daje możliwość edycji rekordu |
FetchAll | Pobiera wszystkie rekordy, począwszy od zaznaczonego |
FindFirst | Rozpoczyna wyszukiwanie |
FindNext | Znajduje kolejny rekord |
FindLast | Znajduje ostatni rekord |
Refersh | Odś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.
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.
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 pola | Opis |
---|---|
ftUknown | Nieokreślony typ pola |
ftString | Łańcuch tekstowy |
ftInteger | 32-bitowa liczba całkowita typu Integer |
ftWord | 16-bitowa liczba typu Word |
ftSmallInt | 16-bitowa wartość typu SmallInt |
ftFloat | Wartość zmiennoprzecinkowa |
ftBoolean | True lub False |
ftCurrency | Wartość zmiennoprzecinkowa |
ftDateTime | Data i czas |
ftGraphic | Bitmapa |
ftFmtMemo | Pole Memo |
ftTypedBinary | Pole binarne (typowane) |
ftBlob | Duż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).
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ą FieldValues
k, 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
.
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:
Więcej informacji Delphi 2005. Kompendium programisty Adam Boduch Format: B5, stron: 1048 oprawa twarda Zawiera CD-ROM |
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:
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.