6429
Szczegóły |
Tytuł |
6429 |
Rozszerzenie: |
PDF |
Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres
[email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.
6429 PDF - Pobierz:
Pobierz PDF
Zobacz podgląd pliku o nazwie 6429 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.
6429 - podejrzyj 20 pierwszych stron:
Piotr Neil Gawro�ski
InterBase dla �delfin�w�
Helion 2001
Wst�p
Celem niniejszej ksi��ki jest przybli�enie u�ytkownikom Delphi serwera bazy danych InterBase i biblioteki IBX. Publikacja ta nie jest podr�cznikiem SQL-a, lecz zawiera opis obiekt�w po stronie serwera i sposobu dost�pu do nich z Delphi za pomoc� biblioteki IBX.
Rozdzia� 1. Typy danych
W niniejszym rozdziale zostan� przedstawione typy danych, z jakich mo�na korzysta� podczas tworzenia bazy danych. Znajomo�� ich jest niezb�dna w fazie projektowania i pisania oprogramowania. Om�wiony tak�e zostanie spos�b korzystania z tych typ�w danych
w Delphi.
W InterBase wyst�puj� nast�puj�ce typy danych:
* znakowe - CHAR i VARCHAR,
* zmiennoprzecinkowe - FLOAT i DOUBLE PRECISSION,
* ca�kowite - INTEGER i SMALLINT,
* sta�oprzecinkowe - NUMERIC i DECIMAL,
* dotycz�ce daty i czasu - DATE, TIME i TIMESTAMP,
* binarne - BLOB.
Wszystkie typy danych, z wyj�tkiem BLOB, mog� tworzy� tablice (arrays) o wymiarach
od l do 16.
Tabela 1.1 zawiera kr�tk� charakterystyk� ww. typ�w danych.
Tabela 1.1.
Typy danych w InterBase
Nazwa
Rozmiar
zakres dok�adno�ci
Opis
BLOB
Zmienny
(w definicji wiersza 8 bajt�w)
Rozmiar segmentu typu BLOB
jest ograniczony do 64 kB
Rozmiar p�l tego typu mo�e si� zmienia� dynamicznie w zale�no�ci od aktualnych potrzeb. Idealnie nadaje si� do przechowywania grafiki, d�wi�ku czy dokument�w (np. MS Office)
CHAR(n)
CHARACTER(n)
n znak�w
n mo�e przyj�� warto�� z zakresu
od l do 32767, przy czym n pomno�one przez rozmiar znaku nie mo�e przekroczy� 32767 (w niekt�rych zestawach rozmiar jest wi�kszy od 1)
Odpowiednie do przechowywania
tekst�w o sta�ej d�ugo�ci
DATE
8 bajt�w (64 bity)
od l stycznia 100r.n.e.
do 29 lutego 32768 r.
DECIMAL
(precyzja, skala)
2,4 lub 8 bajt�w (l6, 32 lub 64 bity)
Precyzja od l do 18; minimalna liczba cyfr do przechowania w polu Skala od O do 18; liczba cyfr do przechowania po przecinku. Warto�� ta musi by� mniejsza lub r�wna precyzji
liczby sta�oprzecinkowe DECIMAL(8.2) przechowuje liczby w formacie pppppp.ss
DOUBLE PRECISION
8 bajt�w (64 bity1)
Od 2,225x10-308 do 1,797x10308
Liczba zmiennoprzecinkowa podw�jnej precyzji - 15 cyfr
FLOAT
4 bajty (32 bity)
Od 1,175x10-38 do 3,402x1038
Liczba zmiennoprzecinkowa
pojedynczej precyzji - 7 cyfr
INTEGER
4 bajty (32 bity)
0d �2147483648 do 2147483647
Liczby ca�kowite ze znakiem
NCHAR
[VARYING](n)
NATIONAL CHAR [VARYING]
NATIONAL CHARACTER [VARYING]
n znak�w
n mo�e przyj�� warto�� z zakresu od l
do 327672, przy czym n pomno�one przez rozmiar znaku nie mo�e przekroczy� 32767 (w niekt�rych zestawach rozmiar jest wi�kszy od 1)
Teksty lub �a�cuchy znak�w o sta�ej (zmiennej dla VARYING) d�ugo�ci. R�ni� si� od CHAR i VARCHAR jedynie zestawem znak�w
- ISO 8859-1
NUMERIC
(precyzja skala)
2,4 lub 8 bajt�w (16,32 lub 64 bity)
Precyzja: 1 do 18; dok�adnie liczba cyfr do przechowania w polu. Skala: 0 do 18; liczba cyfr do przechowania po przecinku. Warto�� ta musi by� mniejsza lub r�wna precyzji
Liczby sta�oprzecinkowe, NUMERIC(8,2) przechowuje liczby w formacie pppppp.ss
SMALLINT
2 bajty (16 bit�w)
od �32768 do 32767
�Kr�tka� (short) liczba ca�kowita
ze znakiem
TIME
8 bajt�w (64 bity)
Czas od godziny 0:00:00.000
do 23:59:59.999
TIMESTAMP
8 bajt�w (64 bity)
1 stycznia 100r.n.e. do 29 lutego 32768r. wraz z godzin� z dok�adno�ci� jak
TIME
Przechowuje zar�wno dat�, jak
i godzin�
VARCHAR(n)
CHAR VARYING
CHARACTER VARYING
n znak�w
n mo�e przyj�� warto�� z zakresu od 1 do 32765, przy czym n pomno�one przez rozmiar znaku nie mo�e przekroczy� 32765 (w niekt�rych zestawach rozmiar jest wi�kszy od 1)
Teksty lub �a�cuchy znak�w
o zmiennej d�ugo�ci
Typy znakowe
W InterBase programista ma do dyspozycji nast�puj�ce typy znakowe:
* typ znakowy o sta�ej d�ugo�ci, nazywany CHAR(n)3 lub CHARACTER(n),
* typ znakowy o zmiennej d�ugo�ci, nazywany VARCHAR(n), CHAR VARYING(n)
lub CHARACTER VARYING(n),
* typ o sta�ej d�ugo�ci wykorzystuj�cy zestaw znak�w ISO 8859-1 (CHARSET IS08859_1), o nazwie NCHAR(n), NATIONAL CHAR(n) lub NATIONAL CHARACTER(n),
* typ b�d�cy po��czeniem typ�w z dw�ch poprzednich punkt�w, nazywany
* NCHAR VARYING(n), NATIONAL CHARACTER VARYING(n) lub NATIONAL CHAR VARYING(n).
Typ CHAR
Ten typ danych, podobnie jak NCHAR, s�u�y do przechowywania tekst�w o sta�ej d�ugo�ci. Warto pami�ta� o tym, �e deklaruj�c kolumn� CHAR(n), otrzymamy �a�cuch znak�w o d�ugo�ci dok�adnie n. Je�li do bazy zapisano kr�tszy tekst, w miejsce brakuj�cych znak�w zostan� wpisane spacje, kt�re nie b�d� pakowane i przechowywane w tabeli. Pozwala to na pewn� oszcz�dno�� miejsca na dysku.
W trakcie tworzenia kolumny tekstowej mo�na zdefiniowa� zestaw znak�w i spos�b por�wnywania, z jakiego mo�na korzysta� w przypadku tej kolumny. Podaj�c zestaw znak�w, nale�y zwr�ci� uwag� na to, aby nie przekroczy� rozmiaru pola 32 767 bajt�w - w niekt�rych wypadkach jeden znak mo�e zaj�� wi�cej ni� jeden bajt4. Zagadnienie to zostanie om�wione nieco dalej.
Do utworzenia tabeli zawieraj�cej kolumn� tekstow� mo�na u�y� nast�puj�cej konstrukcji:
CREATE TABLE TEST (
TEKST CHAR(8O) CHARACTER SET WIN1250 COLLATE PXW_PLK
)
Jak mo�na si� domy�li�, do manipulacji takim polem w Delphi najodpowiedniejszy jest typ STRING. Aby pobra� dane z pola w celu dalszego ich przetwarzania, mo�na u�y� jednej
z konstrukcji5:
IBTablel.FieldByName(�TEKST�).AsString := 'Ala';
If Length(IBQuery1.FieldByName('TEKST'.AsString) then ...
Typ VARCHAR
Ten typ przechowuje tekst o zmiennej d�ugo�ci. W deklaracji VARCHAR(n) liczba n okre�la maksymalny rozmiar �a�cucha znak�w. Ale w przeciwie�stwie do CHAR, w miejsce brakuj�cych znak�w nie s� wpisywane spacje. Pomaga to zaoszcz�dzi� miejsce na dysku. Poniewa� �a�cuchy maj� r�n� d�ugo��, na stronie bazy mie�ci si� ich wi�cej, dzi�ki czemu dost�p do danych nast�puje przy mniejszej liczbie odczyt�w z dysku. Z drugiej jednak strony, aktualizacje mog� przebiega� wolniej ni� w przypadku u�ycia typu znakowego o sta�ej d�ugo�ci.
Tak samo jak ma to miejsce w przypadku typu CHAR, definiuje si� zestaw znak�w i spos�b por�wnywania. Je�li chodzi o VARCHAR, rozmiar pola nie mo�e przekroczy� 32 765 bajt�w.
Aby doda� kolumn� tekstow� o zmiennej d�ugo�ci do tabeli TEST, nale�y skorzysta�
z konstrukcji:
alter table test add ZMIENNY VRCHAR(120)
Typ VARCHAR obs�ugiwany jest w Delphi tak samo jak CHAR.
Typ BLOB stosowany do danych tekstowych
Na og� typ BLOB s�u�y do przechowywania danych binarnych, ale r�wnie dobrze mo�na si� nim pos�u�y� do przechowywania tekstu. Jego zalet� - w por�wnaniu
do wymienionych wcze�niej typ�w danych - jest brak ograniczenia rozmiaru do 32 kB tekstu. Mo�na okre�li� zestaw znak�w, jaki b�dzie przechowywany, ale nie mo�na okre�li� sposobu por�wnywania dla kolumny BLOB. Definiuj�c typ BLOB, mo�na okre�li� jego podtyp6
- w przypadku danych tekstowych nale�y poda�, �e jest to typ 1.
W Delphi do przetwarzania tekstowego pola BLOB wykorzystuje si� string. Pola obs�uguje typ TMemoField - mo�na je po��czy� z TDBMemo lub TDBRichEdit. Nale�y pami�ta�, �e taka obs�uga ma sens jedynie dla podtypu l.
Zestawy znak�w
W przypadku typ�w znakowych mo�na okre�li� zestaw znak�w, z jakiego b�dzie
korzysta� dana kolumna. Zdefiniowanie takiego zestawu podczas deklaracji kolumny powoduje nadpisanie standartowego zestawu znak�w, jaki zosta� okre�lony w trakcie tworzenia tabeli. Mo�na tak�e okre�li� spos�b por�wnywania, jaki ma by� wykorzystany, je�li jest on inny ni� domy�lny - niekt�re zestawy znak�w mog� mie� ich kilka. A kiedy najcz�ciej wykorzystujemy por�wnywanie? Oczywi�cie podczas sortowania. Chc�c doda� powy�sze informacje do deklaracji kolumny, u�yjemy nast�puj�cej sk�adni:
<NAZWA KOLUMNY> <TYP TEKSTOWY> [CHARACTER SET nazwa_zestawu] ... [COLLATE porz�dek]
np.:
ALTER TABLE TEST ADO POLSKI_EKST CHAR(40) CHARACTER SET WIN1250 NOT NULL COLLATE PXW_PLK
W poni�szej tabeli znajduje si� lista dost�pnych zestaw�w znak�w.
Tabela 1.2.
Lista dost�pnych zestaw�w znak�w
Zestaw znak�w
Min/Max rozmiar znaku w bajtach
Sposoby por�wnywania
ASCII
BIG_5
CYRL
DOS437
DOS852
DOS850
DOS857
DOS860
DOS861
DOS863
DOS865
EUCJ_0208
GB_2312
ISO8859_1
KSC_5601
NEXT
NONE
OCTETS
SJIS_0208
UNICODE_FSS
WIN1250
WIN1251
WIN1252
WIN1253
WIN1254
1/1
1/2
1/1
1/1
1/1
1/1
1/1
1/1
1/1
1/1
1/1
1 /2
1 /2
1/1
1 /2
1/1
1/1
1/1
1 /2
1 /3
1/1
1/1
1/1
1/1
1/1
ASCII
BIG_5
CYRL
DB_RUS
PDQX_CYRL
DOS437
DB_DEU437
DB_ESP437
DB_FIN437
DB_FRA437
DB_ITA437
DB_NLD437
DB_SVE437
DB_UK437
DB_US437
PDOX_ASCII
PDOX_INTL
PDOX_SWEDFIN
DOS852
DB_CSY
DB_PLK
DB_SLO
PDOX_CSY
PDOX_HUN
POOX_PLK
PDOX_SLO
DOS850
DB_DEU850
D8_ESP850
DB_RA850
DB_FRC850
OB_ITA850
DB_NLD850
DB_PTB850
DB_SVE850
DB_UK850
DB_US850
DOS857
DB_TRK
DOS860
DB_PTG860
DOS861
POOX_ISL
DOS863
DB_FRC863 :
DOS865
DB_DAN865
DB_NOR865
PDOX_NORDAN4
EUCJ_0208
GB_2312
IS08859_1
DA_DA
DE_DE
DU_NL
EN_UK
EN_US
ES_ES
FI_FI
FR_CA
FR_FR
IS_IS
IT_IT
NO_NO
PT_PT
SV_SV
KSC_5601
KSC_DICTIONARY
NEXT
NXT_DEU
NXT_FRA
NXT_ITA
NXT_ESP
NXT_US
NONE
OCTETS
SJIS_0208
UNICODE_FSS
WIN1250
PXW_CSY
PXW_HUNDC
PXW_PLK
PXW_SLOV
WIN1251
PXW_CYRL
WIN1252
PXW_INTL
PXW_INTL850
PXW_NORDAN4
PXW_SPAN
PXW_SWEDFIN
WIN1253
PXW_GREEK
WIN1254
PXW_TURK
W tabeli wyr�nione zosta�y te zbiory znak�w, kt�re najbardziej odpowiadaj� polskiemu u�ytkownikowi. WIN1250 jest stosowany w Windows, a DOS852 to stara, dobra strona kodowa 852 z DOS-a.
Je�li podczas definicji kolumny nie okre�limy sposobu por�wnywania, to b�dzie stosowany spos�b domy�lny - czyli pierwszy wymieniony przy odpowiednich zbiorach znak�w
w powy�szej tabeli. Czasem mo�emy chcie� por�wna� dane inaczej, ni� by to wynika�o
z definicji kolumny czy z domy�lnego sposobu dla danego zestawu znak�w. Stosuj�c zapytanie SELECT z klauzul� ORDER BY lub GROUP BY, mo�na okre�li�, w jaki spos�b InterBase ma por�wna� dane w kolumnach. Np.:
Select TEKST From TEST Order By TEKST COLLATE PXW_SLOV:
Spos�b por�wnywania mo�na okre�li� tak�e w przypadku... operacji por�wnania
- np. w klauzuli WHERE instrukcji SELECT:
Select * from Test Where Tekst COLLATE PXW_PLK = :tekst
W stosunku do wersji 5 InterBase nast�pi�a zmiana w nazwie jednego ze sposob�w por�wnania -
PXW_SLO zmieniono na PXW_SLOV. Je�li chcemy zobaczy�, jakie zestawy znak�w
i odpowiadaj�ce im sposoby por�wnania s� zdefiniowane w bazie danych, musimy przyjrze� si� nast�puj�cym tabelom systemowym:
* ROB$CHARACTER_SETS dla zbior�w znak�w (kolumna RDB$CHARACTER_SET_NAME),
* RDB$COLLATIONS dla por�wna� (kolumna RDBSCOLLATION_NAME).
Typy liczbowe
InterBase pozwala na przechowywanie danych typ�w ca�kowitych, sta�oprzecinkowych
i zmiennoprzecinkowych. Poni�ej mo�na znale�� informacje na ich temat.
Typy ca�kowite
Do deklarowania kolumn danych typ�w ca�kowitych s�u�� nast�puj�ce s�owa kluczowe:
* SMALLINT - liczby ca�kowite ze znakiem z przedzia�u od -32 768 do 32 767. Typ w Delphi - dowolny typ ca�kowity, ale najlepiej oczywi�cie... SmallInt. Przy pr�bie przypisania warto�ci spoza zakresu zostanie zg�oszony wyj�tek EDatabaseError z komunikatem
o przekroczeniu zakresu.
* INTEGER - liczby ca�kowite ze znakiem z przedzia�u od -2 147 483 648 do 2 147 483 647. W Delphi oczywi�cie obs�ugiwane przez Integer, ale wraz z wprowadzaniem kolejnych wersji Delphi zwi�kszono zakres typu Integer, dlatego dla pewno�ci lepiej korzysta�
z Longint.
* NUMERIC - wykorzystuje si� do liczb sta�oprzecinkowych, ale je�li podamy skal� r�wn� zeru, to mo�emy uzyska� liczb� z przedzia�u od -1019 +1 do 1019-1. Taki efekt mo�na uzyska� jedynie przy wykorzystaniu dialektu 3 bazy danych. W przeciwnym razie pola NUMERIC o precyzji zawieraj�cej si� w przedziale 10- 18 zostan� zamienione na DOUBLE PRECISI0N7. Do obs�ugi tych kolumn nale�y wykorzysta� typ Int64 (w Delphi 5) lub Comp we wcze�niejszych wersjach.
O ile w zasadzie nie ma problemu z dost�pem do p�l typu SMALLINT i INTEGER
- wykorzystujemy w�a�ciwo�� komponentu TFieldAsInteger, np.:
IBTable1.FieldByName(�SI�).AsInteger := 2000;
to mo�e by� problem w przypadku przekroczenia zakresu 10 cyfr w typie NUMERIC.
W komponencie TField brakuje w�a�ciwo�ci AsInt64 lub podobnego. Na szcz�cie mamy do dyspozycji potomka TField o nazwie TLargeIntField. Umo�liwia on dost�p do 64-bitowych liczb ca�kowitych, trzeba jednak stworzy� obiekt tego typu naj�atwiej to zrobi� korzystaj�c z edytora p�l8 (field editor) w Delphi.
Typy sta�oprzecinkowe
W InterBase mamy do dyspozycji dwa typy danych pozwalaj�ce na przechowywanie liczb ze sta�� liczb� miejsc po przecinku - NUMERIC i DECIMAL Najcz�ciej s� stosowane do przechowywania informacji o kwotach pieni�nych. W przypadku obu tych typ�w mo�na (ale nie trzeba) zdefiniowa� precyzj� i skal�.
Precyzja okre�la liczb� cyfr, z kt�rych b�dzie sk�ada�a si� liczba. Dopuszczalne s� warto�ci z przedzia�u od l do 18.
Skala to dopuszczalna liczba cyfr po przecinku (cz�� u�amkowa). Mo�e przyjmowa� warto�ci z zakresu od 0 do precyzji.
Je�li nie okre�limy �adnej z nich, to przyjmowane s� warto�ci: 9 dla precyzji i 0 dla skali
- odpowiada to deklaracji kolumny typu INTEGER. R�nica pomi�dzy typem DECIMAL i NUMERIC polega na interpretacji precyzji. W pierwszym przypadku precyzja dopuszcza przechowanie co najmniej p cyfr i dok�adnie s cyfr po przecinku. Natomiast w przypadku NUMERIC precyzja p okre�la dok�adn� liczb� cyfr przechowywanych przez kolumn� i dok�adn� liczb� s cyfr po przecinku.
Je�li chodzi o wykorzystanie tych typ�w w Delphi, to zale�nie od wybranej precyzji i skali mog� to by�: comp lub int64 oraz wszystkie typy ca�kowite (pod warunkiem zachowania zgodno�ci zakres�w), przy korzystaniu ze skali wi�kszej od zera - typy zmiennoprzecinkowe, jak np. double. Trzeba jednak zachowa� ostro�no��, gdy� podczas konwersji mi�dzy sta�ym a zmiennym przecinkiem mo�e doj�� do utraty dok�adno�ci.
Do przeprowadzania operacji na zmiennych przechowuj�cych warto�ci pieni�ne Delphi proponuje typ Currency (jedyny typ sta�oprzecinkowy). Bez problem�w mo�na zdefiniowa� precyzj� r�wn� 18 i skal� r�wn� 4: Numeric(18,4).
Typy zmiennoprzecinkowe
W InterBase programista ma do dyspozycji dwa typy zmiennoprzecinkowe;
* FLOAT - zakres warto�ci od l,175xl0-38 do 3,402xl038, z dok�adno�ci� 7 cyfr dziesi�tnych; w Delphi typ single,
* DOUBLE PRECISSON - liczby z przedzia�u od 2,225xl0-308 do 1,797xl0308,
z dok�adno�ci� 15 cyfr dziesi�tnych; typ double w Delphi.
Przy wpisywaniu warto�ci warto pami�ta� o dok�adno�ci podanej powy�ej. Je�li po przecinku znajdzie si� wi�cej cyfr, to najmniej znacz�ce zostan� odrzucone. Z drugiej strony, nale�y zwr�ci� uwag� na to, �e nie ka�da liczba ma dok�adn� reprezentacj� binarn�. St�d je�li np.
w pole float wstawimy 0,2, to pobieraj�c dane z kolumny otrzymamy 0.200000002980232. Trzeba o tym pami�ta�, �eby unikn�� niemi�ych niespodzianek.
Czas i data
InterBase udost�pnia nast�puj�ce typy s�u��ce do deklarowania kolumn obs�uguj�cych czas i dat�:
* DATE - przechowuje dat� z zakresu od l stycznia 100 r.n.e. do 29 lutego 32768 r.n.e,
* TIME - przechowuje informacj� o czasie - od godziny 0:00:00.000 do 23:59:59.999,
* TIMESTAMP - stanowi kombinacj� dw�ch powy�szych typ�w.
Format daty i czasu jest nast�puj�cy: 'DD.MM.YYYY hh:nmi:ss.ttt' lub 'DD-MMM-YYYY hh:mm:ss.ttt', gdzie:
* DD - dzie� miesi�ca,
* MM - numer miesi�ca,
* MMM - trzyliterowy, angielski skr�t nazwy miesi�ca,
* YYYY - rok,
* hh - godzina,
* mm - minuty,
* ss - sekundy,
* ttt - tysi�czne cz�ci sekundy.
W przypadku typu TIMESTAHP podanie informacji dotycz�cych czasu nie jest wymagane
-wszystkie odpowiednie elementy przyjm� wtedy warto�� zero. Je�li zastosujemy zapytanie
(z poziomu konsoli lub Delphi):
Select czas from test order by czas
i b�dziemy si� spodziewali zobaczy� u�amkowe cz�ci sekundy, to mo�emy si� zdziwi�. Znajdziemy za sekundami zero albo... nic9. Chc�c uzyska� tak� dok�adno�� musimy dokona� konwersji tej kolumny np. na typ znakowy. Poni�sze zapytanie zadzia�a ju� zgodnie z naszymi oczekiwaniami:
Select Cast(czas as char(13)) as czas from test order by czas
W powy�szym kodzie SQL-a widzimy funkcj� CAST, kt�ra w InterBase s�u�y do konwersji typ�w, a jej sk�adnia jest nast�puj�ca:
CAST(<wyra�enie> as <nazwa_typu>)
gdzie <nazwa_typu> jest jednym z typ�w InterBase wymienionych w typ rozdziale lub nazw� domeny. Nale�y pami�ta�, �e nie wszystkie konwersje maj� sens - np., konwersja daty na typ BLOB spowoduje wyst�pienie b��du.
Stosuj�c zapytania SQL-owe mo�na skorzysta� z nast�puj�cych funkcji:
* 'Date' - zwraca bie��c� dat�,
* ' Now' - zwraca dat� i godzin�,
* 'Today' - jak 'Date',
* 'Tomorrow' - data jutrzejsza,
* 'Yesterday' - data wczorajsza.
Stosuj�c te funkcje w zapytaniach, nale�y wpisywa� je w apostrofach i dokona� konwersji na typ DATE, np.:
Select Cast (�now' as time), czas from test;
Update test set czas = 'now';
W Delphi wyst�puje typ TDateTime, kt�ry tak naprawd� jest typem double. W cz�ci ca�kowitej przechowuje informacje o dacie, a w u�amkowej o godzinie. Data powinna mie�ci� si� w przedziale od 30 grudnia 1899 roku do ko�ca roku 9999. Informacje o godzinie mo�na przechowywa� z dok�adno�ci� do tysi�cznych cz�ci sekund. Przy okazji TDateTime warto zwr�ci� uwag� na funkcje EncodeDate, DecodeDate, EncodeTime, DecodeTime i FormatDateTime. Pozwalaj� one na wydzielenie b�d� zapisanie w dacie informacji o latach, miesi�cach itd. np.:
Var
R. M. D : word;
Begin
DecodeDate(IBQry.FieldByName('Czas').AsDateTime, R, M, D);
...
{ W R, M, D mamy rok, miesi�c i dzie� z pola w bazie danych }
end;
I nast�pna rzecz, o kt�rej czasami si� zapomina - r�nica dw�ch dat daje w wyniku liczb� dni wyst�puj�cych pomi�dzy nimi10.
Pola Blob
Pola BLOB (Binary Large Objects) s�u�� do przechowywania danych binarnych, takich jak grafika, d�wi�k czy po prostu pliki. Ilo�� informacji przechowywanych w takim polu mo�e zmienia� si� dynamicznie - w samej kolumnie jest identyfikator pola. Natomiast dane znajduj� si� w innym miejscu bazy danych i podzielone s� na segmenty. Maksymalny rozmiar segmentu wynosi 32 kB. Definiuj�c pole BLOB, mo�na poda� jego podtyp, kt�ry umo�liwia okre�lenie charakteru przechowywanych danych.
Do dyspozycji u�ytkownika s�:
* typ 0 - dowolne dane binarne,
* typ l - tekst.
Pozosta�e typy - od 2 do 6 - s� zarezerwowane do wewn�trznego u�ytku InterBase. U�ytkownik mo�e w razie potrzeby zdefiniowa� w�asne podtypy, kt�re b�d� mia�y warto�ci ujemne. Aby zadeklarowa� pole BLOB nale�y u�y� konstrukcji:
<KOLUMNA> BLOB [SUB_TYPE n] [SEGMENT SIZE size]
np.:
Alter Table Test Add B BLOB SEGMENT SIZE 1024;
Jak wykorzysta� podtyp l, wyja�niono w cz�ci po�wi�conej typom znakowym. Poni�szy przyk�ad pokazuje, jak wczyta� plik do bazy danych:.
if OpenDialog1.Execute
then with IBTable1 do begin
Edit;
IBTable1Blob1.LoadFromFile(OpenDialog1.FIleName);
Post;
end;
end;
Je�li w pole Blob1 wczytamy bitmap� i pod��czymy do niego TDBImage, to b�dziemy mogli j� obejrze�11.
Tablice
InterBase umo�liwia tworzenie tablic danych. Deklarujemy je nast�puj�co:
<nazwa_pola> <nazwa_typu> [<rozmiar>|<min>:<max>]
np.:
Alter Table Test Add Tablica Integer[0:9];
Chc�c stworzy� tablic� wielowymiarow�, rozmiary kolejnych wymiar�w rozdzielamy przecinkami.
Nie b�dziemy tutaj porusza� g��biej tematu tablic z prostego powodu - w aktualnej wersji
IBX-y nie obs�uguj� tablic. Ta funkcja powinna zosta� dodana w Delphi 6. Pr�by z BDE tak�e skazane s� na niepowodzenie.
Domeny
W przypadku tworzenia bazy danych, w kt�rej tabele zawieraj� wiele takich samych kolumn, wygodnie jest zdefiniowa� domen�. Mo�na j� por�wna� do definicji w�asnego typu danych, z czym mamy do czynienia w innych j�zykach programowania. Sk�adnia polecenia tworz�cego domen� jest nast�puj�ca:
CREATE DOMAIN domain [AS] <typ>
[DEFAULT { wartosc | NULL | USER}]
[NOT NULL] [CHECK ( <warunek>)]
[COLLATE collation]:
Mo�na zdefiniowa� warunek, jaki b�d� musia�y spe�nia� wprowadzane dane. Sk�adnia klauzuli warunek jest nast�puj�ca:
<warunek> ={
VALUE <operator> <val>
| VALUE [NOT] BETWEEN <wartosc> AND <wartosc>
| VALUE [NOT] LIKE <wartosc> [ESCAPE <wartosc>]
| VALUE [NOT] IN (<wartosc> [ ... <wartosc> ...])
| VALUE IS [NOT] NULL
| VALUE [NOT] CONTAINING <wartosc>
| VALUE [NOT] STARTING [WITH] <wartosc>
|(<warunek>)
| NOT <warunek>
| <warunek> OR <warunek>
| <warunek> AND <warunek>
}
<operator> ={=|<|>|<=|>=|!<|!>|<>|!=}
Dla przyk�adu, zdefiniujmy kolumn� maj�c� przechowywa� informacje o p�ci:
create domain piec as char(1)
not null check (value in (�K�, 'M'))
Jako typ mo�na wybra� dowolny z wymienionych w tym rozdziale, tak�e tablice. Po zdefiniowaniu domeny kolumn� definiuje si� tak samo, jak ma to miejsce w przypadku ka�dego innego typu:
Alter table test add osoba plec;
W Delphi z takich kolumn korzysta si� tak samo, jak z kolumn typu typ.
Rozdzia� 2. O UDF-ach
Nieraz, gdy tworzymy jak�� baz� danych lub procedur� sk�adowan� okazuje si�, �e brakuje jakiej� potrzebnej funkcji po stronie bazy. Wtedy mo�emy przenie�� cz�� kodu do aplikacji u�ytkownika, ale lepszym rozwi�zaniem mog�oby by� rozbudowanie mo�liwo�ci serwera. Takie rozwi�zanie umo�liwiaj� nam UDF-y (User Defined Functions) w InterBase, a funkcje takie mo�na bez problemu napisa� w Delphi.
Od strony InterBase
Funkcje u�ytkownika deklarujemy w InterBase nast�puj�co:
DECLARE EXTERNAL FUNCTION <nazwa> [<typ_danych>| CSTRING (int)
[,<typ_danych> | CSTRING (int) ]]
RETURNS {datatype [BY VALUE] | CSTRING (int)} [FREE_IT]
ENTRY_POINT '<funkcja>'
MODULE_MAME '<modu�>'
Funkcji mo�na przekaza� maksymalnie 10 parametr�w -je�li jednym z nich ma by� BLOB, to 9. Parametry s� przekazywane do UDF-�w przez referencj�. Typ zmiennej przekazywanej do funkcji musi odpowiada� dok�adnie1 typowi danych dla j�zyka, w kt�rym jest ona pisana. Je�li np. do Delphi przekazywany jest typ DOUBLE PRECISSION, to w funkcji musi by� wykorzystany typ double.
W przypadku typ�w tekstowych, s� one przekazywane jako ci�gi znak�w zako�czone zerem. S�u�y do tego typ CSTRING, na kt�ry s� konwertowane typy CHAR i VARCHAR. CSTRING jest zgodny z PChar w Delphi.
Tak�e obs�ug� dat realizuje si� nieco inaczej. InterBase przechowuje informacj� o dacie w formie 64-bitowej liczby mapowanej na rekord TM zdefiniowany w pliku IBExternals.pas z pakietu IBX.
Programi�ci pisz�cy w j�zyku C na pewno rozpoznaj� poni�szy typ jako struktur� time_t:
TM = record
tm_sec : integer; // Sekundy
tm_min : integer; // Minuty
tm_hour : integer; // Godzina
tm_mday : integer; // Dzie� miesi�ca od l do 31
tm_mon : integer; // Miesi�c od O do 11
tm_year : integer; // Rok - 1900
tm_wday : integer; // Dzie� tygodnia od O-niedziela do 6-poniedzia�ek
tm_yday : integer; // Nr dnia w roku od O do 365
tm_isdst : integer;
end;
Zdefiniowany jest tak�e wska�nik na t� struktur�, jak PTM i struktura przechowuj�ca informacj� o dacie i o godzinie:
ISC_TIMESTAMP = record
timestamp_date : Long;
timestamp_time : ULong;
end;
Typy Long i ULong s� 32-bitowymi liczbami ca�kowitymi. InterBase przekazuj�c informacje o dacie, przekazuje zmienn� typu Long lub ULong lub zmienn� jako struktur� ISC_TIMESTAMP w przypadku TIMESTAMP. Typy te zdefiniowane s� w IB Header.pas. InterBase udost�pnia zestaw procedur s�u��cych do konwersji dat na wygodniejszy rekord TM:
isc_encode_timestamp(tm_date : PTM; ib_date : P ISC_TIMESTAMP)
isc_decode_timestamp(ib_date : PISC_TIMESTAMP; tm_date : PTM)
isc_decode_sql_date(var ib_date : Long; tm_date : PTM)
isc_encode_sql_date(tm_date: PTM; var ib_date: Long)
isc_decode_sql_time(var ib_date: ULong; tm_date: PTM)
isc_encode_sql_time(tm_date: PTM; var ib_date: ULong)
Procedury te s� zdefiniowane w bibliotece gds32.dll. Deklaracje nag��wk�w funkcji mo�na znale�� w module IBIntf.pas z pakietu IBX lub mo�na oczywi�cie zadeklarowa� je samodzielnie, np.:
procedur� isc_decode_sql_date (var ib_date: Longint; tm_date: PTM); stdcall;
external 'gds32.dll';
Standardowe rezultaty funkcji przekazywane s� przez referencj�, ale w przypadku typ�w numerycznych mo�e si� to odbywa� tak�e przez warto��. S�u�y do tego klauzula BY VALUE. Nale�y uwa�a� podczas przekazywania �a�cuch�w tekstowych, gdy� mo�e to prowadzi� do wyciek�w pami�ci. Je�li programista w jaki� spos�b sam o to nie zadba podczas pisania funkcji, to w trakcie deklaracji wyniku nale�y u�y� klauzuli FREE_IT.
Aby usun�� funkcj� z bazy, nale�y u�y� polecenia:
DROP LXTERNAL FUNCTION <nazwa>
UDF-y mo�na wywo�a� z dowolnego miejsca polecenia SQL-owego. Mo�na z nich korzysta� zar�wno w funkcjach przechowywanych na serwerze, jak i zapytaniach. Biblioteki DLL z funkcjami u�ytkownika nale�y umie�ci� w jednym z poni�szych katalog�w2:
* w podkatalogu UDFkatalogu domowego InterBase: interbase_home\UDF,
* w katalogu wymienionym w pliku ibconfig (Windows) lub isc_config (INIX) w zmiennej EXTERNAL_FUNCTION_DIRECTORY.
Od strony Delphi
UDF jest najzwyklejsz� funkcj� w bibliotece DLL. W Delphi z menu New nale�y wybra� opcj� dotycz�c� utworzenia nowej biblioteki DLL. Tworzenie funkcji przeanalizujemy na przyk�adzie.
Przyk�ad: Funkcja Silnia(Liczba)
Zadaniem funkcji b�dzie policzenie n!, gdzie n jest zadanym parametrem. Do projektu nale�y doda� modu� i zadeklarowa� w nim nast�puj�c� funkcj�:
function Silnia(var N : integer) : integer; cdecl; export:
Parametry przekazywane s� przez referencj� - st�d nale�y pami�ta� o s�owie kluczowym var. Wyj�tkiem jest PChar, kt�ry sam w sobie jest ju� wska�nikiem (do znaku). Cdecl okre�la spos�b przekazywania parametr�w - po szczeg�y warto zajrze� do pomocy Delphi. S�owo export m�wi nam, �e funkcja b�dzie eksportowana z biblioteki.
W kodzie �r�d�owym biblioteki projektu (menu Project/View Source) nale�y doda� klauzul� exports:
exports Silnia;
Niech funkcja silnia zostanie zdefiniowana nast�puj�co:
function Silnia(var N : integer) : integer; cdecl; export;
var
I : integer;
begin
Result := 1;
if N > l then
for I := l to N do
Result:= Result * I;
end;
Projekt nale�y skompilowa� i uzyskan� w ten spos�b bibliotek� umie�ci� w jednym z katalog�w wymienionych wy�ej.
Teraz powinni�my zadeklarowa� w InterBase korzystanie z funkcji biblioteki.
DECLARE EXTERNAL FUNCTION EF_SILNIA
INTEGER RETURNS INTEGER BY VALUE ENTRY_POINT 'Silnia' MODULE_NAME 'gawudf.dll':
Powy�sze polecenie mo�na wykona� z poziomu ISQL-a lub skryptu tworz�cego baz� danych. EF_SILNIA jest nazw�, pod jak� funkcja b�dzie widziana w bazie. I to w zasadzie wszystko - w ramach testu mo�na zastosowa� poni�sze zapytanie:
Select EF_Silnia(5) From RDBSDATABASE;
Oczekiwany wynik to oczywi�cie 120.
Bardziej uwa�ni musimy by� w trakcie tworzenia UDF-�w zwracaj�cych �a�cuchy znak�w. Istnieje wtedy ryzyko wyst�pienia wyciek�w pami�ci (memory leaks), poniewa� pami�� przydzielana przez jeden proces (biblioteka z funkcj�) nie jest nigdzie zwalniana. Mo�na do tego problemu podej�� na kilka sposob�w:
* Mo�na zwraca� wska�nik do zmiennej przechowuj�cej tablic� znak�w:
Wynik: array[0. .100] of char;
Function ZwrocWynik : PChar;
Begin
Result:= Wynik;
End;
Problem pojawia si� jednak w momencie wywo�ywania funkcji przy pracy z kilkoma po��czeniami. Wynik zawsze b�dzie wskazywa� na to samo miejsce w pami�ci i w czasie pracy kilku u�ytkownik�w �atwo mo�e doj�� do konfliktu interes�w - co b�dzie zawiera�a zmienna?
* Mo�na zmienn� Wynik zadeklarowa� jako zmienn� lokaln� w�tku (threadvar) i rozpoznawa� wtedy, kiedy InterBase tworzy i ko�czy w�tki. Wymaga to napisania cz�ci inicjuj�cej bibliotek� i funkcji wej�cia.
* Chyba najprostsz� metod� jest dynamiczne przydzielenie pami�ci dla tekstu i zwr�cenie go do InterBase. Do alokowania pami�ci zaleca si� korzystanie z funkcji ib_util 3_malloc z modu�u ib_utif. Funkcj� wykorzystuj�c� t� technik� nale�y koniecznie zadeklarowa� z klauzul� FREE_IT. Spowoduje to, �e odpowiedzialno�� za zwolnienie pami�ci przejmie InterBase. W starszych wersjach InterBase (przed 5.5) nale�a�o skorzysta� z malloc z biblioteki msvcrt.dll.
Ostatni spos�b zostanie pokazany na przyk�adzie funkcji zwracaj�cej fragment �a�cucha znak�w o zadanej d�ugo�ci od podanej pozycji.
Przyk�ad: Funkcja Substr1(Tekst, Od, ile)
Wymagan� funkcjonalno�� zapewnia w Delphi funkcja Copy. W funkcji b�dzie rezerwowane dok�adnie tyle pami�ci, ile potrzeba na przechowanie wyniku. Nie nale�y zapomina� o znaku ko�ca tekstu #0.
Funkcja Substr1 mo�e wygl�da� nast�puj�co:
function Substr1 (Tekst: PChar; var Od, ile : integer) : PChar;
var S : string;
begin
S:= Copy (Tekst, Od, Ile);
Result:= ib_util_malloc(Length(S) + 1);
StrCopy(Result, PChar(S));
end;
Do zadeklarowania funkcji w InterBase pos�u�y poni�sze polecenie:
DECLARE EXTERNAL FUNCTION F_SUBSTR1
CSTRING(64, INTEGER, INTEGER
RETURNS CSTRING(64) FREE_IT
ENTRY_POINT 'Substrl� MODULE_NAME 'gawudf.dll';
Jak wida�, jest to bardzo prosta metoda - programista korzystaj�cy z funkcji musi tylko pami�ta� o klauzuli FREE_IT.
Przyk�ad: Funkcja Year(Data)
Funkcja zwr�ci liczb� ca�kowit� b�d�c� numerem roku znajduj�cego si� w dacie przekazanej w parametrze. W Delphi funkcja b�dzie wygl�da�a nast�puj�co:
function Year(var ib_date: Long): Integer;
var tm_date: TM;
begin
isc_decode_sql_date(ib_date.PM(@tm_date));
result:= tm_date.tm_year + 1900;
end;
W bazie danych deklaracja wygl�da nast�puj�co:
DECLARE EXTERNAL FUNCTION F_YEAR
DATE
RETURNS INTEGER BY VALUE
ENTRY_POINT 'Year' MODULE_NAME 'gawudf.dll�:
Do przetestowania mo�e pos�u�y� nast�puj�ce zapytanie:
select f_Year(cast('7/11/00' as date)) from rdb$database
W rezultacie powinni�my otrzyma� 2000.
Rozdzia� 3. IBX - InterBase
Delphi umo�liwia dost�p do bazy danych na kilka sposob�w. S� to:
* ADO,
* BDE,
* IBX.
Pierwsze dwa korzystaj� ze sterownik�w dostarczanych do ka�dej bazy. Natomiast IBX oferuje rodzimy dost�p do InterBase, Daje to najwi�ksz� wydajno�� dost�pu i operacji na bazie kosztem przeno�no�ci oprogramowania. Poni�ej znajduje si� kr�tki opis komponent�w wraz z informacj� o mo�liwo�ci ich zastosowania.
W przypadku istotnych w�a�ciwo�ci s� one wymieniane tak�e w komponentach potomnych.
TIBDatabase, modu� IBDatabase.
Ten komponent jest odpowiedzialny za po��czenie z baz� danych. Wszystkie komponenty dziedzicz�ce po TIBCustomDataSet oraz TIBSQL wykorzystuj� TIBDatabase w celu uzyskania dost�pu do bazy danych. Jest on odpowiednikiem TDatabase z zak�adki Data Access.
Aby pod��czy� si� do bazy danych, nale�y we w�a�ciwo�ci Params ustawi� nast�puj�ce parametry:
* user_name - nazwa loguj�cego si� u�ytkownika,
* password - has�o u�ytkownika,
* sql_role_name - nazwa przywileju z jakim loguje si� u�ytkownik,
* lc_type - zestaw znak�w wykorzystywany przy po��czeniu.
Dla cel�w testowych mo�na te parametry ustawi� w �rodowisku Delphi dwukrotnie klikaj�c komponent. Na poziomie kodu parametry ustawia si� w Params, kt�ra jest typu TStringList. W celu nawi�zania po��czenia z baz� konieczne jest jeszcze ustawienie �cie�ki dost�pu we w�a�ciwo�ci DatabaseName. �cie�ka ta jest bezwzgl�dn� �cie�k� wskazuj�c� na plik z baz� danych. W przypadku zdalnego dost�pu do serwera z wykorzystaniem protoko�u TCP/IP, na pocz�tku �cie�ki nale�y poda� nazw� serwera i dwukropek, np.:
* dost�p lokalny: C:\Bazy\baza.gdb,
* dost�p zdalny: serwer: C:\Bazy\baza.gdb.
Pozosta�e w�a�ciwo�ci
Connected - okre�la czy pod��czenie do InterBase jest aktywne, czy nie. Zmiana Connected na True uaktywnia po��czenie, na False - powoduje od��czenie.
DefaultTransaction - domy�lna transakcja, z jak� b�d� odbywa� si� operacje na bazie danych, o ile nie okre�lono innej.
IdleTimer - czas w milisekundach, po jakim baza danych zostanie od��czona w przypadku, gdy po��czenie nie jest aktywne. Roz��czenie po tym czasie nie wywo�uje zdarze� OnAfterDisconnect i OnBeforeDisconnect.
LoginPrompt - okre�la czy ma si� pojawia� standartowe okienko logowania.
SQLDialect - zwraca dialekt SQL-a wykorzystywany przez klienta. Realnie nie mo�na skorzysta� z wi�kszego ni� dialekt bazy danych.
TraceFlags - umo�liwia wyb�r operacji, kt�re maj� by� �ledzone przy pomocy SQL Monitora w trakcie ich wykonywania.
Zdarzenia
OnAfterConnect, OnAfterDisconnect, OnBeforeConnect, OnBeforeDisconnect - s� to zdarzenia wywo�ywane odpowiednio po (przed) pod��czeniem (od��czeniem) od bazy danych.
OnDialectDowngradeWarning - zdarzenie wywo�ywane jest, je�li dialekt aplikacji jest ustawiony na wi�ksz� warto�� ni� dialekt bazy danych.
OnIdleTimer - je�li minie czas okre�lony w IdleTimer, wywo�ywane jest zdarzenie
OnIdleTimer.
OnLogin - wyst�puje w momencie pod��czenia do bazy danych. W parametrze Login Params przekazywane s� user_name i password pobrane z Params komponentu.
Ko�cz�c obs�ug� zdarzenia, nale�y w LoginParams ustawi�, w razie potrzeby, odpowiednie warto�ci tych parametr�w. Mo�na umie�ci� tutaj wywo�anie np. w�asnego okienka logowania. LoginPrompt musi by� ustawione na True.
Wa�ne metody
AddTransaction(TR: TIBTransaction) - pod��cza kolejny komponent transakcji do bazy danych.
ApplyUpdates(const DataSets: array of TDataSet) - jako parametr podajemy list� komponent�w potomnych TDataset. Metoda zapisuje zmiany z bufor�w do bazy danych. Wywo�anie tej metody ma znaczenie wtedy, gdy odpowiedni komponent zawieraj�cy dane1 ma ustawiona w�a�ciwo�� CachedUpdates na True,
CloseDataSets - zamyka wszystkie zbiory danych pod��czone do tego komponentu bez zako�czenia po��czenia z baz� danych.
CreateDatabase - tworzy baz� danych na podstawie parametr�w ustawionych w Params
i DatabaseName. Funkcjonalnie odpowiada to wykonaniu polecenia SQL-a Create Database
DropDatabase - usuwa ca�kowicie baz� danych z serwera.
FlndTransaction(TR: TIBTransaction): Integer - zwraca indeks transakcji TR pod��czonej do bazy danych.
ForceClose - wymusza zako�czenie po��czenia z baz� danych.
GetFieldNames(const TableName: string; List: TStrings) - dla zadanego pierwszego parametru TableName zwraca w List list� p�l dla danej tabeli.
GetTableNames(List: TStrings; SystemTables: Boolean = False) � zwraca w List list� tabel w bazie danych. Parametr SystemTables okre�la, czy maj� by� zwr�cone nazwy tabel systemowych2.
IndexOfDBConst(st: String): Integer - funkcja podaje jako rezultat indeks parametru okre�lonego jako st z listy Params. Je�li parametr nie jest znany, wynikiem jest -l.
RemoveTransaction(Idx: Integer) - od��cza komponent transakcji o podanym
indeksie od bazy danych.
RemoveTransactions - od��cza wszystkie transakcje od bazy danych.
TestConnected - zwraca True, je�li komponent jest po��czony z baz� danych. Je�li w�a�ciwo�� Connected jest ustawiona na True, to nast�puje pr�ba pobrania informacji z serwera, aby sprawdzi� aktywno�� po��czenia.
Komentarz
Komponent TIBDatabase powinien by� wykorzystywany pojedynczo na ka�de niezb�dne po��czenie z baz� danych. Ze wzgl�du na raczej globalny (dla aplikacji) charakter TIBDatabase, najlepiej jest umie�ci� go w module zawieraj�cym dane3. Dobrze jest podobnie post�pi� z domy�ln� transakcj� dla bazy danych - umie�ci� jaw globalnie dost�pnym module.
TIBTransaction, modu� IBDatabase
Komponent ten pozwala na kontrolowanie transakcji w jednej lub wi�cej bazach danych. Nie ma on swojego odpowiednika w komponentach opartych na BDE. Wszystkie komponenty pracuj�ce na danych musz� wykorzystywa� TIBTransaction. Je�li nie b�d� mia�y okre�lonej swojej transakcji, to b�d� korzysta�y z tej, kt�ra jest ustawiona jako DefaultTransaction komponentu TIBDatabase, InterBase pozwala na wygodne przeprowadzanie kilku transakcji w ramach pojedynczego po��czenia.
W�a�ciwo�ci
Active - okre�la czy transakcja jest aktywna i pozwala na zmian� jej stanu.
DatabaseCount - przechowuje liczb� baz danych bior�cych udzia� w transakcji.
Databases - zwraca baz� danych (TIBDatabase) o zadanym indeksie zwi�zan� z danym komponentem.
DefaultAction - okre�la akcj� wykonywan�, gdy sko�czy si� czas przeznaczony na transakcj� okre�lony w IdleTimer. Mo�liwo�ci s� nast�puj�ce:
* taRollback - cofa transakcj�,
* taCommit - zatwierdza transakcj� (domy�lne),
* taRollbackRetaining - cofa transakcj� z zachowaniem kontekstu,
* taCommitRetaining - zatwierdza transakcj� z zachowaniem jej kontekstu.
DefaultDatabase - pozwala na ustawienie b�d� pobranie domy�lnej bazy danych zwi�zanej z transakcj�.
IdleTimer - okre�la czas bezczynno�ci, po jakim transakcja powinna automatycznie wykona� domy�ln� akcj� (zapisanie b�d� cofni�cie zmian) ustawion� w DefaultAction.
InTransaction - zwraca informacj�, czy transakcja jest w trakcie wykonywania. Stan w�a�ciwo�ci zmienia na True wywo�anie metody StartTransaction, natomiast wywo�anie Commit b�d� Rollback przestawia go na False.
Params - lista parametr�w transakcji. Tutaj nale�y ustawi� poziom izolowania transakcji, kt�ry mo�e by� nast�puj�cy:
* Snapshot - pozwala na odczyt z bazy danych bez prawa zapisu w kontek�cie danej transakcji,
* ReadCominitted - umo�liwia transakcji odczyt zmian zatwierdzonych przez inne transakcje. Nie zatwierdzone zmiany pozostaj� niewidoczne.
Zdarzenia
OnIdleTimer - zdarzenie wywo�ywane po tym, gdy czas bezczynno�ci transakcji przekroczy czas ustawiony w IdleTimer.
Wa�ne metody
AddDatabase(db: TIBDatabase) - dodaje do transakcji po��czenie z baz� danych.
Commit - wykonuje zatwierdzenie i zako�czenie transakcji. Wszelkie zmiany w rekordach, nowe rekordy i rekordy skasowane od momentu wywo�ania StartTransaction zostaj� zapisane na sta�e w bazie danych. Przed wywo�aniem Commit dobrze jest sprawdzi� przy pomocy InTransaction, czy transakcja jest w toku. Je�li nie jest, to Commit zg�osi wyj�tek.
CommitRetaining - zatwierdza transakcj� i zachowuje jej kontekst. Funkcjonalnie wygl�da to na zatwierdzenie i nie zamkni�cie zbioru danych. Z CommitRetaining nale�y korzysta� z rozwag�, gdy� zwi�ksza si� ilo�� pami�ci u�ywanej na serwerze.
FindDatabase(db: TIBDatabase): Integer - zwraca numer indeksu bazy danych podanej jako parametr.
RemoveDatabase (Idx: Integer) - od��cza od transakcji baz� danych o podanym numerze.
RemoveDatabases - od��cza wszystkie bazy danych od transakcji.
Rollback - cofa wszelkie zmiany wykonane w bazie danych od momentu wywo�ania StartTransaction. Przed wywo�aniem Rollback dobrze jest sprawdzi� stan transakcji przy pomocy InTransaction. Je�li transakcja nie jest w toku, to wywo�anie Rollback zg�osi wyj�tek.
RollbackRetaining - cofa wszelkie zmiany wykonane w bazie danych od momentu wywo�ania StartTransaction z zachowaniem kontekstu transakcji.
StartTransaction - rozpoczyna now� transakcj� na serwerze. Je�li transakcja jest ju� w toku, to wywo�anie tej metody zg�osi wyj�tek.
Komentarz
W przypadku TIBTransaction, wygodnie jest umie�ci� komponent odpowiedzialny za domy sin� transakcj� w tym samym module co g��wny komponent TIBDatabase. W przypadku pozosta�ych, najlepiej jest umie�ci� je razem z komponentami TIBQuery itp. Umieszczaj�c je razem na jednym formularzu b�d� w ramce4, mo�na stworzy� repozytorium �atwe do wykorzystania.
Rozpocz�ciu modyfikacji danych powinno towarzyszy� rozpocz�cie transakcji np.:
TForml.ButtonDeleteClIcktSender: TObject);
Begin
with IBTransaction1 do
if not InTransaction then
StartTransaction;
IBTable1.Delete;
end.
Daj�c u�ytkownikowi do dyspozycji przycisk Zapisz zmiany, wystarczy wywo�a� metod� Commit dla transakcji.
Pisz�c aplikacje wykorzystuj�ce technologi� MIDAS, nale�y do ka�dego zapytania wykorzystywa� osobn� transakcj�.
TIBStoredProc, modu� IBStoredProc
Ten komponent pozwala na wykorzystanie procedur sk�adowanych w bazie danych. Idealnie nadaje si� do obs�ugi procedur wywo�ywanych przez Execute. W przypadku tych procedur, kt�re zwracaj� zbiory danych (Select), nale�y skorzysta� z TIBQuery lub TIBDataSet. Parametry przekazywane do procedury i zwracane przez ni� wymienia si� we w�a�ciwo�ci Params.
W�a�ciwo�ci
Database - okre�la komponent bazy danych zawieraj�cy procedur�.
ParamCount - zwraca liczb� parametr�w procedury.
Params - przechowuje parametry wej�ciowe i wyj�ciowe procedury. Nale�y z niej skorzysta� wtedy, gdy chcemy ustawi� warto�ci wej�ciowe. Po wywo�aniu ExecProc, w razie potrzeby mo�na z niej pobra� warto�ci parametr�w wyj�ciowych.
Prepared - okre�la czy procedura jest przygotowana, czy nie. Procedura musi by� przygotowana przed jej wykonaniem. InterBase automatycznie wykonuje operacj� przygotowania, je�li programista sam tego nie zrobi�. Dobr� praktyk� jest samodzielne wywo�ywanie metod Prepare i Unprepare. Przestawiaj� one w�a�ciwo�� Prepared w odpowiedni stan.
StoredProcedureNames - przechowuje list� procedur sk�adowanych na serwerze jako TStringList.
StoredProcName - nazwa procedury zwi�zanej z tym komponentem. Je�li nazwa nie odpowiada �adnej z procedur dost�pnych w bazie danych, to przed jej wykonaniem zostanie zg�oszony wyj�tek.
Transaction - wskazuje na komponent transakcji wykorzystywany przez procedur�.
Zdarzenia
AfterDatabaseDisconnect - zdarzenie wywo�ywane po roz��czeniu z baz� danych
AfterTransactionEnd - zdarzenie wywo�ywane po zako�czeniu transakcji zwi�zanej z procedur�.
BeforeDatabaseDisconnect - zdarzenie wywo�ywane tu� przed roz��czeniem z baz� danych.
BeforeTransactionEnd - zdarzenie wywo�ywane tu� przed zako�czeniem transakcji zwi�zanej z procedur�,
DatabaseFree - zdarzenie wywo�ywane po tym, gdy baza danych zostanie usuni�ta z pami�ci.
TransactionFree - zdarzenie wywo�ywane po tym, gdy transakcja zostanie zwolniona z pami�ci.
Wa�ne metody
CopyParams(Value: TParams) - kopiuje parametry mi�dzy zmiennymi typu TParams. Mo�e by� wykorzystywana do kopiowania warto�ci parametr�w pomi�dzy procedurami.
ExecProc - wykonuje procedur� sk�adowan� na serwerze. Przed wywo�aniem metody nale�y ustawi� wymagane parametry wej�ciowe przy pomocy w�a�ciwo�ci Params i wywo�a� metod� Prepare. Po wywo�aniu ExecProc parametry wyj�ciowe (je�li s�) mo�na odczyta� z Params. W�a�ciwo�ci dost�pne s� wed�ug kolejnych numer�w b�d� przy pomocy funkcji ParamByName.
ParamByName(const Value: string): TParam - zwraca parametr o zadanej nazwie. Aby uzyska� dost�p do warto�ci parametru, nale�y skorzysta� z AsInteger, AsString itp.
Prepare - przygotowuje procedur� do wykonania. Wywo�anie tej metody spowoduje zwi�zanie parametr�w procedury i nast�pnie alokacj� zasob�w na serwerze. Pozwala to na zoptymalizowanie wykonywanych operacji.
Unprepare - zwalnia zasoby zaalokowane na serwerze i kliencie podczas przygotowania procedury.
TIBTable, modu� IBTable
Ten komponent pozwala na uzyskanie dost�pu do pojedynczej tabeli b�d� perspektywy. Funkcjonalnie odpowiada to zastosowaniu zapytania Select * From <nazwa>. Zestaw rekord�w mo�na ograniczy� wykorzystuj�c filtry (w�a�ciwo�ci Filter i Filtered lub zdarzenie OnFilterRecord). Poniewa� TIBTable jest ma�o elastyczne, lepiej jest pracowa� z TIBQuery lub TIBDataset.
W�a�ciwo�ci
Active - jak to jest w przypadku wszystkich zbior�w rekord�w, okre�la czy jest on otwarty.
BufferChunks - okre�la warto��, o jak� b�dzie zwi�kszany bufor (w liczbie wierszy). Dotyczy trybu CachedUpdates.
CachedUpdates - umo�liwia w��czenie trybu CachedUpdates (buforowane uaktualnienia). Je�li ten tryb pracy jest w��czony, to wszystkie modyfikacje wierszy, kasowanie i wstawianie odbywaj� si� w buforze po stronie aplikacji klienta. Po zako�czeniu pracy wszystkie zmiany mog� zosta� wys�ane na serwer w ramach jednej transakcji.
Constraints - opis wi�z�w integralno�ci na poziomie rekordu. Tutaj mo�na utworzy� wi�zy bazuj�ce na warto�ciach kilku p�l. W razie wyst�pienia potrzeby wykorzystania wi�z�w na poziomie pojedynczej kolumny, nale�y je stworzy� w odpowiednim komponencie TField.
DefaultIndex - pokazuje czy po otwarciu tabeli wiersze maj� by� posortowane przy u�yciu domy�lnego indeksu, czy nie. Domy�lnie jest ustawiona warto�� True - w zapytaniu b�dzie dodana klauzula ORDER BY po kluczu g��wnym.
Exists - ta w�a�ciwo�� decyduje czy dana tabela istnieje w bazie danych. Je�li jest False, to na podstawie definicji p�l zawartych w FieldsDef metoda Create Table utworzy tabel�.
Filter - przechowuje warunek okre�laj�cy, kt�re wiersze maj� znale�� si� w zbiorze danych. Sk�adnia dla tego warunku jest bardzo podobna do wyra�enia wyst�puj�cego w klauzuli WHERE, Mo�na korzysta� ze znak�w specjalnych SQL-a, takich jak '%' czy '_' przy korzystaniu z warunku LIKE, np.
Filter := 'Country Like "P*" ';
Chc�c sprawdza� warto�ci na okoliczno�� wyst�pienia warto�ci NULL, nale�y skorzysta� z IS:
Filter := 'Country IS NOT NULL�;
Filtered - okre�la czy filtr jest aktywny. Prze��cza stan korzystania z filtru we w�a�ciwo�ci Filtered i obs�udze zdarzenia OnFilterRecord.
ForcedRefresh - okre�la czy dane maj� by� od�wie�one po wykonaniu zapisu (metoda Post), czy nie.
IndexDefs -przechowuje informacje o definicjach indeks�w tabeli w formie tablicy. IndexFieldCount - liczba p�l sk�adaj�cych si� na obecny klucz.
IndexFieldNames - przechowuje list� p�l, kt�re maj� by� wykorzystane przez indeks. Nazwy p�l rozdzielane s� �rednikami. Ustawienie tej w�a�ciwo�ci czy�ci Index Name.
IndexFields - pozwala na odczyt lub ustawienie p�l wykorzystywanych w kluczu. Tablica przechowuje komponenty typu TField.
IndexName - okre�la indeks wykorzystywany w tabeli. Je�li w�a�ciwo�� nie jest zdefiniowana, to do okre�lenia sortowania wierszy wykorzystywany jest klucz g��wny.
MasterFields - przechowuje list� p�l z tabeli nadrz�dnej wykorzystywanych przy tworzeniu relacji master-detail mi�dzy tabelami. T� w�a�ciwo�� nale�y zdefiniowa� po wype�nieniu MasterSource.
MasterSource - przechowuje DataSource zwi�zan� z tabel� nadrz�dn� przy korzystaniu z relacji master-detail.
ReadOnly - okre�la czy tabela ma zosta� otwarta w trybie tylko do odczytu.
StoredDefs - ustawiona na True oznacza, �e definicje p�l z FieldDefs i indeks�w z IndexDefs wype�nione przy projektowaniu aplikacji maj� zosta� zapisane razem z modu�em b�d� form�. Pozwoli to na tworzenie tabeli w bazie danych przez proste wywo�anie metody CreateTable.
TableName - przechowuje nazw� tabeli lub perspektywy reprezentowanej przez ten komponent.
TableNames - przechowuje list� tabel i perspektyw dost�pnych w bazie danych.
UniDirectional - okre�la czy dla danej tabeli uaktywnione s� kursory dwukierunkowe. Je�li w�a�ciwo�� ma warto�� True, to mo�liwe jest poruszanie si� po zbiorze danych w dw�ch kierunkach.
UpdateObject - przechowuje wska�nik do komponentu typu TIBUpdateSQL. Ten komponent pozwali na aktualizowanie danych, kt�re s� zwracane jako tylko do odczytu, lub w trybie CachedUpdates.
Zdarzenia
W komponencie TIBTable wprowadzane s� te same zdarzenia, kt�re zosta�y wymienione podczas omawiania komponentu TIBStoredProc. Poza tym komponent ten dziedziczy standartowe zdarzenia komponentu TDataset.
Wa�ne metody
AddIndex(const Name, Fields: string; Options: TIndexOptions const DescFields: string = ' ') - tworzy nowy indeks o podanej nazwie. Na klucz sk�adaj� si� pola z Fields porozdzielane �rednikami. Opcje okre�laj� czy indeks ma utworzy� klucz g��wny (ixPrimary), czy unikalny (ixUnique).
CreateTable - tworzy now� tabel� w bazie danych na podstawie informacji zawartych w FleldDefs i IndexDefs.
Deletelndex(const Name: string) - kasuje indeks o podanej nazwie.
DeleteTable - usuwa tabel� ze wszystkimi danymi z bazy. Tabela musi by� zamkni�ta.
EmptyTable - usuwa wszystkie wiersze z tabeli (je�li u�ytkownik posiada odpowiednie uprawnienia).
GetIndexNames(List: TStrings) - zwraca list� nazw indeks�w tabeli.
GotoCurrent(Tble: TIBTable) - synchronizuje pozycj� bie��cego rekordu tabeli z rekordem z tabeli podanej jako parametr. Warto�ci w�a�ciwo�ci Database i TableName dla obu komponent�w powinny by� identyczne, w przeciwnym razie zostanie zg�oszony wyj�tek. Metoda mo�e by� u�yteczna w sytuacji, gdy w aplikacji s� dwa komponenty odwo�uj�ce si� do tej samej tabeli.
TIBQuery, modu� IBQuery
TIBQuery jest funkcjonalnym odpowiednikiem komponentu TQuery. Wykonuje on zapytanie SQL-a przechowywane we w�a�ciwo�ci SQL. Mog� by� to zapytania zwracaj�ce dane (SELECT) lub modyfikuj�ce tabel� (DELETE, INSERT, UPDATE). Wy�szo�� tego komponentu nad TIBTable polega na mo�liwo�ci uzyskania dost�pu do kilku tabel z jednego zapytania (z��czenia) i automatycznego dodania warunk�w ograniczaj�cych liczb� zwracanych wierszy i kolumn.
W�a�ciwo�ci
Active - okre�la czy zapytanie jest otwarte (aktywne).
BufferChunks - okre�la warto��, o jak� b�dzie zwi�kszany bufor (w liczbie wierszy). Dotyczy pracy w trybie CachedUpdates.
CachedUpdates - pozwala na w��czenie trybu CachedUpdates (buforowane uaktualnienia). Je�li ten tryb pracy jest w��czony, to wszystkie modyfikacje wierszy, kasowanie i wstawianie odbywaj� si� w buforze po stronie aplikacji klienta. Po zako�czeniu pracy wszystkie zmiany mog� zosta� wys�ane na serwer w ramach jednej transakcji.
Constraints - opis wi�z�w integralno�ci na poziomie rekordu. Tutaj mo�na utworzy� wi�zy bazuj�ce