Difference between revisions of "MySQLDatabases/pl"

From Lazarus wiki
Jump to navigationJump to search
(Kopia strony en)
 
m (Zmiana szablonu na pl)
 
(33 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
{{MySQLDatabases}}
 
{{MySQLDatabases}}
  
{{Infobox databases}}
+
{{Infobox databases/pl}}
  
==Introduction==
+
== Wprowadzenie ==
  
This page will explain how to connect to a [[mysql|MySQL]] server using visual components.
+
Ta strona wyjaśnia, jak połączyć się z serwerem bazy danych [[mysql|MySQL]] przy użyciu komponentów wizualnych.
  
{{Note|This page has been written a long time ago and may be out of date. Also, most of the concepts described here are not MySQL specific but apply to all SQLDB databases. Therefore, following the SQLdb Tutorial series mentioned below may be easier}}
+
{{Note|Ta strona została przetłumaczona z wersji angielskiej na język polski w dniu 2021.01.31, ale wersja angielska została napisana dawno temu i może nie być aktualna. Ponadto większość opisanych tutaj koncepcji nie jest specyficznych dla MySQL, ale ma zastosowanie do wszystkich baz danych SQLDB. Dlatego skorzystanie z poniższej serii samouczków SQLdb może być łatwiejsze}}
  
Note: see also these tutorials that teach data-bound controls, parameterized queries, database independent programming etc:
+
Uwaga: zapoznaj się również z samouczkami, które uczą obsługi kontrolek związanych z danymi, zapytań parametrycznych, programowania niezależnego od bazy danych itp .:
* [[SQLdb Tutorial1]]  
+
* [[SQLdb Tutorial1|SQLdb Samouczek1]]  
* [[SQLdb Tutorial2]]  
+
* [[SQLdb Tutorial2|SQLdb Samouczek2]]  
* [[SQLdb Tutorial3]]  
+
* [[SQLdb Tutorial3|SQLdb Samouczek3]]  
They are written for all databases that support sqldb, including MySQL.
+
Te samouczki są napisane dla wszystkich baz danych obsługujących sqldb, w tym MySQL.
  
If needed, see also [[mysql#SQLDB_tutorials_and_example_code]] for yet more tutorials (that are also written a long time ago.
+
W razie potrzeby zobacz również [[mysql#SQLDB_tutorials_and_example_code|Samouczki SQLDB i przykładowy kod]], aby uzyskać więcej samouczków (które również zostały napisane dawno temu.
  
== Available Components ==
+
== Dostępne komponenty ==
  
=== SQLdb Components ===
+
=== Komponenty SQLdb ===
  
In any even vaguely recent version of Lazarus, the SQLDB components are installed by default.
+
W każdej, nawet dość niedawnej wersji Lazarusa, komponenty SQLdb są instalowane domyślnie.
  
[[File:sqldbcomponents.png‎]]
+
[[File:sqldbcomponents2.png‎]]
  
On the SQLDB tab you will find:
+
W zakładce SQLdb znajdziesz:
* Various connectors, including [[TMySQL40Connection]]..[[TMySQL56Connection]] (or perhaps even newer versions) and the most versatile of all [[TSQLConnector]] that may load any of the mysql/oracle/postgres/mssql/interbase/firebird/odbc drivers.
+
* Różne złącza (connectors), w tym [[TMySQL40Connection]] .. [[TMySQL57Connection]] (a może nawet nowsze wersje) i najbardziej wszechstronne ze wszystkich [[TSQLConnector]], które mogą ładować dowolne ze sterowników baz danych takich jak mysql/oracle/postgres/mssql/interbase/firebird/odbc.
 
* [[TSQLQuery]]
 
* [[TSQLQuery]]
  
If the SQLDB tab is missing, have a look at [[Install Packages]] for an "Install Howto".
+
Jeśli brakuje karty SQLdb, zajrzyj do [[Install Packages|Instalowanie pakietów]], aby uzyskać instrukcje dotyczące instalacji.
  
==Explanation of the used components==
+
== Wyjaśnienie zastosowanych komponentów ==
 
===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 służy do przechowywania parametrów połączenia z serwerem bazy danych. Umożliwia ustawienie hosta, z którym ma się łączyć, oraz identyfikatora użytkownika i hasła, które mają być używane w połączeniu. Inna właściwość TMySQLConnection służy do wskazania bazy danych, której chcesz użyć. „LoginPrompt” jeszcze nie działa, więc upewnij się, że obok właściwości HostName i DatabaseName uzupełnione są również wartości UserName i Password, zanim spróbujesz otworzyć połączenie.
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.
+
Pamiętaj, że aby użyć również TSQLTransaction i połączyć ją z MySQLConnection, ustaw właściwość Transaction, w przeciwnym razie nie będziesz mógł otworzyć zapytania SQLQuery.
  
{{Note|As indicated above, there are various MySQLConnection components that differ in version number. The version number '''must''' match the version number of the client library you use to connect to your server. So if you are running a MySQL 5.1 server but use a MySQL 5.0 client, use the TMySQL50Connection.}}
+
{{Note| Jak wskazano powyżej, istnieją różne komponenty MySQLConnection, które różnią się numerem wersji. Numer wersji '''musi''' odpowiadać numerowi wersji biblioteki klienta, której używasz do łączenia się z serwerem. Jeśli więc używasz serwera MySQL 5.1, ale używasz klienta MySQL 5.0, użyj TMySQL50Connection.}}
  
You should check MySQL documentation to make sure the combination between client version and server version is supported - e.g. you may well have problems connecting to a 4.0 server using a 5.x client.
+
Powinieneś sprawdzić dokumentację MySQL, aby upewnić się, że połączenie między wersją klienta i wersją serwera jest obsługiwane - np. możesz mieć problemy z połączeniem się z serwerem 4.0 przy użyciu klienta 5.x.
  
In all cases put a copy of libmysql.dll ''and any other required files/dlls''
+
We wszystkich przypadkach należy umieścić kopię biblioteki libmysql.dll ''i wszelkich innych wymaganych plików/bibliotek dll''
* in your Lazarus directory and the same directory as your project files or
+
* w twoim katalogu Lazarus i tym samym katalogu co pliki twojego projektu lub
* in the Windows system directory (if you don't want to keep copying files). Note that on 64 bit Windows you have to put the 32 bit library in SysWOW64, while 64 bit libraries go into System32.
+
* w katalogu systemowym Windows (jeśli nie chcesz dalej kopiować plików). Zauważ, że w 64-bitowym systemie Windows bibliotekę 32-bitową musisz umieścić w katalogu SysWOW64, podczas gdy biblioteki 64-bitowe należy przenieść do System32.
  
 
===TSQLTransaction===
 
===TSQLTransaction===
A [[TSQLTransaction]] 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.
+
[[TSQLTransaction]] jest potrzebne do niektórych wewnętrznych procedur. SQLTransaction jest automatycznie aktywowana po otwarciu zestawu danych przy jej użyciu. Zamknięcie połączenia również dezaktywuje powiązaną transakcję i zamyka wszystkie korzystające z niej zbiory danych.
  
 
===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]] służy do wykonywania instrukcji SQL na serwerze. Możesz pobrać dane, ustawiając SQL na jakąś instrukcję SELECT i wywołując metodę Open. Możesz też manipulować danymi, wydając instrukcję INSERT, DELETE lub UPDATE. W tym drugim przypadku nie powinieneś używać metody Open, ale metodę ExecSQL.
  
 
===TDataSource===
 
===TDataSource===
A [[TDataSource]] 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.
+
[[TDataSource]] zapewnia połączenie między widocznymi komponentami obsługującymi dane, takimi jak DBEdit, DBGrid i zbiorem danych. Przygotowuje dane do wyświetlania w komponentach obsługujących te dane.
A datasource can only be connected to a single dataset at a time but there can be several data aware components connected.
+
DataSource (źródło danych) może być jednocześnie połączone tylko z jednym zestawem danych, ale do niego może być połączonych kilka komponentów obsługujących dane.
  
 
===TDBGrid===
 
===TDBGrid===
A [[TDBGrid]] 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.
+
[[TDBGrid]] może służyć do przedstawienia danych pobranych przez Dataset (zbiór danych). DBGrid potrzebuje Datasource (źródła danych), aby połączyć się ze zbirem danych. Gdy zbiór danych zostanie otwarty, DBGrid zostanie automatycznie wypełniony danymi.
  
==Our program==
+
==Nasz program==
  
===The basics===
+
=== Podstawy ===
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]].
+
Spróbujemy stworzyć program w oparciu o ten stworzony [[Lazarus Database Tutorial/nl#Verbinding met MySQL vanuit een Lazarus Programma|tutaj (w języku niderlandzkim)]], który jest oparty na [[Lazarus Database Tutorial#Connecting to MySQL from a Lazarus Application|oryginale (w języku angielskim)]] autorstwa [[user: Kirkpatc | Chris]].
  
===The main form===
+
=== Formularz główny ===
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.
+
Użyjemy tego samego ekranu głównego i zbudujemy całą funkcjonalność od podstaw :) Jak zobaczysz, jest tu o wiele mniej do zrobienia, ponieważ komponenty naprawdę rozwiązują wszystkie trudne rzeczy! Zacznijmy więc od stworzenia ekranu, który wygląda tak:
  
[[image:Trymysql.png]]
+
[[image: Trymysql_pl.png]]
  
From the SQLdb-tab place a [[TMySQL56Connection]] [[image:tmysql56connection.png]] (or other mysql-client version) a [[TSQLTransaction]] [[image:tsqltransaction.png]] and a [[TSQLQuery]] [[image:tsqlquery.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 TMySQL##Connection component: <tt>MySQLConnection1</tt>. We have to link these components together so they can do their job. So the following properties have to be set:
+
Korzystając z zakładki SQLdb umieść na swojej formatce komponenty [[TMySQL56Connection]] [[image:tmysql56connection.png]] (lub inną wersję klienta mysql), [[TSQLTransaction]] [[image:tsqltransaction.png]] i [[TSQLQuery]] [[image:tsqlquery.png]]. Nie zmieniaj domyślnych nazw nadanych tym komponentom. Z wyjątkiem komponentu łączącego do bazy. Aby artykuł był taki sam dla wszystkich wersji MySQL, nazwij komponent TMySQL##Connection: <tt>MySQLConnection1</tt>. Musimy te komponenty połączyć razem, aby mogły wykonywać swoją pracę. Dlatego należy ustawić następujące właściwości:
 
{|
 
{|
 
|-
 
|-
| '''Component''' || '''Property''' || '''Value'''
+
| '''Komponent''' || '''Właściwość''' || '''Wartość'''
 
|-
 
|-
 
| MySQLConnection1 || Transaction || SQLTransaction1
 
| MySQLConnection1 || Transaction || SQLTransaction1
Line 81: Line 81:
 
| SQLQuery1 || Database || MySQLConnection1
 
| SQLQuery1 || Database || MySQLConnection1
 
|}
 
|}
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.
+
Właściwość Transaction komponentu SQLQuery1 zostanie ustawiona automatycznie, jeśli najpierw ustawisz właściwość Transaction dla MySQLConnection1. Gdy to ustawisz, zauważysz, że SQLTransaction1.Database została ustawiona na MySQLConnection1.
  
As said earlier: Make sure you are using the correct Connection component for your version of MySQL server.
+
Jak wspomniano wcześniej: upewnij się, że używasz odpowiedniego komponentu połączenia dla swojej wersji serwera MySQL.
  
===The code===
+
=== Kod ===
  
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." :)
+
Jak widać na zrzucie ekranu, jedynymi przyciskami dostępnymi po uruchomieniu programu są „Połącz z serwerem” i „Zakończ”. Aby inne przyciski działały, potrzebujemy więcej informacji, więc są one wyłączone. Moglibyśmy również zdecydować o wyłączeniu opcji „Połącz z serwerem” do czasu podania informacji o hoście, nazwie użytkownika i haśle. Zdecydowałem się tego nie robić, ponieważ nasz użytkownik mógłby pomyśleć: „Nic nie wydaje się możliwe, więc przejdźmy do wyjścia”. :)
  
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
+
Zanim zacznę podawać jakikolwiek kod, chciałbym podkreślić, że w kodzie powinna być dodana obsługa wyjątków. Sekcje krytyczne należy umieścić w blokach kodu
 
  try ... finally
 
  try ... finally
or
+
i / lub
 
  try ... except
 
  try ... except
constructions.
 
  
====Connect to a server====
+
==== Połączenie z serwerem ====
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.
+
Pierwszą rzeczą, którą musimy zrobić, jest połączenie się z naszym serwerem. Ponieważ przy łączeniu nie wiemy, jakie bazy danych są dostępne na serwerze, przy połączeniu poprosimy o listę baz danych. Jest jednak jeden haczyk, aby nawiązać połączenie, musimy wprowadzić poprawną nazwę bazy danych we właściwościach MySQLConnection. W kodzie zobaczysz, że używam bazy danych „mysql”. Ta baza danych jest używana przez mysql do pewnych czynności porządkowych, więc zawsze tam będzie.
  
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 
begin
 
begin
   // Check if we have an active connection. If so, let's close it.
+
   // Sprawdź, czy mamy aktywne połączenie. Jeśli tak, musimy je zamknąć.
 
   if MySQLConnection1.Connected then CloseConnection(Sender);
 
   if MySQLConnection1.Connected then CloseConnection(Sender);
   // Set the connection parameters.
+
   // Ustaw parametry połączenia.
 
   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'; // Baza mysql jest zawsze dostępna!
   ShowString('Opening a connection to server: ' + HostEdit.Text);
+
   ShowString('Otwarcie połączenia z serwerem: ' + HostEdit.Text);
 
   MySQLConnection1.Open;
 
   MySQLConnection1.Open;
   // First lets get a list of available databases.
+
   // Najpierw pobierzmy listę dostępnych baz danych.
 
   if MySQLConnection1.Connected then begin
 
   if MySQLConnection1.Connected then begin
     ShowString('Connected to server: ' + HostEdit.Text);
+
     ShowString('Połączono z serwerem: ' + HostEdit.Text);
     ShowString('Retrieving list of available databases.');
+
     ShowString('Pobieranie listy dostępnych baz danych.');
 
     SQLQuery1.SQL.Text := 'show databases';
 
     SQLQuery1.SQL.Text := 'show databases';
 
     SQLQuery1.Open;
 
     SQLQuery1.Open;
Line 120: Line 119:
 
     end;
 
     end;
 
     SQLQuery1.Close;
 
     SQLQuery1.Close;
     ShowString('List of databases received!');
+
     ShowString('Lista otrzymanych baz danych!');
 
   end;
 
   end;
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
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.
+
Pierwszą rzeczą, jaką robimy, jest sprawdzenie, czy jesteśmy połączeni z serwerem, jeśli tak, wywołujemy prywatną metodę „CloseConnection”. W tej metodzie robi się więcej porządków. jak wyłączanie przycisków i czyszczenie comboboxów i listbox. Następnie ustawiamy niezbędne parametry, aby połączyć się z serwerem.
:''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.''
+
:''W całym naszym programie możesz zobaczyć wywołania ShowString. Ta metoda dodaje wiersz do notatki w naszym formularzu, który działa jak rodzaj dziennika.''
With the parameters set, we can connect to the server. This is done by calling
+
Po ustawieniu parametrów możemy połączyć się z serwerem. Odbywa się to przez wywołanie
 
<syntaxhighlight lang=pascal>MySQLConnection1.Open;</syntaxhighlight>
 
<syntaxhighlight lang=pascal>MySQLConnection1.Open;</syntaxhighlight>
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.
+
W odpowiedniej aplikacji można by to umieścić w konstrukcji obsługi wyjątków, aby przedstawić użytkownikowi przyjazny komunikat w przypadku niepowodzenia połączenia.
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
+
Kiedy jesteśmy połączeni, chcemy uzyskać listę baz danych z serwera. Aby uzyskać dane z serwera, używane jest zapytanie TSQLQuery. Właściwość SQL służy do przechowywania instrukcji SQL wysyłanej do serwera. MySQL zna polecenie „SHOW DATABASES”, aby uzyskać listę baz danych. Więc po ustawieniu tekstu SQL wywołujemy
 
<syntaxhighlight lang=pascal>SQLQuery1.Open;</syntaxhighlight>
 
<syntaxhighlight lang=pascal>SQLQuery1.Open;</syntaxhighlight>
On MySQL5 set this to correct error with SQL syntax:
+
W MySQL5 ustaw to, aby poprawić błąd ze składnią SQL:
 
<syntaxhighlight lang=pascal>SQLQuery1.ParseSQL := False;  
 
<syntaxhighlight lang=pascal>SQLQuery1.ParseSQL := False;  
 
SQLQuery1.ReadOnly := True;</syntaxhighlight>
 
SQLQuery1.ReadOnly := True;</syntaxhighlight>
The result set of a SQLQuery can be examined through the fields property. As you can see we iterate through the records by calling
+
Zestaw wyników SQLQuery można sprawdzić za pomocą właściwości fields. Jak widać, przeglądamy wszystkie zapisy, wywołując
 
<syntaxhighlight lang=pascal>SQLQuery1.Next;</syntaxhighlight>
 
<syntaxhighlight lang=pascal>SQLQuery1.Next;</syntaxhighlight>
When we have added all available databases to our combobox, we close the SQLQuery again.
+
Kiedy dodamy wszystkie dostępne bazy danych do naszego combobox, ponownie zamykamy SQLQuery.
  
====Selecting a database====
+
==== Wybieranie bazy danych ====
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.
+
Jeśli użytkownik wybierze bazę danych w DatabaseComboBox, włączamy przycisk „Wybierz bazę danych”. W zdarzeniu OnClick tego przycisku ustawiamy DatabaseName MySQLConnection1 i żądamy listy tabel. Ostatnia instrukcja tej procedury włącza przycisk „Otwórz zapytanie”, dzięki czemu użytkownik może wprowadzić zapytanie w polu edycji „Polecenie” i wysłać je na serwer.
  
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
 
begin
 
begin
   // A database has been selected so lets get the tables in it.
+
   // Baza danych została wybrana, więc pobierzmy z niej tabele.
 
   CloseConnection(Sender);
 
   CloseConnection(Sender);
 
   if DatabaseComboBox.ItemIndex <> -1 then begin
 
   if DatabaseComboBox.ItemIndex <> -1 then begin
 
     with DatabaseComboBox do
 
     with DatabaseComboBox do
 
       MySQLConnection1.DatabaseName := Items[ItemIndex];
 
       MySQLConnection1.DatabaseName := Items[ItemIndex];
     ShowString('Retreiving list of tables');
+
     ShowString('Pobieranie listy tabel');
     SQLQuery1.SQL.Text := 'show tables';
+
     SQLQuery1.SQL.Text := 'SHOW TABLES';
 
     SQLQuery1.Open;
 
     SQLQuery1.Open;
 
     while not SQLQuery1.EOF do begin
 
     while not SQLQuery1.EOF do begin
Line 156: Line 155:
 
     end;
 
     end;
 
     SQLQuery1.Close;
 
     SQLQuery1.Close;
     ShowString('List of tables received');
+
     ShowString('Lista otrzymanych tabel');
 
   end;
 
   end;
 
   OpenQueryButton.Enabled := True;
 
   OpenQueryButton.Enabled := True;
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
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 ma specjalne polecenie do pobierania listy tabel, porównywalne do pobierania listy baz danych, „SHOW TABLES”. Wynik tego zapytania jest obsługiwany w taki sam sposób, jak lista baz danych, a wszystkie tabele są dodawane do TableComboBox.
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.
+
Możesz się zastanawiać, dlaczego nie otwieramy ponownie połączenia przed otwarciem zapytania? Cóż, odbywa się to automatycznie (jeśli to konieczne), gdy aktywujemy SQLQuery.
  
====Fields in a table====
+
==== Pola w tabeli ====
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.
+
W MySQL możesz ponownie użyć formy „SHOW”, aby pobrać pola w tabeli. W tym przypadku „SHOW COLUMNS FROM <nazwa tabeli>. Jeśli użytkownik wybierze tabelę z TableComboBox, wyzwalane jest zdarzenie OnChangeEvent tego ComboBox, które wypełnia pole FieldListbox.
  
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
 
begin
 
begin
 
   FieldListBox.Clear;
 
   FieldListBox.Clear;
   SQLQuery1.SQL.Text := 'show columns from ' + TableComboBox.Text;
+
   SQLQuery1.SQL.Text := 'SHOW COLUMNS FROM ' + TableComboBox.Text;
 
   SQLQuery1.Open;
 
   SQLQuery1.Open;
 
   while not SQLQuery1.EOF do begin
 
   while not SQLQuery1.EOF do begin
Line 179: Line 178:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
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.
+
Oprócz nazw pól, zestaw wyników zawiera informacje o typie pola, jeśli pole jest kluczem, czy dozwolone są wartości null i nie tylko.
  
====Showing the data====
+
==== Wyświetlanie danych ====
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:
+
Tak jak powiedzieliśmy, użyjemy komponentów do połączenia się z bazą danych, użyjmy również niektórych komponentów, aby pokazać dane. W drugim formularzu pokażemy siatkę z danymi żądanymi przez użytkownika. Formularz ten zostanie wyświetlony, gdy użytkownik wpisze polecenie SQL w polu edycji „Polecenie”, a następnie kliknie przycisk „Otwórz zapytanie”. To jest zdarzenie OnClick:
  
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
Line 195: Line 194:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
The ShowQueryForm looks like this:
+
ShowQueryForm wygląda następująco:
  <center>[[Image:Mysqlshow.png]]</center>
+
  <center>[[Image:Mysqlshow_pl.png]]</center>
and contains a
+
i zawiera
 
{|
 
{|
 
|-
 
|-
Line 210: Line 209:
 
| [[TButton]] || Caption || Close
 
| [[TButton]] || Caption || Close
 
|}
 
|}
The button is placed on the panel.
+
Przycisk umieszczony jest na panelu.
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.
+
Kolejność działań w OnClick przycisku „Otwórz zapytanie” jest następująca. Najpierw tworzymy wystąpienie TShowQueryForm. Po drugie ustawiliśmy właściwość DataSet źródła danych na nasz SQLQuery1. Następnie ustawiamy polecenie SQLQuery SQL na to, co użytkownik wpisał w polu edycji „Polecenie” i otwieramy je. Następnie ShowQueryForm jest pokazywany modalnie, co oznacza, że ​​będzie się na nim koncentrował, dopóki nie zostanie zamknięty. Po zamknięciu „zwalniamy” go i ponownie zamykamy SQLQuery1.
  
The Form can be further enhanced by inserting a method for modifying the content of the [[TDataSet]] and ultimately the DataBase. A full version can be downloaded from
+
Formularz można dodatkowo ulepszyć poprzez wstawienie metody modyfikowania zawartości [[TDataSet]] i ostatecznie DataBase. Pełną wersję można pobrać z
http://digitus.itk.ppke.hu/~janma/lazarus/MySql5Test.tar.gz (with thanks to Arwen and JZombi from the Lazarus MySQL Forum)
+
http://digitus.itk.ppke.hu/~janma/lazarus/MySql5Test.tar.gz (dzięki Arwen i JZombi z Lazarus MySQL Forum)
but the relevant details are as follows:
+
ale istotne szczegóły są następujące:
  
Add a Button at the bottom of the ShowQuery Form named AddButton and with Caption 'Add'. Create a method for AddButtonClick like this:
+
Dodaj przycisk u dołu formularza ShowQuery o nazwie AddButton i podpisem „Dodaj”. Utwórz metodę dla AddButtonClick w następujący sposób:
  
 
<syntaxhighlight lang=pascal>procedure TShowQueryForm.AddButtonClick(Sender: TObject);
 
<syntaxhighlight lang=pascal>procedure TShowQueryForm.AddButtonClick(Sender: TObject);
Line 224: Line 223:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
Change the code for OpenQueryButtonClick to allow for updates to the database when we finish with the Query Form.
+
Zmień kod dla OpenQueryButtonClick, aby umożliwić aktualizacje bazy danych po zakończeniu pracy z formularzem zapytania.
  
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
 
<syntaxhighlight lang=pascal>procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
Line 231: Line 230:
 
   try
 
   try
 
     ShowQueryForm.DataSource1.DataSet := SQLQuery1;
 
     ShowQueryForm.DataSource1.DataSet := SQLQuery1;
     // We will write in the database, so let's set ReadOnly to false,  
+
     // Będziemy pisać w bazie danych, więc ustawmy ReadOnly na false,
     // and for that we need to set ParseSQL true
+
     // a do tego musimy ustawić ParseSQL na true
 
     SQLQuery1.ParseSQL:=true;
 
     SQLQuery1.ParseSQL:=true;
 
     SQLQuery1.ReadOnly:=false;
 
     SQLQuery1.ReadOnly:=false;
Line 239: Line 238:
 
     ShowQueryForm.ShowModal;
 
     ShowQueryForm.ShowModal;
 
   finally
 
   finally
     // set up update mode, and update database
+
     // ustaw tryb aktualizacji i zaktualizuj bazę danych
 
     SQLQuery1.UpdateMode:=upWhereChanged;
 
     SQLQuery1.UpdateMode:=upWhereChanged;
 
     SQLQuery1.ApplyUpdates;
 
     SQLQuery1.ApplyUpdates;
Line 245: Line 244:
 
     ShowQueryForm.Free;
 
     ShowQueryForm.Free;
 
     SQLQuery1.Close;
 
     SQLQuery1.Close;
     // set read-only and parsesql back to default
+
     // ustaw ReadOnly i ParsesSQL z powrotem na domyślne
 
     SQLQuery1.ParseSQL:=false;
 
     SQLQuery1.ParseSQL:=false;
 
     SQLQuery1.ReadOnly:=true;
 
     SQLQuery1.ReadOnly:=true;
Line 251: Line 250:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
We can now add records to the Database. If we add a TDBNavigator to the ShowQuery Form we can move around the Data Grid more easily, and edit records; the database gets updated with our changes each time we close the ShowQuery Form, and we can test this by opening it up again to inspect the database.
+
Możemy teraz dodawać rekordy do bazy danych. Jeśli dodamy TDBNavigator do formularza ShowQuery, możemy łatwiej poruszać się po siatce danych i edytować rekordy; baza danych jest aktualizowana o nasze zmiany za każdym razem, gdy zamykamy formularz ShowQuery i możemy to przetestować, otwierając go ponownie w celu sprawdzenia bazy danych.
  
If you want to be able to DELETE or otherwise modify records on the original database (ie make sure changes you make to the local dataset get committed back to the database) then you need to have one column in your database table that is a primary key autoincremented, as the 'delete' method requires to be able to generate a 'where' clause when writing instructions back to the database, to identify the records selected for deletion. So use the following code in your MySQL client (it can all be typed on one line, but line breaks have been added for clarity):
+
Jeśli chcesz mieć możliwość USUWANIA lub w inny sposób modyfikowania rekordów w oryginalnej bazie danych (tj. trzeba upewnić się, że zmiany wprowadzone w lokalnym zestawie danych zostaną zatwierdzone z powrotem w bazie danych), musisz mieć jedną kolumnę w tabeli bazy danych, która jest kluczem podstawowym autoincremented, ponieważ metoda 'delete' wymaga możliwości wygenerowania klauzuli 'where' podczas zapisywania instrukcji z powrotem do bazy danych, aby zidentyfikować rekordy wybrane do usunięcia. Użyj więc następującego kodu w swoim kliencie MySQL (wszystko może być wpisane w jednej linii, ale dla przejrzystości dodano podziały linii):
  
 
<syntaxhighlight lang="sql">ALTER TABLE TRESTRIG  
 
<syntaxhighlight lang="sql">ALTER TABLE TRESTRIG  
Line 259: Line 258:
 
PRIMARY KEY AUTO_INCREMENT;</syntaxhighlight>
 
PRIMARY KEY AUTO_INCREMENT;</syntaxhighlight>
  
and then you will find that the Delete button on the navigator works.
+
a wtedy zauważysz, że przycisk Usuń w nawigatorze działa.
  
==Sources==
+
== Źródła ==
The sources for this project can be downloaded [http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download here]
+
Oryginalne źródła tego projektu można pobrać [http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download tutaj].
For more demo projects see [http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359 sourceforge]
+
Aby uzyskać więcej projektów demonstracyjnych, zobacz [http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359 sourceforge].
 +
{{Note| Projekty te powstały w latach 2004-2009 i nie były aktualizowane. Bez kilku poprawek mogą nie kompilować się w obecnym Lazarus 2.0.10.}}
  
==See also==
+
==Zobacz także==
 
* [[mysql]]
 
* [[mysql]]

Latest revision as of 23:34, 12 November 2021

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

Portal bazy danych

Bibliografia:

Poradniki/porady praktyczne:

Bazy danych

Advantage - MySQL - MS SQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

Wprowadzenie

Ta strona wyjaśnia, jak połączyć się z serwerem bazy danych MySQL przy użyciu komponentów wizualnych.

Light bulb  Uwaga: Ta strona została przetłumaczona z wersji angielskiej na język polski w dniu 2021.01.31, ale wersja angielska została napisana dawno temu i może nie być aktualna. Ponadto większość opisanych tutaj koncepcji nie jest specyficznych dla MySQL, ale ma zastosowanie do wszystkich baz danych SQLDB. Dlatego skorzystanie z poniższej serii samouczków SQLdb może być łatwiejsze

Uwaga: zapoznaj się również z samouczkami, które uczą obsługi kontrolek związanych z danymi, zapytań parametrycznych, programowania niezależnego od bazy danych itp .:

Te samouczki są napisane dla wszystkich baz danych obsługujących sqldb, w tym MySQL.

W razie potrzeby zobacz również Samouczki SQLDB i przykładowy kod, aby uzyskać więcej samouczków (które również zostały napisane dawno temu.

Dostępne komponenty

Komponenty SQLdb

W każdej, nawet dość niedawnej wersji Lazarusa, komponenty SQLdb są instalowane domyślnie.

sqldbcomponents2.png

W zakładce SQLdb znajdziesz:

  • Różne złącza (connectors), w tym TMySQL40Connection .. TMySQL57Connection (a może nawet nowsze wersje) i najbardziej wszechstronne ze wszystkich TSQLConnector, które mogą ładować dowolne ze sterowników baz danych takich jak mysql/oracle/postgres/mssql/interbase/firebird/odbc.
  • TSQLQuery

Jeśli brakuje karty SQLdb, zajrzyj do Instalowanie pakietów, aby uzyskać instrukcje dotyczące instalacji.

Wyjaśnienie zastosowanych komponentów

TMySQLConnection

TMySQLConnection służy do przechowywania parametrów połączenia z serwerem bazy danych. Umożliwia ustawienie hosta, z którym ma się łączyć, oraz identyfikatora użytkownika i hasła, które mają być używane w połączeniu. Inna właściwość TMySQLConnection służy do wskazania bazy danych, której chcesz użyć. „LoginPrompt” jeszcze nie działa, więc upewnij się, że obok właściwości HostName i DatabaseName uzupełnione są również wartości UserName i Password, zanim spróbujesz otworzyć połączenie. Pamiętaj, że aby użyć również TSQLTransaction i połączyć ją z MySQLConnection, ustaw właściwość Transaction, w przeciwnym razie nie będziesz mógł otworzyć zapytania SQLQuery.

Light bulb  Uwaga: Jak wskazano powyżej, istnieją różne komponenty MySQLConnection, które różnią się numerem wersji. Numer wersji musi odpowiadać numerowi wersji biblioteki klienta, której używasz do łączenia się z serwerem. Jeśli więc używasz serwera MySQL 5.1, ale używasz klienta MySQL 5.0, użyj TMySQL50Connection.

Powinieneś sprawdzić dokumentację MySQL, aby upewnić się, że połączenie między wersją klienta i wersją serwera jest obsługiwane - np. możesz mieć problemy z połączeniem się z serwerem 4.0 przy użyciu klienta 5.x.

We wszystkich przypadkach należy umieścić kopię biblioteki libmysql.dll i wszelkich innych wymaganych plików/bibliotek dll

  • w twoim katalogu Lazarus i tym samym katalogu co pliki twojego projektu lub
  • w katalogu systemowym Windows (jeśli nie chcesz dalej kopiować plików). Zauważ, że w 64-bitowym systemie Windows bibliotekę 32-bitową musisz umieścić w katalogu SysWOW64, podczas gdy biblioteki 64-bitowe należy przenieść do System32.

TSQLTransaction

TSQLTransaction jest potrzebne do niektórych wewnętrznych procedur. SQLTransaction jest automatycznie aktywowana po otwarciu zestawu danych przy jej użyciu. Zamknięcie połączenia również dezaktywuje powiązaną transakcję i zamyka wszystkie korzystające z niej zbiory danych.

TSQLQuery

TSQLQuery służy do wykonywania instrukcji SQL na serwerze. Możesz pobrać dane, ustawiając SQL na jakąś instrukcję SELECT i wywołując metodę Open. Możesz też manipulować danymi, wydając instrukcję INSERT, DELETE lub UPDATE. W tym drugim przypadku nie powinieneś używać metody Open, ale metodę ExecSQL.

TDataSource

TDataSource zapewnia połączenie między widocznymi komponentami obsługującymi dane, takimi jak DBEdit, DBGrid i zbiorem danych. Przygotowuje dane do wyświetlania w komponentach obsługujących te dane. DataSource (źródło danych) może być jednocześnie połączone tylko z jednym zestawem danych, ale do niego może być połączonych kilka komponentów obsługujących dane.

TDBGrid

TDBGrid może służyć do przedstawienia danych pobranych przez Dataset (zbiór danych). DBGrid potrzebuje Datasource (źródła danych), aby połączyć się ze zbirem danych. Gdy zbiór danych zostanie otwarty, DBGrid zostanie automatycznie wypełniony danymi.

Nasz program

Podstawy

Spróbujemy stworzyć program w oparciu o ten stworzony tutaj (w języku niderlandzkim), który jest oparty na oryginale (w języku angielskim) autorstwa Chris.

Formularz główny

Użyjemy tego samego ekranu głównego i zbudujemy całą funkcjonalność od podstaw :) Jak zobaczysz, jest tu o wiele mniej do zrobienia, ponieważ komponenty naprawdę rozwiązują wszystkie trudne rzeczy! Zacznijmy więc od stworzenia ekranu, który wygląda tak:

Trymysql pl.png

Korzystając z zakładki SQLdb umieść na swojej formatce komponenty TMySQL56Connection tmysql56connection.png (lub inną wersję klienta mysql), TSQLTransaction tsqltransaction.png i TSQLQuery tsqlquery.png. Nie zmieniaj domyślnych nazw nadanych tym komponentom. Z wyjątkiem komponentu łączącego do bazy. Aby artykuł był taki sam dla wszystkich wersji MySQL, nazwij komponent TMySQL##Connection: MySQLConnection1. Musimy te komponenty połączyć razem, aby mogły wykonywać swoją pracę. Dlatego należy ustawić następujące właściwości:

Komponent Właściwość Wartość
MySQLConnection1 Transaction SQLTransaction1
SQLTransaction1 Database MySQLConnection1
SQLQuery1 Transaction SQLTransaction1
SQLQuery1 Database MySQLConnection1

Właściwość Transaction komponentu SQLQuery1 zostanie ustawiona automatycznie, jeśli najpierw ustawisz właściwość Transaction dla MySQLConnection1. Gdy to ustawisz, zauważysz, że SQLTransaction1.Database została ustawiona na MySQLConnection1.

Jak wspomniano wcześniej: upewnij się, że używasz odpowiedniego komponentu połączenia dla swojej wersji serwera MySQL.

Kod

Jak widać na zrzucie ekranu, jedynymi przyciskami dostępnymi po uruchomieniu programu są „Połącz z serwerem” i „Zakończ”. Aby inne przyciski działały, potrzebujemy więcej informacji, więc są one wyłączone. Moglibyśmy również zdecydować o wyłączeniu opcji „Połącz z serwerem” do czasu podania informacji o hoście, nazwie użytkownika i haśle. Zdecydowałem się tego nie robić, ponieważ nasz użytkownik mógłby pomyśleć: „Nic nie wydaje się możliwe, więc przejdźmy do wyjścia”. :)

Zanim zacznę podawać jakikolwiek kod, chciałbym podkreślić, że w kodzie powinna być dodana obsługa wyjątków. Sekcje krytyczne należy umieścić w blokach kodu

try ... finally

i / lub

try ... except

Połączenie z serwerem

Pierwszą rzeczą, którą musimy zrobić, jest połączenie się z naszym serwerem. Ponieważ przy łączeniu nie wiemy, jakie bazy danych są dostępne na serwerze, przy połączeniu poprosimy o listę baz danych. Jest jednak jeden haczyk, aby nawiązać połączenie, musimy wprowadzić poprawną nazwę bazy danych we właściwościach MySQLConnection. W kodzie zobaczysz, że używam bazy danych „mysql”. Ta baza danych jest używana przez mysql do pewnych czynności porządkowych, więc zawsze tam będzie.

procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
begin
  // Sprawdź, czy mamy aktywne połączenie. Jeśli tak, musimy je zamknąć.
  if MySQLConnection1.Connected then CloseConnection(Sender);
  // Ustaw parametry połączenia.
  MySQLConnection1.HostName := HostEdit.Text;
  MySQLConnection1.UserName := UserEdit.Text;
  MySQLConnection1.Password := PasswdEdit.Text;
  MySQLConnection1.DatabaseName := 'mysql'; // Baza mysql jest zawsze dostępna!
  ShowString('Otwarcie połączenia z serwerem: ' + HostEdit.Text);
  MySQLConnection1.Open;
  // Najpierw pobierzmy listę dostępnych baz danych.
  if MySQLConnection1.Connected then begin
    ShowString('Połączono z serwerem: ' + HostEdit.Text);
    ShowString('Pobieranie listy dostępnych baz danych.');
    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('Lista otrzymanych baz danych!');
  end;
end;

Pierwszą rzeczą, jaką robimy, jest sprawdzenie, czy jesteśmy połączeni z serwerem, jeśli tak, wywołujemy prywatną metodę „CloseConnection”. W tej metodzie robi się więcej porządków. jak wyłączanie przycisków i czyszczenie comboboxów i listbox. Następnie ustawiamy niezbędne parametry, aby połączyć się z serwerem.

W całym naszym programie możesz zobaczyć wywołania ShowString. Ta metoda dodaje wiersz do notatki w naszym formularzu, który działa jak rodzaj dziennika.

Po ustawieniu parametrów możemy połączyć się z serwerem. Odbywa się to przez wywołanie

MySQLConnection1.Open;

W odpowiedniej aplikacji można by to umieścić w konstrukcji obsługi wyjątków, aby przedstawić użytkownikowi przyjazny komunikat w przypadku niepowodzenia połączenia. Kiedy jesteśmy połączeni, chcemy uzyskać listę baz danych z serwera. Aby uzyskać dane z serwera, używane jest zapytanie TSQLQuery. Właściwość SQL służy do przechowywania instrukcji SQL wysyłanej do serwera. MySQL zna polecenie „SHOW DATABASES”, aby uzyskać listę baz danych. Więc po ustawieniu tekstu SQL wywołujemy

SQLQuery1.Open;

W MySQL5 ustaw to, aby poprawić błąd ze składnią SQL:

SQLQuery1.ParseSQL := False; 
SQLQuery1.ReadOnly := True;

Zestaw wyników SQLQuery można sprawdzić za pomocą właściwości fields. Jak widać, przeglądamy wszystkie zapisy, wywołując

SQLQuery1.Next;

Kiedy dodamy wszystkie dostępne bazy danych do naszego combobox, ponownie zamykamy SQLQuery.

Wybieranie bazy danych

Jeśli użytkownik wybierze bazę danych w DatabaseComboBox, włączamy przycisk „Wybierz bazę danych”. W zdarzeniu OnClick tego przycisku ustawiamy DatabaseName MySQLConnection1 i żądamy listy tabel. Ostatnia instrukcja tej procedury włącza przycisk „Otwórz zapytanie”, dzięki czemu użytkownik może wprowadzić zapytanie w polu edycji „Polecenie” i wysłać je na serwer.

procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
begin
  // Baza danych została wybrana, więc pobierzmy z niej tabele.
  CloseConnection(Sender);
  if DatabaseComboBox.ItemIndex <> -1 then begin
    with DatabaseComboBox do
      MySQLConnection1.DatabaseName := Items[ItemIndex];
    ShowString('Pobieranie listy tabel');
    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('Lista otrzymanych tabel');
  end;
  OpenQueryButton.Enabled := True;
end;

MySQL ma specjalne polecenie do pobierania listy tabel, porównywalne do pobierania listy baz danych, „SHOW TABLES”. Wynik tego zapytania jest obsługiwany w taki sam sposób, jak lista baz danych, a wszystkie tabele są dodawane do TableComboBox. Możesz się zastanawiać, dlaczego nie otwieramy ponownie połączenia przed otwarciem zapytania? Cóż, odbywa się to automatycznie (jeśli to konieczne), gdy aktywujemy SQLQuery.

Pola w tabeli

W MySQL możesz ponownie użyć formy „SHOW”, aby pobrać pola w tabeli. W tym przypadku „SHOW COLUMNS FROM <nazwa tabeli>”. Jeśli użytkownik wybierze tabelę z TableComboBox, wyzwalane jest zdarzenie OnChangeEvent tego ComboBox, które wypełnia pole 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;

Oprócz nazw pól, zestaw wyników zawiera informacje o typie pola, jeśli pole jest kluczem, czy dozwolone są wartości null i nie tylko.

Wyświetlanie danych

Tak jak powiedzieliśmy, użyjemy komponentów do połączenia się z bazą danych, użyjmy również niektórych komponentów, aby pokazać dane. W drugim formularzu pokażemy siatkę z danymi żądanymi przez użytkownika. Formularz ten zostanie wyświetlony, gdy użytkownik wpisze polecenie SQL w polu edycji „Polecenie”, a następnie kliknie przycisk „Otwórz zapytanie”. To jest zdarzenie 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;

ShowQueryForm wygląda następująco:

Mysqlshow pl.png

i zawiera

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

Przycisk umieszczony jest na panelu. Kolejność działań w OnClick przycisku „Otwórz zapytanie” jest następująca. Najpierw tworzymy wystąpienie TShowQueryForm. Po drugie ustawiliśmy właściwość DataSet źródła danych na nasz SQLQuery1. Następnie ustawiamy polecenie SQLQuery SQL na to, co użytkownik wpisał w polu edycji „Polecenie” i otwieramy je. Następnie ShowQueryForm jest pokazywany modalnie, co oznacza, że ​​będzie się na nim koncentrował, dopóki nie zostanie zamknięty. Po zamknięciu „zwalniamy” go i ponownie zamykamy SQLQuery1.

Formularz można dodatkowo ulepszyć poprzez wstawienie metody modyfikowania zawartości TDataSet i ostatecznie DataBase. Pełną wersję można pobrać z http://digitus.itk.ppke.hu/~janma/lazarus/MySql5Test.tar.gz (dzięki Arwen i JZombi z Lazarus MySQL Forum) ale istotne szczegóły są następujące:

Dodaj przycisk u dołu formularza ShowQuery o nazwie AddButton i podpisem „Dodaj”. Utwórz metodę dla AddButtonClick w następujący sposób:

procedure TShowQueryForm.AddButtonClick(Sender: TObject);
begin
  DataSource1.DataSet.Append;
end;

Zmień kod dla OpenQueryButtonClick, aby umożliwić aktualizacje bazy danych po zakończeniu pracy z formularzem zapytania.

procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
begin
  ShowQueryForm := TShowQueryForm.Create(nil);
  try
    ShowQueryForm.DataSource1.DataSet := SQLQuery1;
    // Będziemy pisać w bazie danych, więc ustawmy ReadOnly na false,
    // a do tego musimy ustawić ParseSQL na true
    SQLQuery1.ParseSQL:=true;
    SQLQuery1.ReadOnly:=false;
    SQLQuery1.SQL.Text := CommandEdit.Text;
    SQLQuery1.Open;
    ShowQueryForm.ShowModal;
  finally
    // ustaw tryb aktualizacji i zaktualizuj bazę danych
    SQLQuery1.UpdateMode:=upWhereChanged;
    SQLQuery1.ApplyUpdates;
    SQLTransaction1.Commit;
    ShowQueryForm.Free;
    SQLQuery1.Close;
    // ustaw ReadOnly i ParsesSQL z powrotem na domyślne
    SQLQuery1.ParseSQL:=false;
    SQLQuery1.ReadOnly:=true;
  end;
end;

Możemy teraz dodawać rekordy do bazy danych. Jeśli dodamy TDBNavigator do formularza ShowQuery, możemy łatwiej poruszać się po siatce danych i edytować rekordy; baza danych jest aktualizowana o nasze zmiany za każdym razem, gdy zamykamy formularz ShowQuery i możemy to przetestować, otwierając go ponownie w celu sprawdzenia bazy danych.

Jeśli chcesz mieć możliwość USUWANIA lub w inny sposób modyfikowania rekordów w oryginalnej bazie danych (tj. trzeba upewnić się, że zmiany wprowadzone w lokalnym zestawie danych zostaną zatwierdzone z powrotem w bazie danych), musisz mieć jedną kolumnę w tabeli bazy danych, która jest kluczem podstawowym autoincremented, ponieważ metoda 'delete' wymaga możliwości wygenerowania klauzuli 'where' podczas zapisywania instrukcji z powrotem do bazy danych, aby zidentyfikować rekordy wybrane do usunięcia. Użyj więc następującego kodu w swoim kliencie MySQL (wszystko może być wpisane w jednej linii, ale dla przejrzystości dodano podziały linii):

ALTER TABLE TRESTRIG 
ADD COLUMN AUTOID INT 
PRIMARY KEY AUTO_INCREMENT;

a wtedy zauważysz, że przycisk Usuń w nawigatorze działa.

Źródła

Oryginalne źródła tego projektu można pobrać tutaj. Aby uzyskać więcej projektów demonstracyjnych, zobacz sourceforge.

Light bulb  Uwaga: Projekty te powstały w latach 2004-2009 i nie były aktualizowane. Bez kilku poprawek mogą nie kompilować się w obecnym Lazarus 2.0.10.

Zobacz także