bazy_danych_w_delphi.txt

(18 KB) Pobierz
[Kodowanie Windows-1250, koniec wiersza CR+LF, test: za矿虫 g隃l?ja燅]

================================================================================
                 B A Z Y    D A N Y C H   W   D E L P H I
================================================================================
  Adam Sawicki
  regedit.gamedev.pl
  16 czerwca 2006


Czyli jak si?tworzy w Delphi bazy danych. To jest pomoc dydaktyczna do pewnego
egzaminu. B阣zie bardzo zwi陑砤. Trzeba ju?umie?obs硊giwa?Delphi i zna?Object Pascala. To b阣zie tylko o bazach danych. Instrukcja obs硊gi: 1.
przeczyta?2. zrozumie?3. samemu sobie po鎤iczy?w domu 4. i滄 na egzamin 5.
zda?

Autor sam si?na tym nie zna, nauczy?si?na ile potrafi?i nie ponosi 縜dnej
odpowiedzialno渃i za bzdury kt髍e tu powypisywa? Czytasz na w砤sn?odpowiedzialno滄 :)


1. Wst阷
================================================================================


Database Desktop
----------------

Zaczynamy tak: W Delphi menu Tools > Database Desktop. Odpala si?taki 渕ieszny,
brzydki program. W nim mo縩a tworzy?tabelki.

Najpierw trzeba File > Working Directory i tam wpisa?katalog w kt髍ym b阣zie
tw骿 program. Potem File > Private Directory i to samo.

Teraz mo縩a ju?File > New > Table. Typ bazy danych? Nie wiem, zostawiam
domy渓ny o wielce wymownej nazwie "Paradox" :)

Tu mo縩a u硂縴?struktur?tabeli, czyli wprowadzi?jakie b阣?pola. Pole ma
nazw?i typ i ewentualnie rozmiar (stosuje si?do string體, to b阣zie max.
d硊go滄 w znakach) i czy jest kluczem.

Na jakie typy warto zwr骳i?uwag?

- Autoincrement - liczba ca砶owita, kt髍a sama si?b阣zie przypisywa砤 i nie
  trzeba tego robi?r阠znie
- Long integer - to jest ten zwyk硑 int
- Number - to jest liczba rzeczywista
- Alpha - to jest string
- Binary - to jest BLOB

Uk砤damy, potem Save as i zapisujemy gdzie?pod jak箿 nazw?w tym katalogu.

UWAGA! Przed powrotem do Delphi zamykamy ten program, bo inaczej "katalog b阣zie
zablokowany" i guzik zdzia砤my.


Delphi
------

Paleta komponent體 > zak砤dka "BDE" > komponent Table. To jest tabela. W niej
ustawiamy dwie rzeczy:

1. DatabaseName - tu mo縠 by?
	- albo alias (w Database Desktop mo縩a robi?aliasy do baz danych i wtedy
		one s?chyba wsp髄ne dla ca砮go systemu),
	- albo 渃ie縦a do twojego programu, np. "C:\Temp\MyExam". Tylko uwaga! Tu
		nie dzia砤 渃ie縦a wzgl阣na, 縜dne ".\" itp., musi by?bezwzgl阣na.
		Z kodu mo縩a to przypisa?tak:

			Table1.DatabaseName = ExtractFilePath(Application.ExeName);

2. TableName - tu ma by?nazwa tabeli.

痚by odpali?tabel? trzeba ustawi?jej Active na True. Mo縩a to zrobi?ju?na
etapie projektowania ale radzili 縠by raczej to robi?w czasie wykonania, np. w
OnCreate:

	Table1.Active := True;

Nast阷na sprawa. Paleta komponent體 > zak砤dka "Data Access" > komponent
DataSource. To jest taka zwrotnica przez kt髍?przechodz?dane dalej. Ustawiamy
mu DataSet na Table1.

Ostatnia rzecz to komponenty. Tu opcje s?dwie. Mo縠my postawi?osobne kontrolki
do r罂nych p髄 i wtedy b阣zie w nich wida?warto渃i z bie抗ceego rekordu. S?do
tego komponenty na zak砤dce "Data Controls". Jest tam EDIT, MEMO, LABEL, IMAGE,
r罂ne rzeczy, podobne do tych standardowych tylko bazodanowe. Przypisujemy w
nich:

1. DataSource na DataSource1,
2. DataField na nazw?konkretnego pola tej tabeli.

Opcja druga to bardzo fajny komponent DBGrid - pierwszy na zak砤dce "Data
Controls". To jest tabelka w kt髍ej wida?wszystko z tabeli i mo縩a te?tam
edytowa?

Do nawigacji po tabeli stawiamy DBNavigator - komponent drugi z zak砤dki "Data
Controls". Przypisujemy mu DataSource na DataSource1 i gotowe. Mo縩a jeszcze
ShowHint na True. S?tam przyciski do przechodzenia po rekordach, wstawiania,
usuwania, edytowania, zatwierdzania i anulowania zmian.

Odpalamy program i gotowe! Baza danych w Delphi wyklikana. Mo縩a w ten spos骲
zrobi?sobie i postawi?w programie kilka niezale縩ych tabel. Teraz jedziemy
dalej...


2. TField
================================================================================

TField to klasa bazowa reprezentuj筩a pola. Nie wyst阷uje sama. Tabela ma list?p髄. Dzi阫i tej klasie mo縩a odczytywa?i zapisywa?warto渃i poszczeg髄nych p髄
w bie抗cym rekordzie danej tabeli.

Jak u縴wa?warto渃i pola? Za丑縨y dla dowodu :) 縠 mamy ju?obiekt klasy TField.
Teraz s?takie opcje:

- Value: Variant
	Variant to taki typ dynamiczny (co?jak zmienne w PHP) 縠 mo縠sz sobie go
	odczytywa?i przypisywa?jakom string, liczb? co chcesz i si?nie
	przejmowa?
- AsVariant
	Dzia砤 jak wy縠j.
- AsString, AsInteger itp.
	U縴wasz warto渃i pola jakby by砤 danego typu. Je渓i nie jest, to si?	spr骲uje skonwertowa?
- Table1.FieldValues['Pole1']: Variant
	Szybki dost阷 do poszczeg髄nych p髄 tabeli w postaci Viariant體.

Sk筪 wzi规 obiekt klasy TField?

- Je渓i pole jest typu Presistant Field, to jest normalnie polem twojej klasy
	formatki TForm1 tak jak komponenty i mo縠sz po prostu u縴?jego nazwy, np.
	Table1ID.co渢am.
- Table1.Fields[0]
	Poszczeg髄ne pola tabeli u縴waj筩 numeru.
- Table1.FieldByName('Pole1')
	Po nazwie.
- Table1.IndexFields[0]
	Kt髍e渢am z kolei pole b阣筩e indeksem.

Pola mog?by?Dynamic albo Presistant. Normalnie tabela ma pola Dynamic, czyli
sobie sama tworzy w momencie aktywacji te obiekty klasy TField dok砤dnie takie,
jakie s?pola w tabeli. A teraz uwaga bo b阣zie Mega Wypas [tm]!

Klikamy dwa razy lewym na komponencie tabelki. Pokazuje si?taki 渕ieszny
edytorek p髄. Na tej li渃ie prawym i mamy menu kontekstowe, a w nim mo縠my
dodawa?pola. Add fields po prostu doda nam wszystkie pola tak jak s?w tabeli.
Fajnie. Od tej pory, skoro ta lista nie jest pusta, nie ma ju?p髄 dynamicznych.
There is no Dynamic Field :) S?tylko te kt髍e my tutaj zdefiniujemy i to s?Presistant Fields. Jak wida?ka縟e ma mas?w砤渃iwo渃i, jak cho鎎y alignacj?tekstu.

Mo縩a te?dodawa?nowe pola. Jest kilka rodzaj體 p髄 i w砤渘ie tutaj jak s筪z?le縴 rozwi箊anie tych r罂nych zada?kt髍e mog?nam zada?

1. Data
To zwyk砮 pole bior筩e dane z jakiego?pola tabeli i ju?:P

2. Calculated
To pole, kt髍ego warto滄 b阣zie wyliczana. Jak to wylicza? Robisz obs硊g?zdarzenia OnCalcFields dla tabeli i tam centralnie dajesz obliczanie jakiego?pola, o tak:

	Table1.FieldValues['IDx2'] := Table1.FieldValues['ID'] * 2;

3. Aggregate
Tego akurat nie umiem. Mo縠 si?nie przyda :)

4. Lookup
Takie pole mo縠 bra?dane z innej tabeli. Jakby to wyt硊maczy?.. Za丑縨y, 縠
mamy takie dwie tabele:

	Studenci
		ID
		Imie
		Nazwisko

	Oceny
		ID_studenta
		Ocena

Teraz tak: Dajemy w tabeli z ocenami Presistant Field "Imie". Przy jego
tworzeniu podajemy takie dane:

- Key Fields = ID_studenta
	czyli pole mojej tabeli, po kt髍ym b阣?彻czy?- DataSet = DataSet2
	czyli tam gdzie s?pobierane dane z tej drugiej tabeli - ze studentami
- Lookup Keys = ID
	czyli pole tej drugiej tabeli, wed硊g kt髍ego je 彻cz?- Result Field = Imie
	czyli pole tej drugiej tabeli, z kt髍ego wybieram dane

To samo mo縩a zrobi?dla drugiego Presistant Field - "Nazwisko" i ju?tabela z
ocenami opr骳z oceny i nic nie m體i筩ego identyfikatora studenta ma te?jego
imi?i nazwisko i co wi阠ej - nadal jest edytowalna, a nawet te pola Imie i
Nazwisko da si?edytowa?i pojawiaj?si?tam listy rozwijalne (ComboBoxy). Ale
power! :D


3. TDataSet
================================================================================

TDataSet - tak si?nazywa abstrakcyja klasa bazowa dla r罂nych rzeczy, kt髍e
zapodaj?dane w postaci tabeli. To mo縠 by?prawdziwa tabela bazy danych, wynik
wykonania zapytania select albo procedura sk砤dowana. Koniec wst阷u
teoretycznego :) Jak dla nas, z tej klasy dziedzicz?(a tym samym maj?wszystko
to co ona) TTable oraz TQuery. Co ta klasa potrafi?

Po pierwsze - trzeba j?uaktywni? Robi to albo metoda Open i Close, albo
ustawienie w砤渃iwo渃i Active odpowiednio na True czy False.

Po drugie, w ka縟ej chwili DataSet jest w jakim?*stanie* (w砤渃iwo滄 State).
G丑wne stany to:

- dsInactive - nie uaktywniona
- dsBrowse - przegl筪anie danych
- dsEdit - edytowanie bie抗cego rekordu
- dsInsert - edytowanie nowego, nieistniej筩ego jeszcze rekordu celem dodania
- dsSetKey - ustawianie danych po kt髍ych b阣ziemy szukali

i jeszcze masa innych... Na szcz隃cie zwykle nie trzeba si?tym zajmowa?

Po trzecie, w DataSet zawsze jaki?jeden rekord jest bie抗cy i to na nim mo縠my
operowa?

- RecNo - przechowuje numer bie縜cego rekordu
- First, Last, Prior, Next - wiadomo co robi?:)
- MoveBy - przesuwa kursor o ile渢am rekord體 w d蟪 albo w g髍?(je渓i minus)
- Bof, Eof - zwraca true je渓i odpowiednio jeste渕y na pocz箃ku albo na ko馽u

Teraz jak edytowa?dane:

- CanModify - m體i czy DataSet da si?modyfikowa?- Edit - wprowadza w stan edycji
	Od tej pory mo縩a zmienia?pola.
- Append, Insert - wprowadza w stan edycji nowego rekordu
	R罂nica jest taka, 縠 Append dodaje nowy rekord na ko馽u, a Insert nie.
- Post - zatwierdza wprowadzone zmiany
- Cancel - anuluje wprowadzone zmiany
- Delete - kasuje bie抗cy rekord

Przyk砤d jak zmieni?bie抗cy rekord:

	Table1.Edit;
	Table1.FieldByName('ID').AsInteger := 666;
	Table1.FieldByName('Imie').AsString := 'Jan';
	Table1.FieldByName('Nazwisko').AsString := 'Kowalski';
	Table1.Post;

Inny spos骲 to metody: AppendRecord, InsertRecord, SetFields. Dwie pierwsze
dodaj?nowy rekord, ostatnia zmiena bie抗cy. Podaje si?do nich wszystkie pola
na raz, o tak:

	Table1.Edit;
	Table1.SetFields([666, 'Jan', 'Kowalski']);
	Table1.Post;

Je渓i chcesz robi?co?na kolejnych rekordach i nie chcesz 縠by kontrolki miga硑
pokazuj筩 stale co si?dzieje i op鬅niaj筩 wszystko, u縴j na tabeli metod
DisableControls i EnableControls.


Szukanie
--------

Spos骲 1: Metoda Locate. Skacze do pierwszego/nast阷nego rekordu, kt髍ego podane
pole ma podan?warto滄. Na przyk砤d:

	Table1.Locate('Imie', 'Jan', [loPartialKey]);

Opcje w ostatnim parametrze mog?by?takie:

- loCaseInsensitive - wiadomo
- loPartialKey - to znaczy chyba 縠by mo縩a by硂 poda?tylko kawa砮k stringa

Szukanie po kilku polach na raz:

	Table1.Locate('Imie;Nazwisko', VarArrayOf(['Jan', 'Kowalski']),
		[loPartialKey]);

Jest te?jaka?metoda Lookup, ale nie zg酬bia砮m tego tematu.

Spos骲 2: Po indek...
Zgłoś jeśli naruszono regulamin