Difference between revisions of "MySQLDatabases/sk"

From Lazarus wiki
Jump to navigationJump to search
 
(17 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
{{MySQLDatabases}}
 
{{MySQLDatabases}}
 
'''Pracuje sa'''
 
  
 
==Úvod==
 
==Úvod==
  
V článku [[Lazarus Database Tutorial#Lazarus and MySQL|Database tutorial]] sme videli prvý pokus na spojenei 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.
+
V článku [[Lazarus Database Tutorial#Lazarus and MySQL|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 ==
+
== Dostupné komponenty ==
  
===MySQL komponenty===
+
=== SQLdb komponenty ===
Pokiaľ sa pozriete do adresára $Lazarus/components/mysql nájdete v ňom dva MySQL balíčky. Jeden je pre MySQL verzie 3.2x (mysql3laz.lpk) a druhý pre MySQL verzie 4.x (mysql4laz.lpk). Ak ste tak doteraz neurobili, nainštalujte si balíček, ktorý je určený pre vašu verziu MySQL. Majte na pamäti, že nie je možné používať balíček pre verziu 3 na pripájanie sa k serveru štvorkovej verzie alebo naopak. Keď ste už balíček nainštalovali, uvidíte nový tab nazvaný MySQL na vašej palete komponentov. V tomto tabe sú dva komponenty TMySQLDatabase a TMySQLDataset.
 
  
NB. Pred pokusom nainštalovať tieto komponenty do Lazara sa uistite, že máte príslušné knižnice pre MySQL klienta, inak po inštalaácii nemusí Lazarus naštartovať.
+
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).
  
===SQLdb Components===
+
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.
Another possibility is the installation of the package in the $Lazarus/components/sqldb directory. In this directory you see a package file called sqldblaz.lpk. You need to install this package and the mysql4connlaz.lpk from the $Lazarus/components/sqldb/mysql directory. The first package contains some general components used for all databases. These component are TSQLTransaction and TSQLQuery and can be found on the new SQLdb tab. After installation of the mysql4connlaz.lpk you will find a third component on the SQLdb tab called TMySQLConnection (depicted by a dolphin).
 
  
If you can't find the $Lazarus/components/sqldb/mysql directory and mysql4connlaz.lpk, then this means that you are using a newer version in which mysql4connlaz.lpk merged with sqldblaz.lpk. It is OK, if you instal sqldblaz.lpk, you will get all components mentioned in the same Lazarus IDE toolbar TAB.
+
Pokiaľ neviete, ako nainštalovať komponenty/balíčky, pozrite sa na túto [[Install Packages|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.
  
If you do not know how to install components / packages, have a look at this [[Install Packages|page]] for an "Install Howto".
+
==Popis použitých komponentov==
As the SQLdb components are the more general and can be used for other databases just by replacing the TMySQLConnection with for instance a TIBConnection, we will develop a program with the SQLdb components.
 
 
 
==Explanation of the used components==
 
 
===TMySQLConnection===
 
===TMySQLConnection===
  
The TMySQLConnection is used to store parameters to connect to the database server. It enables you to set the host to connect to and the userid and password to use in the connection. Another property of the TMySQLConnection is used to indicate the database you want to use. The 'LoginPrompt' is not functional yet, so make sure that next to the HostName and DatabaseName the UserName and Password properties have values as well before you try to open the connection.
+
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.
Be sure to use a TSQLTransaction as well and connect it to your MySQLConnection by setting the Transaction property, or you will not be able to open a SQLQuery.
+
Taktiež sa uistite, že máte nastavenú TSQLTransaction a pripojte ju do vašej MySQLConnection (cez vlastnosť 'Transaction'), inak nebudete môcť otvoriť SQLQuery.
  
Note. In latest SVN version of Lazarus you will find 3 MySQLConnection components. These are TMySQL40Connection, TMySQL41Connection and TMySQL50Connection. Make sure you use the correct one to connect to your server.
+
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.
So if you are running MySQL 4.1 use the TMySQL41Connection.
 
  
 
===TSQLTransaction===
 
===TSQLTransaction===
A SQLTransaction is needed for some internal housekeeping. A SQLTransaction is automatically activated when you open a dataset using it. Closing a connection also deactivates the related transaction and closes all datasets using it.
+
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===
TSQLQuery is used to execute SQLstatements on the server. You can retrieve data by setting the SQL to some SELECT statement and call the Open method. Or you can manipulate data by issuing some an INSERT, DELETE or UPDATE statement. In the latter case you should not use the Open method but the ExecSQL method.
+
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===
 
===TDataSource===
  
A datasource provides the connection between the visible data aware components like DBEdit, DBGrid and a dataset. It makes the data available for the data aware components to display.
+
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.
A datasource can only be connected to a single dataset at a time but there can be several data aware components connected.
+
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===
 
===TDBGrid===
A DBGrid can be used to present the data retrieved by a Dataset. The DBGrid needs a datasource to connect to a dataset. When the dataset is opened, the DBgrid will automatically be populated with the data.
+
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.
  
==Our program==
+
==Náš program==
  
===The basics===
+
===Základy===
We will try to make a program based on the one made [[Lazarus Database Tutorial/nl#Verbinding met MySQL vanuit een Lazarus Programma|here (in Dutch)]] which is based on the [[Lazarus Database Tutorial#Connecting to MySQL from a Lazarus Application|original (in English)]] by [[user:kirkpatc|Chris]].
+
Pokúsime sa vytvoriť program, ktorý je založený na jednom už urobenom [[Lazarus Database Tutorial/nl#Verbinding met MySQL vanuit een Lazarus Programma|tu (holandsky)]] a ten bol postavený na základoch [[Lazarus Database Tutorial#Connecting to MySQL from a Lazarus Application|iného (anglicky)]] od [[user:Kirkpatc|Chrisa]].
  
===The main form===
+
===Hlavný formulár===
We will use the same main screen and build all functionality from scratch :) As you will see there is a lot less to take care of, because the components really take away all the hard stuff! So lets start by making a screen that looks like this.<br> [[image:Trymysql.png]]<br>
+
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:<br>  
From the SQLdb-tab place a TMySQLConnection, a TSQLTransaction and a TSQLQuery [[image:Components.png]] on this form. Don't change the default names given to this components. Except for the Connection component. To make this article the same for all versions of MySQL, name your MySQL??Connection component: MySQLConnection1
+
[[image:Trymysql.png]]<br>
We have to link these components together so they can do their job. So the following properties have to be set:
+
Z tabu SQLdb umiestnite na formulár TMySQLConnection, TSQLTransaction a TSQLQuery [[image: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:
 
{|
 
{|
 
|-
 
|-
Line 66: Line 59:
 
| SQLQuery1 || Transaction || SQLTransaction1
 
| SQLQuery1 || Transaction || SQLTransaction1
 
|}
 
|}
The Transaction-property of SQLQuery1 will automatically be set if you have set the Transaction property of MySQLConnection1 first. When you set this, you will notice that SQLTransaction1.Database has been set to MySQLConnection1.
+
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.
  
As said earlier: Make sure you are using the correct Connection component for your version of MySQL server.
+
Ako som povedal skôr: uistite sa, že používate správny komponent na pripájanie k vašej verzii MySQL servera.
  
===The code===
+
===Kód===
  
As you can see in the screen dump the only buttons available on start of the program are "Connect to server" and "Exit". For the other buttons to work we need more information so these are disabled. We could decide to disable "Connect to Server" as well until the information for the host, username and password has been given. I decided against this because our user might think: "Nothing seems possible, so let's hit exit." :)
+
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" :-)
  
Before I start giving you any code I would like to stress that there should be more exception handling in the code. Critical sections should be placed in
+
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
 
  try ... finally
or
+
alebo
 
  try ... except
 
  try ... except
constructions.
 
  
====Connect to a server====
+
 
The first thing we have to do is get connected to our server. As when connecting we don't know what databases are available on the server we will ask for a list of databases on connecting. However there is one catch, to make the connection we have to enter a valid DatabaseName in the properties of the MySQLConnection. You will see in the code that I am using the "mysql" database. This database is used by mysql for some housekeeping so it will always be there.
+
====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);
 
  procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 
  begin
 
  begin
   // Check if we have an active connection. If so, let's close it.
+
   // Overíme si, či máme aktívne pripojenie. Ak áno, zavrieme ho.
 
   if MySQLConnection1.Connected then CloseConnection(Sender);
 
   if MySQLConnection1.Connected then CloseConnection(Sender);
   // Set the connection parameters.
+
   // Nastavíme parametre pre pripojenie
 
   MySQLConnection1.HostName := HostEdit.Text;
 
   MySQLConnection1.HostName := HostEdit.Text;
 
   MySQLConnection1.UserName := UserEdit.Text;
 
   MySQLConnection1.UserName := UserEdit.Text;
 
   MySQLConnection1.Password := PasswdEdit.Text;
 
   MySQLConnection1.Password := PasswdEdit.Text;
   MySQLConnection1.DatabaseName := 'mysql'; // MySQL is allways there!
+
   MySQLConnection1.DatabaseName := 'mysql'; // Táto databáza sa na serveri nachádza vždy!
 
   ShowString('Opening a connection to server: ' + HostEdit.Text);
 
   ShowString('Opening a connection to server: ' + HostEdit.Text);
 
   MySQLConnection1.Open;
 
   MySQLConnection1.Open;
   // First lets get a list of available databases.
+
   // Najskôr získame zoznam dostupných databáz
 
   if MySQLConnection1.Connected then begin
 
   if MySQLConnection1.Connected then begin
 
     ShowString('Connected to server: ' + HostEdit.Text);
 
     ShowString('Connected to server: ' + HostEdit.Text);
Line 108: Line 101:
 
  end;
 
  end;
  
The first thing we do is check to see if we are connected to a server, if we are then we call a private method "CloseConnection". In this method some more housekeeping is done. like disabling buttons and clearing comboboxes and listboxes. Then we set the necessary parameters to connect to server.
+
Prvú vec, ktorú robíme, je overenie, či sme pripojení k serveru. Ak áno, zavoláme privátnu metódu
:''Throughout our program you may see calls to ShowString. This method adds a line to the memo on our form which acts like a kind of log.''
+
"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.
With the parameters set, we can connect to the server. This is done by calling
+
:''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;
 
  MySQLConnection1.Open;
In a proper application one would place this in an exception handling construct to present a friendly message to the user if the connection failed.
+
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:
When we are connected we want to get a list of databases from the server. To get data from the server a TSQLQuery is used. The SQL property is used to store the SQL-statement send to the server. MySQL knows the "SHOW DATABASES" command to get the list of databases. So after we have set the SQL-text, we call
 
 
  SQLQuery1.Open;
 
  SQLQuery1.Open;
The result set of a SQLQuery can be examined through the fields property. As you can see we iterate through the records by calling
+
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;
 
  SQLQuery1.Next;
When we have added all available databases to our combobox, we close the SQLQuery again.
+
Keď sme už pridali všetky dostupné databázy docomboboxu, opäť zatvoríme SQLQuery.
  
====Selecting a database====
+
====Výber databázy====
If the user selects a database in the DatabaseComboBox we enable the "Select Database" button. In the OnClick event of this button we set the DatabaseName of MySQLConnection1, and request a list of tables. The last statement of this procedure enables the "Open Query" Button, so the user can enter a query in the "Command" Editbox and have it send to the server.
+
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);
 
  procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 
  begin
 
  begin
   // A database has been selected so lets get the tables in it.
+
   // Databáza bola vybraná, pozrime sa na jej tabuľky
 
   CloseConnection(Sender);
 
   CloseConnection(Sender);
 
   if DatabaseComboBox.ItemIndex <> -1 then begin
 
   if DatabaseComboBox.ItemIndex <> -1 then begin
Line 140: Line 135:
 
   OpenQueryButton.Enabled := True;
 
   OpenQueryButton.Enabled := True;
 
  end;
 
  end;
MySQL has a special command to get a list of tables, comparable to getting the list of databases, "show tables". The result of this query is handled in the same way as the list of databases and all the tables are added to the TableComboBox.
+
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.
You might wonder why we do not open the connection again before opening the query? Well, this is done automatically (if necessary) when we activate the SQLQuery.
+
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.
  
====Fields in a table====
+
====Polia v tabuľke====
In MySQL you can again use a form of "SHOW" to get the fields in a table. In this case "SHOW COLUMNS FROM <tablename>". If the user picks a table from the TableComboBox the OnChangeEvent of this ComboBox is triggered which fills the FieldListbox.
+
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);
 
  procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 
  begin
 
  begin
Line 156: Line 151:
 
   SQLQuery1.Close;
 
   SQLQuery1.Close;
 
  end;
 
  end;
As well as the names of the fields, the result set contains information on the type of field, if the field is a key, if nulls are allowed and some more.
+
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.
  
====Showing the data====
+
====Zobrazovanie dát====
Well as we said we would use components to get connected to the database, lets use some components to show the data as well. We will use a second form to show a grid with the data requested by the user. This form will be shown when the user typed a SQL command in the "Command" editbox and afterwards clicks the "Open Query" button. This is the OnClick event:
+
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);
 
  procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 
  begin
 
  begin
Line 170: Line 165:
 
   SQLQuery1.Close;
 
   SQLQuery1.Close;
 
  end;
 
  end;
The ShowQueryForm looks like this:
+
Formulár ShowQueryForm vyzerá takto::
 
<center>[[Image:Mysqlshow.png]]</center>
 
<center>[[Image:Mysqlshow.png]]</center>
and contains a  
+
a obsahuje
 
{|
 
{|
 
|-
 
|-
Line 185: Line 180:
 
| TButton || Caption || Close
 
| TButton || Caption || Close
 
|}
 
|}
The button is placed on the panel.
+
Tlačidlo je umiestnené na paneli.
What happens in the "Open Query" OnClick is this. First we create an instance of TShowQueryForm. Secondly we set the DataSet property of the DataSource to our SQLQuery1. Then we set the SQLQuery SQL command to what the user entered in the "Command" editbox and open it. Then the ShowQueryForm is shown modally, this means that it will have the focus of our application until it is closed. When it is closed, we "free" it and close SQLQuery1 again.
+
Č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.
  
==Sources==
+
==Zdrojové kódy==
The sources for this project can be downloaded [http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download here]
+
Zdrojové kódy tohto projektu si môžete stiahnuť [http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download tu]
For more demo projects see [http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359 sourceforge]
+
Ak chcete vidieť viac demonštračných príkladov, navštívte [http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359 sourceforge]

Latest revision as of 23:10, 6 April 2009

Deutsch (de) English (en) français (fr) 日本語 (ja) polski (pl) 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