MySQLDatabases/sk

From Lazarus wiki

Deutsch (de) English (en) français (fr) 日本語 (ja) slovenčina (sk)

Úvod

V článku Database tutorial sme videli prvý pokus na spojenie s MySQL serverom. V tejto chvíli sme nepoužili žiadne komponenty, ani vizuálne, ani nevizuálne. Táto stránka si kladie za cieľ vysvetliť pripojenie k MySQL serveru (snáď) jednoduchším spôsobom.

Dostupné komponenty

SQLdb komponenty

Iná možnosť je inštalácia balíčka umiestneného v adresári $Lazarus/components/sqldb. Tu môžete vidieť balík nazvaný sqldblaz.lpk. Potrbeujete nainštalovať tento balíček a mysql4connlaz.lpk z adresára $Lazarus/components/sqldb/mysql. Prvý z nich obsahuje niekoľko všeobecných komponentov vhodných pre všetky databázy. Sú to komponenty TSQLTransaction a TSQLQuery a môžete ich nájsť na novom tabe nazvanom SQLdb. Po inštalácii mysql4connlaz.lpk uvidíte v tomto tabe taktiež ďalší komponent nazvaný TMySQLConnection (s nakresleným delfínom).

Pokiaľ nemôžete nájsť adresár $Lazarus/components/sqldb/mysql a balík mysql4connlaz.lpk, znamená to, že používate novšiu verziu, v ktorej je mysql4connlaz.lpk spojený s sqldblaz.lpk. je to v poriadku, keď nainštalujete sqldblaz.lpk, získate všetky spomenuté komponenty v jednom tabe lišty komponentov.

Pokiaľ neviete, ako nainštalovať komponenty/balíčky, pozrite sa na túto stránku, kde nájdete "Inštalačné Howto". Nakoľko sú SQLdb všeobecné a môžu byť tak použité aj s inými dtaabázami jednoduchým vymenením TMySQLCOnnection za inštanciu TIBConnection, vyvinieme si program používajúci SQLdb komponenty.

Popis použitých komponentov

TMySQLConnection

TMySQLConnection sa používa na uloženie parametrov potrebných na pripojenie k databázovému serveru. Umožňuje nastaviť host, užívateľa a heslo, ktoré sa majú použiť pri pripájaní. Iná vlastnosť TMySQLConnection označuje databázu, ktorú chcete použiť. 'LoginPrompt' v súčasnosti nie je funkčný, takže sa pred pripájaním ka serveru uistite, že názov stroja vo vlasnosti 'HostName' spolu s užívateľským menom ('UserName') a heslom ('Password') pre databázu určenú vo vlastnosti 'DatabaseName' majú správne hodnoty. Taktiež sa uistite, že máte nastavenú TSQLTransaction a pripojte ju do vašej MySQLConnection (cez vlastnosť 'Transaction'), inak nebudete môcť otvoriť SQLQuery.

Poznámka. V poslednej SVN verzii Lazara nájdete 3 komponenty MySQLConnection. Sú to: TMySQL40Connection, TMySQL41Connection a TMySQL50Connection. Používajte správnu verziu na pripájanie k vášmu MySQl serveru. Čiže ak máte MySQL 4.1, použite TMySQL41Connection.

TSQLTransaction

SQLTransaction sa používa pre určité vnútorné housekeeping. SQLTransaction je automaticky aktivovaná, keď otvoríte dataset, ktorý ju používa. Uzatvorenie spojenie taktiež deaktivuje príslušné transakcie a uzatvorí všetky datasety, ktoré ich využívali.

TSQLQuery

TSQLQuery sa požíva na vykonávanie SQL dotazov na server. Môžete získavať dáta nastavením vlastnosti SQL na nejaký príkaz SELECT a zavoalním metódy Open. Pri použití príkazu INSERT, DELETE alebo UPDATE môžete s dátami manipulovať. V poslednom prípade by ste nemali používať metódu Open,a le namiesto nej metódu ExecSQL.

TDataSource

Datasource je akýmsi mostom poskytujúcim spojenie medzi viditeľnými komponentami ako sú DBEdit, DBGrid atď. a datasetom. Umožňuje týmto komponentom zobrazovať dáta získané databázy. Datasource môže byť v jednej chvíli pripojený iba k jedinému datasetu, avšak samotný datasource môže byť využívaný viacerými komponentami na prácu s dátami.

TDBGrid

DBGrid môže byť použitý na prezentovanie dát získaných od datasetu. DBGrid sa k datasetu pripája cez datasource. Keď je dataset otvorená, DBgrid bude automaticky zobrazovať údaje z databázy.

Náš program

Základy

Pokúsime sa vytvoriť program, ktorý je založený na jednom už urobenom tu (holandsky) a ten bol postavený na základoch iného (anglicky) od Chrisa.

Hlavný formulár

Použijeme rovnaké hlavné okno a celú funkcionalitu postavím kompletne od nuly :) Ako uvidíte, budem s tým mať o mnoho menej roboty, pretože komponenty skutočne za nás urobia všetku ťažkú prácu! Takže, začnime vytvorením okna ako je toto:
Trymysql.png
Z tabu SQLdb umiestnite na formulár TMySQLConnection, TSQLTransaction a TSQLQuery Components.png. Nemeňte default mená týchto komponentov. Okrem Connection komponentu. Aby bol tento článok rovnaký pre všetky verzie MySQL, pomenujte váš MySQL??Connection komponent: MySQLConnection1. Teraz musíme tieto komponenty prepojiť, aby mohli robiť svoju prácu. Musia byť nastavené nasledujúce vlastnosti:

Component Property Value
MySQLConnection1 Transaction SQLTransaction1
SQLTransaction1 Database MySQLConnection1
SQLQuery1 Database MySQLConnection1
SQLQuery1 Transaction SQLTransaction1

Vlastnosť Transaction pre SQLQuery1 bude nastavená automaticky, ak ste už predtým nastavili vlastnosť Transaction pre MySQLConnection1. Keď tak urobíte, všimnite si, že SQLTransaction1.Database bola nastavená na MySQLConnection1.

Ako som povedal skôr: uistite sa, že používate správny komponent na pripájanie k vašej verzii MySQL servera.

Kód

Ako môžete vidieť na obrázku, jediné prístupné tlačidlá po štarte programu sú "Connect to server" ("Pripojiť k serveru") a "Exit" ("Koniec"). Aby boli sprístupnené aj ostatné tlačidlá, potrebujeme viac informácií, takže nateraz nie je umožnené na ne klikať. Mohli by sme sa tiež rozhodnúť zneprístupniť aj tlačidlo "Connect to server", pokiaľ neboli dané informácie o hoste, užívateľovi a hesle. Ale to som sa rozhodol nerobiť, nakoľko náš užívateľ si môže pomyslieť: "Nič tu nefunguje, tak stlačím "exit" :-)

Predtým, ako Vám ukážem nejaký kód, rád by som zdôraznil, že v kóde by sa malo viac manipulovať s výnimkami. Kritické sekcie by mali byť umiestnené v konštrukciách:

try ... finally

alebo

try ... except


Pripojenie k serveru

Prvá vec, ktorú by sme maliurobiť, je spojiť sa so serverom. Keďže pri pripájaní nevieme, aké databázy sú na serveri, vypýtame si pri pripájaní zoznam databáz. Je tu však jeden háčik. Aby sme sa mohli pripojiť, vlastnosť DatabaseName komponentu MySQLConnection musí obsahovať platné meno databázy. V kóde uvidíte, že ja používam databázu nazvanú "mysql". Túto databázu používa mysql server pre riadenie svojej činnosti (napríklad obsahuje tabuľky definujúce prístupové práva jednotlivých užívateľov), takže sa na serveri určite nachádza.

procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
begin
  // Overíme si, či máme aktívne pripojenie. Ak áno, zavrieme ho.
  if MySQLConnection1.Connected then CloseConnection(Sender);
  // Nastavíme parametre pre pripojenie
  MySQLConnection1.HostName := HostEdit.Text;
  MySQLConnection1.UserName := UserEdit.Text;
  MySQLConnection1.Password := PasswdEdit.Text;
  MySQLConnection1.DatabaseName := 'mysql'; // Táto databáza sa na serveri nachádza vždy!
  ShowString('Opening a connection to server: ' + HostEdit.Text);
  MySQLConnection1.Open;
  // Najskôr získame zoznam dostupných databáz
  if MySQLConnection1.Connected then begin
    ShowString('Connected to server: ' + HostEdit.Text);
    ShowString('Retrieving list of available databases.');
    SQLQuery1.SQL.Text := 'show databases';
    SQLQuery1.Open;
    while not SQLQuery1.EOF do begin
      DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
      SQLQuery1.Next;
    end;
    SQLQuery1.Close;
    ShowString('List of databases received!');
  end;
end;

Prvú vec, ktorú robíme, je overenie, či sme pripojení k serveru. Ak áno, zavoláme privátnu metódu "CloseConnection". Táto metóda vykoná určité potrebné "udržiavacie práce", ako zneprístupnenie tlačidiel, vyčistenie comboboxov a listboxov. Potom nastavíme nevyhnutné parametre na pripojenie k serveru.

V našom programe môžete vidieť metódu ShowString. Táto pridáva do mema v našom formulári riadok, ktorý slúži ako log.

S nastavenými parametrami sa môžeme pripojiť na server. Urobíme to volaním:

MySQLConnection1.Open;

V skutočnej aplikácii by každý správny programátor umiestnil do bloku so správou výnimiek, aby prípadne mohol užívateľovi vypísať nejaké pekné chybové správy o zlyhaní pripojenia. Keď sme už pripojení, radi by sme získali zoznam dostupných databáz na serveri. Na získavanie dát od servera sa používa TSQLQuery. Do vlastnosti SQL sa vloží dotaz odosielaný na server. MySQL používa príkaz "SHOW DATABASES" na zobrazenie zoznamu databáz. Takže, keď sme nastavili SQL.text, zavoláme:

SQLQuery1.Open;

V pripade, ze pouzivame MySQL5 je nutno mit nastaveno, jinak program vraci hlasku se spatnou syntaxi:

SQLQuery1.ParseSQL:=false; SQLQuery1.ReadOnly:=true;

K výsledku získanom pomocou SQLQuery môžeme pristupovať pomocou jeho vlastnosti fields. Ako vidíte, cezjednotlivé záznamy iterujeme volaním

SQLQuery1.Next;

Keď sme už pridali všetky dostupné databázy docomboboxu, opäť zatvoríme SQLQuery.

Výber databázy

Ak užívateľ vyberie databázu v DatabaseComboBox-e, sprístupníme tlačidlo "Select Database" ("Vybrať databázu"). V udalosti OnClick tohto tlačidla nastavíme pre MySQLConnection1 vlasnosť DatabaseName a vyžiadame si zoznam tabuliek vo vybranej databáze. Posledný príkaz tejto procedúry sprístupnňuje tlačidlo "Open Query" ("Vykonať dotaz"), takže užívateľ bude môcť poslať serveru svoj dotaz,ktorý zapíše do "Command" Editbox-u.

procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
begin
  // Databáza bola vybraná, pozrime sa na jej tabuľky
  CloseConnection(Sender);
  if DatabaseComboBox.ItemIndex <> -1 then begin
    with DatabaseComboBox do
      MySQLConnection1.DatabaseName := Items[ItemIndex];
    ShowString('Retreiving list of tables');
    SQLQuery1.SQL.Text := 'show tables';
    SQLQuery1.Open;
    while not SQLQuery1.EOF do begin
      TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
      SQLQuery1.Next;
    end;
    SQLQuery1.Close;
    ShowString('List of tables received');
  end;
  OpenQueryButton.Enabled := True;
end;

MySQL má špeciálny príkaz "show tables", pomocou ktorého získava zoznam tabuliek v databáze. K výsledkom tohto dotazu sa pristupuje podobne, ako pri získavaní zoznamu databáz a všetky tabuľky sú pridané do TableComboBox-u. Môžno sa čudujete, prečo sme opať neotvorili spojenie pred samotným otváraním query. Toto sa totiž urobí automaticky (pokiaľ je to nevyhnutné) vždy, keď aktivujete SQLQuery.

Polia v tabuľke

V MySQL môžete použiť príkaz "SHOW" aj na získanie polí v tabuľke a to príkazom v tvare: "SHOW COLUMNS FROM <meno_tabuľky>". Keď užívateľ vyberie tabuľku z TableComboBox-u, spustíme obsluhu udalosti OnChange tohto ComboBox-u a v nej vyplníme FieldListbox.

procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
begin
  FieldListBox.Clear;
  SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;
  SQLQuery1.Open;
  while not SQLQuery1.EOF do begin
    FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);
    SQLQuery1.Next;
  end;
  SQLQuery1.Close;
end;

Okrem mena poľa obsahuje výsledok aj informácie o type poľa, či je na poli definovaný kľúč, či sú dovolené hodnoty NULL a podobne.

Zobrazovanie dát

Už sme is hovorili o použití komponentov na pripojenie k databázovému serveru, teraz si ukážeme, ako použiť komponenty na zobrazenie dát. Na zobrazenie grid-u s dátami, ktoré si vyžiadal používateľ, použijeme druhý formulár. Tento formulár sa zobrazí, keď užívateľ napíše sql príkaz do "Command" editobox-u a následne klikne na tlačidlo "OpenQuery". Takto vyzerá obsluha udalosti OnClick:

procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
begin
  ShowQueryForm := TShowQueryForm.Create(self);
  ShowQueryForm.Datasource1.DataSet := SQLQuery1;
  SQLQuery1.SQL.Text := CommandEdit.Text;
  SQLQuery1.Open;
  ShowQueryForm.ShowModal;
  ShowQueryForm.Free;
  SQLQuery1.Close;
end;

Formulár ShowQueryForm vyzerá takto::

Mysqlshow.png

a obsahuje

TPanel Align alBottom
TDataSource
TDBGrid Align alClient
DataSource DataSource1
TButton Caption Close

Tlačidlo je umiestnené na paneli. Čo sa stane pri kliknutí na "OpenQuery", je toto: Najskôr vytvoríme inštanciu TShowQueryForm. Nastavíme vlastnosť DataSet nášho DataSource na SQLQuery1. Potom nastavíme príkaz pre SQLQuery podľa toho, čo zadal užívateľ do editbox-u "Command" a vykonáme ho (metóda Open). Modálne zobrazíme ShowQueryForm (modálne znamená, že ako jediné okno z naše aplikácie bude mať fokus). Keď sa okno zavrie, tak uvoľníme ho uvoľníme (metóda "free") a zavrieme SQLQuery1.

Zdrojové kódy

Zdrojové kódy tohto projektu si môžete stiahnuť tu Ak chcete vidieť viac demonštračných príkladov, navštívte sourceforge