Witam. Czas na drugi art dotyczący DirectSQL.
W tej części dowiemy się jak wykonać zapytanie do bazy i co najważniejsze jak obsłużyć oraz wyświetlić wynik otrzymany z bazy danych.
Zakładam że:
– zaznajomiłeś się z pierwszą częścią kursu
– umiesz używać StringGrid’a w Delphi
Potrzebujemy:
– źródła z załącznika z pierwszego arta
– kilka przycisków na formatce
– komponent StringGrid na formie
Przed przystąpieniem do właściwej części tej części kursu chciałbym zademonstrować kilka przydatnych operacji dotyczących komunikacji z serwerem baz danych.
Będę po krótko opisywał funkcje oraz podawał przykładowy kod przycisku, który ją wykorzystuje.
1) Reset połączenia – Reconnect – przydatne, gdy z jakiś powodów nagle stracimy połączenie z serwerem lub połączenie zaczyna działać nie stabilnie ( czas wykonywania zapytań wydłuża się). Reconnect jest funkcją analogiczną do Connect tzn.: zwraca TRUE przy bezproblemowym resecie połączenia lub FALSE podczas wystąpienia błędów.
1 2 3 4 5 6 7 8 9 10 11 |
begin if MySQLClient.reconnect then Memo1.Lines.Add (' Reset połączenia udany:) ') else Memo1.Lines.Add ( 'Wystąpił błąd przy ponownym podłączaniu: '+MySQLClient.LastError); end; |
2) Ping – szybkie sprawdzenie stanu połączenia. Podobnie jak przy „pingowaniu” komputerów w sieci. Jeśli ping działa połączenie jest aktywne. Zwraca TRUE lub FALSE.
1 2 3 4 5 6 7 8 9 10 11 |
begin if MySQLClient.ping then Memo1.Lines.Add ( 'Ping: OK' ) else Memo1.Lines.Add ( 'Błąd przy Pingu: ' + MySQLClient.LastError ); end; |
3) Stat – służy do wyświetlania statystyki serwera zawierającej np.: średnią ilość wykonywanych zapytań na sekunde, ilość zadanych zapytań, ilość połączeń itp.
1 2 3 4 5 |
begin Memo1.Lines.Add ('Stat: '+MySQLClient.stat); end; |
Ok., teraz czas na pierwsze operacje na serwerze dotyczące baz danych.
1) Create_db (nazwa : string) – funkcja tworząca nową bazę danych na serwerze. Jeśli zwraca TRUE oznacza to, że baza została utworzona w przeciwnym wypadku FALSE
1 2 3 4 5 6 7 8 9 10 11 |
begin if MySQLClient.create_db( ‘DirectSQL’ ) then Memo1.Lines.Add ('Baza utworzona') else Memo1.Lines.Add ('Błąd przy tworzeniu nowej bazy: '+MySQLClient.LastError); end; |
2) drop_db (nazwa : string) – funkcja usuwająca bazę danych na serwerze. Jeśli zwraca TRUE oznacza to, że baza została usunięta, w razie problemów zwraca FALSE
1 2 3 4 5 6 7 8 9 10 11 |
begin if MySQLClient.drop_db( ‘DirectSQL’ ) then Memo1.Lines.Add ('Baza skasowana') else Memo1.Lines.Add ('Błąd przy usuwaniu bazy: '+MySQLClient.LastError); end; |
3) Select_db(nazwa : string) – funkcja pozwalająca na zmianę bazy na której operujemy. Jeśli zwraca TRUE oznacza to, że baza została zmieniona w przeciwnym wypadku FALSE
1 2 3 4 5 6 7 8 9 10 11 |
begin if MySQLClient.select_db( ‘DirectSQL’ ) then Memo1.Lines.Add ('Baza wybrana') else Memo1.Lines.Add ('Błąd przy zmianie bazy: '+MySQLClient.LastError); end; |
W tym momencie umiemy tworzyć bazy danych, usuwać je oraz zmieniać. Czas wykonywanie poleceń i obsługa wyników.
1) Jak wygląda sprawa z zapytaniami?? Bardzo prosto, co ilustruje poniższy kod. Na początku sprawdzamy (kontrolnie) czy obiekt, pod który będziemy podstawiać rezultat istnieje. Następnie kontrola stanu serwera, jeśli można wykonać zapytanie wykonujemy go funkcją Query.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
var q: string; ex: boolean; begin if assigned(MySQLResult) then begin if MySQLClient.Status<>MYSQL_STATUS_READY then Memo1.Lines.Add ('Serwer zajęty!'); FreeAndNil(MySQLResult); end; MySQLResult := MySQLClient.query( 'Select * from user' , true, ex); if assigned(MySQLResult) then Memo1.Lines.Add ('Zapytanie utworzone') else Memo1.Lines.Add ('Błąd zapytania: '+MySQLClient.LastError); end; |
Powyższą procedurę można skrócić do jednej linijki a mianowicie:
MySQLResult := MySQLClient.query( 'Select * from user’ , true, ex);
Jednak chcąc utworzyć coś większego opartego na więcej niż jednej tabeli oraz na serwerze zdalnym należy zastosować funkcje kontrolne dla pewności wykonania zapytania.
2) Skoro już mamy wynik naszego zapytania to czas na wyświetlenie zdobytych informacji
Kod poniżej jest odpowiedzialny za wyświetlenie wyniku zapytania w komponencie StringGrid. Jak możemy zauważyć mamy dostęp nie tylko do wyników samego zapytania ale także do wszelkich danych o kolumnie w tabeli z której pobieramy dane. W kodzie poniżej wykorzystałem tylko jedną z danych o kolumnie tj.: jej nazwa. Poza tym mamy dostęp do typu, rozmiaru i innych ciekawych informacji.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
var i : integer; MySQLField : TMysql_FieldDef; begin if assigned(MySQLResult) then begin StringGrid1.RowCount := MySQLResult.FieldsCount+1; for i:=0 to MySQLResult.FieldsCount-1 do begin MySQLField:=MySQLResult.FieldDef(i)^; StringGrid1.Cells[0,i+1]:=MySQLField.Name; StringGrid1.Cells[1,i+1] := MySQLResult.FieldValue( i ); end; end; end; |
Teraz jesteś już gotowy na tworzenie aplikacji bazodanowych nie wykorzystując żadnych komponentów. Oczywiście to, co przedstawiłem stanowi jedynie podstawy do dalszego rozwoju oraz pogłębiania wiedzy dotyczącej DirectSQL.
Mam nadzieje, że te artykuły były dla Was przydatne.
POZDRAWIAM
GOOFYX
Autor: Goofyx