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
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
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
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
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
Plik z chomika:
Wiewioor
Inne pliki z tego folderu:
Delphi __ Kompendium __ Roz1.pdf
(1299 KB)
Delphi __ Kompendium __ Roz10.pdf
(777 KB)
Delphi __ Kompendium __ Roz11.pdf
(1764 KB)
Delphi __ Kompendium __ Roz12.pdf
(834 KB)
Delphi __ Kompendium __ Roz13.pdf
(1951 KB)
Inne foldery tego chomika:
■ePub
A.B Strugaccy
Ann Rice - Śpiąca królewna
Ćwiek Jakub
Ebooki-EPUB-PL-MegaPack
Zgłoś jeśli
naruszono regulamin