Delphi __ Kompendium __ Roz17.pdf

(970 KB) Pobierz
Delphi :: Kompendium :: Roz...
Delphi :: Kompendium :: Rozdział 17 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_17
Logowanie | Rejestracja | Forum | Pomoc | Reklama | Szukaj
Strona główna :: Delphi :: Kompendium
Rozdział 17
Edytuj Historia
Delphi
Artykuły
Kompendium
Gotowce
FAQ
.NET
Turbo Pascal
FAQ
PHP
FAQ
Java
FAQ
C/C++
Artykuły
FAQ
C#
Wprowadzenie
Assembler
FAQ
(X)HTML
CSS
JavaScript
Z pogranicza
Algorytmy
WIĘCEJ »
Bazy danych dbExpress
W poprzednim rozdziale omawiałem korzystanie z baz danych przy użyciu komponentów BDE. Inną ? moim
zdaniem ciekawą ? formą dostępu do baz danych jest technologia dbExpress. Dzięki komponentom z zakładki
dbExpress możesz w prosty sposób uzyskać dostęp do najpopularniejszych systemów baz danych, takich jak
MS SQL, MySQL, Interbase i Oracle.
Spis treści
1 Aplikacje klient-serwer
1.1 Narzędzia
1.2 Komponenty
2 Łączenie z serwerem
2.1 Kontrola procesu logowania
2.2 Zdarzenia AfterConnect i AfterDisconnect
3 Jak działa MySQL?
3.1 Tabele
3.2 Zapytania
4 Tworzenie tabel
5 Dodawanie rekordów
6 Kasowanie rekordów
6.1 Procedura kasująca
7 Odczytywanie rekordów
7.1 Przykładowy program
8 Zmiana wartości rekordów
8.1 Przykładowy program: spis sprzedanych towarów
9 Inne komponenty dbExpress
10 Programy oparte o dbExpress
11 Podsumowanie
Delphi
C/C++
Turbo Pascal
Assembler
PHP
Programy
Dokumentacja
Kursy
Komponenty
WIĘCEJ »
Podstawą korzystania z różnych baz danych są tzw. sterowniki, które umożliwiają dostęp do systemów baz i
pełnią rolę pośredników.
Ważnym czynnikiem wpływającym na jakość technologii dbExpress jest to, że są to komponenty
międzyplatformowe, zapewniające zgodność z Delphi oraz ze środowiskiem Kylix.
W tym rozdziale:
dowiesz się, na czym polega tworzenie aplikacji typu klient-serwer;
nauczysz się komunikować z bazą danych MySQL;
zaprojektujesz prostą aplikację baz danych, łączącą się z serwerem.
Aplikacje klient-serwer
Architektura baz danych typu klient-serwer polega na łączeniu aplikacji-klienta z serwerem, na którym
znajduje się centralna baza danych. Zasada ta jest podobna do omawianej w rozdziale 11. komunikacji za
pomocą gniazd. Różnica polega na tym, że na serwerze jest zainstalowany jakiś system baz danych, a my
możemy tylko się z nim połączyć.
SQL to skrót od angielskich słów Structured Query Language. Jest to język oparty na specjalnych zapytaniach
kierowanych do bazy.
Narzędzia
Podczas pisania tego rozdziału i przygotowywania przykładowych programów posłużę się darmowymi
narzędziami, które może łatwo zdobyć każdego, kto ma dostęp do Internetu. Jako serwer wykorzystamy
serwer lokalny Apache 1.3. Baza danych oparta będzie na MySQL. Po pierwsze, baza danych MySQL jest dość
łatwa w użyciu, bardzo popularna, darmowa i stosunkowo szybka. Serwer Apache także jest darmowy i
niezwykle popularny. Oba te programy dostępne są zarówno w wersjach dla Linuksa, jak i dla Windows.
Najnowsza wersja serwera Apache znajduje się na stronie www.apache.org , natomiast
serwer baz danych MySQL możesz pobrać ze strony www.mysql.com. Sposób instalacji
Apache oraz MySQL możesz znaleźć m.in. na stronie www.4programmers.net. Ze względu
na dość znaczne rozmiary tych aplikacji postanowiłem ? z myślą o Czytelnikach, którzy
posiadają modemy ? umieścić te aplikacje na dołączonej do książki płycie CD-ROM.
Komponenty
W przykładach z tego rozdziału wykorzystamy komponenty bazodanowe z zakładki dbExpress. Owe
komponenty są raczej łatwe w użyciu, jeżeli pozna się zasadę ich działania. Na początku połączenie się z
serwerem może sprawić niewielkie problemy, lecz później wszystko powinno pójść gładko.
Łączenie z serwerem
Do połączenia z serwerem MySQL będziemy musieli użyć komponentu TSQLConnection z zakładki dbExpress .
Pierwsza rzecz, jaką musisz zrobić, to skopiowanie do katalogu z programem biblioteki libmysql.dll , która jest
1 z 11
2009-03-14 15:53
77982160.011.png 77982160.012.png 77982160.013.png 77982160.014.png 77982160.001.png 77982160.002.png 77982160.003.png 77982160.004.png
Delphi :: Kompendium :: Rozdział 17 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_17
wymagana do połączenia. Ów plik możesz znaleźć w pakiecie MySQL jak również na dołączonej do książki
płycie CD-ROM, w katalogu ../listingi/17/Connect.
RSS | Forum | Pastebin |
Regulamin | Pomoc | Usuń
cookies | Prawa autorskie |
Kontakt | Reklama
Umieść więc komponent TSQLConnection na formularzu i zmień jego nazwę na MySQL. Następnie będziesz
musiał zmienić wartość właściwości ConnectionName na MySQLConnection (rysunek 17.1); spowoduje to
automatyczne dopasowanie kilku pozostałych właściwości.
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.7647 sek. (zapytań SQL:
11)
Rysunek 17.1. Lista możliwych połączeń
Komponent odczytuje listę sterowników z plików dbxconnections.ini oraz dbxdrivers.ini (u mnie te pliki
znajdują się w katalogu E:\Borland Shared\DBExpress). Pliki INI zawierają także parametry, które są
wczytywane do właściwości Params w Inspektorze Obiektów.
Aby móc nawiązać połączenie, należy zmodyfikować jeszcze odpowiednie wartości we właściwości Params.
Wybierz tę właściwość ? zostanie wyświetlone okno edycji parametrów, takie jak na rysunku 17.2.
Rysunek 17.2. Okno edycji parametrów
W tym momencie powinieneś uruchomić serwer MySQL i stworzyć w nim jakąś przykładową bazę danych ? np.
delphi.
W oknie edycji parametrów w pozycji Host Name wpisz adres serwera ? w moim przypadku jest to 127.0.0.1.
Pozycja Database określa bazę danych, na jakiej odbędą się operacje ? wpisz tutaj nazwę utworzonej bazy
danych, czyli delphi. Pozostało jeszcze określenie nazwy użytkownika bazy oraz hasło (pola User_Name oraz
Password ). Wpisz tutaj nazwę użytkownika i hasło do swojej bazy danych. W moim przypadku ani hasło, ani
nazwa użytkownika nie są wymagane, mogę więc usunąć te pola z edytora.
Połączenie ustanowić można poprzez właściwość Connected komponentu TSQLConnection . Właściwość
Connected jest typu Boolean ? przypisanie jej wartości True spowoduje próbę połączenia z serwerem:
procedure TMainForm. btnConnectClick ( Sender: TObject ) ;
begin
if MySQL. Connected then
MySQL. Connected := False
else MySQL. Connected := True ;
end ;
Wykonanie powyższego kodu spowoduje albo rozłączenie, albo połączenie z bazą danych ? w zależności od
aktualnego stanu.
W przypadku zmiany właściwości LoginPromt na False podczas łączenia nie zostanie
wyświetlone okno logowania. Program pobierze nazwę użytkownika oraz hasło z parametrów
User_Name oraz Password .
Jeżeli dostęp do Twojej bazy nie wymaga nazwy użytkownika ani hasła, usuń klucze
User_Name oraz Password z okna edytora właściwości (rysunek 17.2).
Kontrola procesu logowania
Nie każdy chce, aby przed zalogowaniem komponent wyświetlał okienko, w którym trzeba podać nazwę
użytkownika i hasło. Lepszym rozwiązaniem jest umieszczenie na formularzu dwóch etykiet, w których
użytkownik będzie mógł wprowadzić swoje hasło oraz nazwę użytkownika. To zadanie można zrealizować,
korzystając ze zdarzenia OnLogin :
2 z 11
2009-03-14 15:53
77982160.005.png 77982160.006.png
Delphi :: Kompendium :: Rozdział 17 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_17
procedure TMainForm. MySQLLogin ( Database: TSQLConnection;
LoginParams: TStrings ) ;
begin
LoginParams. Values [ 'User_Name' ] := edtLogin. Text ;
LoginParams. Values [ 'password' ] := edtPassword. Text ;
end ;
Zdarzenie to występuje zawsze przed zalogowaniem się do systemu. Powoduje ono przypisanie nazwy
użytkownika oraz hasła z etykiet tekstowych.
Zdarzenia AfterConnect i AfterDisconnect
Aby sprawdzić, czy program został już połączony z bazą danych, wystarczy wygenerować dwa zdarzenia:
AfterConnect oraz AfterDisconnect . Oba występują po zawarciu połączenia oraz po rozłączeniu z serwerem
(rysunek 17.3):
procedure TMainForm. MySQLAfterConnect ( Sender: TObject ) ;
begin
StatusBar. SimpleText := 'Połączony ...' ;
end ;
procedure TMainForm. MySQLAfterDisconnect ( Sender: TObject ) ;
begin
StatusBar. SimpleText := 'Rozłączony...' ;
end ;
Rysunek 17.3. Tekst informujący o nawiązaniu połączenia
Jak działa MySQL?
Przed przystąpieniem do dalszych działań musisz opanować podstawy oraz zasady działania bazy danych
MySQL.
MySQL ( www.mysql.com ) jest darmową, opartą na licencji GNU platformą baz danych. Swoją popularność
zawdzięcza głównie temu, że jest darmowa ? również w zastosowaniach komercyjnych. Stały rozwój tego
programu zapewniają setki programistów, współpracujących przy tworzeniu oraz poprawianiu tej bazy danych.
Tabele
Baza danych jest pojęciem o wielu znaczeniach. W systemie MySQL baza danych jest zbiorem tabel. Natomiast
tabela jest uporządkowanym zbiorem kolumn i wierszy, niczym tabela w programie Excel albo Word (rysunek
17.4).
Rysunek 17.4. Zasada działania tabel
Na powyższym rysunku przedstawiona jest tabela składająca się z trzech kolumn i zawierająca dwa rekordy.
Taka sama idea zastosowana jest w bazach danych (w tym MySQL). Myślę, że to pojęcie jest dla Ciebie już w
miarę jasne, chociażby po lekturze poprzedniego rozdziału o aplikacjach BDE.
Zapytania
Z wydawaniem ?rozkazów? bazie danych wiąże się pojęcie zapytań. Zapytania przekazywane do bazy danych
nakazują jej wykonanie pewnych czynności: utworzenia tabeli, dodania kolumny, usunięcia kolumny,
wstawienia nowego rekordu (wiersza) czy usunięcia bazy danych. Aby zapytanie zostało prawidłowo
zinterpretowane przez bazę danych, musi być skonstruowane według odpowiedniej składni. Przykładowo
zapytanie nakazujące stworzenie nowej tabeli wygląda tak:
CREATE TABLE users (
id int ( 11 ) NOT NULL AUTO_INCREMENT ,
name varchar ( 128 ) NOT NULL DEFAULT '' ,
mail varchar ( 128 ) NOT NULL DEFAULT '' ,
UNIQUE KEY id ( id )
)
Tworzona tabela będzie się nazywać users oraz będzie posiadać trzy kolumny: id (identyfikator rekordu), name
i mail. Przeznaczeniem tej tabeli jest przechowywanie informacji na temat zarejestrowanych użytkowników, a
zatem kolumna name może określać nazwę użytkownika (pseudonim, imię lub nazwisko), a mail adres e-mail
wpisującej się osoby.
Numer id jest zwiększany za każdym dodaniem rekordu (auto_increment). Maksymalna liczba znaków, jaką
może zawierać dana kolumna, to 128 (varchar(128)) ? żadna z kolumn nie może być pusta ( NOT NULL ), a
domyślna wartość to ciąg pusty (default ''). Kolumna id będzie unikatowa ( UNIQUE ).
MySQL nie rozróżnia małych i wielkich liter w zapytaniach. Oznacza to, że zapytania CREATE
TABLE i create table zostaną zinterpretowane tak samo.
Tworzenie tabel
Do utworzenia tabeli przez nasz program będziemy potrzebowali komponentu TSQLDataSet ; umieść go na
formularzu i nazwij SQL. Kolejnym krokiem jest wybranie z listy SQLConnection komponentu MySQL .
3 z 11
2009-03-14 15:53
77982160.007.png 77982160.008.png
Delphi :: Kompendium :: Rozdział 17 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_17
Zapytanie można ustawić we właściwości CommandText , zaznaczając ową właściwość, a następnie naciskając
przycisk wielokropka, co spowoduje otwarcie edytora takiego, jak na rysunku 17.5.
Rysunek 17.5. Edytor zapytań
W polu SQL wpisz takie oto zapytanie:
CREATE TABLE users (
id int ( 11 ) NOT NULL AUTO_INCREMENT ,
name varchar ( 128 ) NOT NULL DEFAULT '' ,
mail varchar ( 128 ) NOT NULL DEFAULT '' ,
UNIQUE KEY id ( id )
)
Możesz już zamknąć edytor; wpisane zapytanie spowoduje utworzenie tabeli users.
Żeby wysłać zapytanie, należy użyć funkcji ExecDir z naszego komponentu SQL.
Utworzenie tabeli (wysłanie zapytania) realizowane jest przez ten kod:
procedure TMainForm. btnCreateTableClick ( Sender: TObject ) ;
begin
if SQL. ExecSQL ( True ) = 0 then MessageDlg ( 'Tabela utworzona!' , mtInformation, [ mbOK ] , 0 ) ;
end ;
Funkcja ExecSQL zwraca cyfrę 0, jeżeli operacja się powiodła.
Dodawanie rekordów
Wstawienie rekordu do istniejącej już tabeli odbywa się za pośrednictwem zapytania INSERT . Jeżeli znamy
dane, które chcemy umieścić w tabeli, to sformułowanie zapytania nie powinno przysporzyć problemu:
INSERT users SET name= 'Adam Boduch' ,mail= 'adam@boduch.net'
Zwróć uwagę, że nie musimy podawać pierwszego parametru ? id . Baza MySQL automatycznie nada wartość
kolumnie id, gdyż przypisaliśmy jej parametr auto_increment .
Na formularzu możesz umieścić dwie etykiety tekstowe, w których użytkownik będzie mógł podać swoje imię
oraz adres e-mail (rysunek 17.6). Kod programu prezentuje listing 17.1.
Rysunek 17.6. Dodawanie nowego rekordu do bazy
Listing 17.1. Kod źródłowy programu
{
Copyright (c) 2002 by Adam Boduch <adam@4programmers.net>
}
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBXpress, DB, SqlExpr, StdCtrls, FMTBcd;
type
TMainForm = class ( TForm )
MySQL: TSQLConnection;
4 z 11
2009-03-14 15:53
77982160.009.png
Delphi :: Kompendium :: Rozdział 17 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_17
btnConnect: TButton;
SQL: TSQLDataSet;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
edtLogin: TEdit;
edtMail: TEdit;
btnAdd: TButton;
procedure btnConnectClick ( Sender: TObject ) ;
procedure MySQLAfterConnect ( Sender: TObject ) ;
procedure MySQLAfterDisconnect ( Sender: TObject ) ;
procedure btnAddClick ( Sender: TObject ) ;
private
Connected : Boolean ;
public
{ Public declarations }
end ;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm. btnConnectClick ( Sender: TObject ) ;
begin
if Connected then Connected := False else Connected := True ;
MySQL. Connected := Connected;
end ;
procedure TMainForm. MySQLAfterConnect ( Sender: TObject ) ;
begin
btnConnect. Caption := 'Rozłącz' ;
end ;
procedure TMainForm. MySQLAfterDisconnect ( Sender: TObject ) ;
begin
btnConnect. Caption := 'Połącz' ;
end ;
procedure TMainForm. btnAddClick ( Sender: TObject ) ;
var
SQLQuery : String ;
begin
SQLQuery := Format ( 'INSERT INTO users SET name="%s", mail="%s"' , [ edtLogin. Text ,
edtMail. Text ]) ;
SQL. CommandText := SQLQuery;
if SQL. ExecSQL ( True ) = 1 then MessageDlg ( 'Rekord został dodany!' , mtInformation, [ mbOK ] , 0 ) ;
end ;
end .
Na samym początku konieczne staje się odpowiednie sformułowanie zapytania (czyli łańcucha), którego wartość
przydzielimy właściwości CommandText komponentu TSQLDataSet . Rekord powinien zostać wstawiony do bazy
po wykonaniu funkcji ExecSQL .
Jeśli wstawienie zostanie wykonane pomyślnie, funkcja ExecSQL zwróci wartość różną od 0.
Kasowanie rekordów
Jeżeli uznamy, że przy wstawianiu nowej pozycji pomyliliśmy się lub nie jest ona nam już potrzebna ? możemy
ją z łatwością usunąć. Do tego służy zapytanie DELETE . Formułując zapytanie, należy podać dane, według
których baza usunie rekord (np. numer ID):
DELETE FROM users WHERE id= '1'
Takie zapytanie może być tworzone na różny sposób ? tj. różne warunki mogą spowodować usunięcie danych.
Kryterium może być nazwa użytkownika:
DELETE FROM users WHERE name= 'Adam Boduch'
W powyższym przypadku usunięte zostaną wszystkie rekordy, w których kolumna name ma wartość Adam
Boduch . Aby zaostrzyć kryterium usuwania danych, można zastosować operatory AND i OR (tak samo, jak w
Delphi)
DELETE FROM users SET name= 'Adam' AND mail= 'adam@boduch.net'
W końcu może istnieć wiele rekordów, w których kolumna name ma wartość Adam , prawda? Żeby nie usunąć
niepotrzebnie danych, zastosujemy operator AND w celu podania również wartości kolumny mail.
Procedura kasująca
W naszym przypadku najlepiej usuwać rekord, biorąc pod uwagę kolumnę id, która w żadnym wypadku nie
będzie się powtarzać:
procedure TMainForm. btnDeleteClick ( Sender: TObject ) ;
begin
SQL. CommandText := 'DELETE FROM users where id="1"' ;
SQL. ExecSQL ( True ) ;
end ;
5 z 11
2009-03-14 15:53
77982160.010.png
Zgłoś jeśli naruszono regulamin