Difference between revisions of "mysql/pl"

From Lazarus wiki
(Kopia strony en)
 
m (Undo revision 143191 by Slawek (talk))
(Tag: Undo)
 
(31 intermediate revisions by the same user not shown)
Line 3: Line 3:
 
{{Infobox databases}}
 
{{Infobox databases}}
  
== Overview ==
+
== Przegląd ==
You can use Free Pascal/Lazarus to access a MySQL database server.
+
Możesz użyć Free Pascal/Lazarus, aby uzyskać dostęp do serwera bazy danych MySQL.
  
Win64: please see warning [[Windows Programming Tips#FPC 2.6.x/Lazarus warning|here]] on not using certain FPC/Lazarus Win64 versions.
+
Win64: zobacz ostrzeżenie [[Windows Programming Tips#FPC 2.6.x/Lazarus warning|tutaj]] dotyczące nieużywania niektórych wersji FPC/Lazarus Win64.
  
Advantages of MySQL:
+
Zalety MySQL:
* It is very widely used and available
+
* Jest bardzo szeroko stosowany i dostępny
* Though older versions had a deserved reputation of not being true RDBMSes, newer versions support ACID properties if properly set up (with the right storage backend)
+
* Chociaż starsze wersje miały zasłużoną opinię, że nie są prawdziwymi RDBMS, nowsze wersje obsługują właściwości ACID, jeśli są prawidłowo skonfigurowane (z odpowiednim zapleczem pamięci)
  
Disadvantages of MySQL:
+
Wady MySQL:
* The MySQL maintainers break binary compatibility between client library versions. This means that an FPC/Lazarus translation needs to be made for each new version, which slows things down.
+
* Opiekunowie MySQL łamią binarną kompatybilność między wersjami bibliotek klienta. Oznacza to, że dla każdej nowej wersji trzeba wykonać tłumaczenie FPC/Lazarus, co spowalnia działanie.
* The license may be restrictive to some users (e.g. in commercial deployments). There are compatible, possibly less restrictive alternatives like MariaDB.
+
* Licencja może być ograniczona dla niektórych użytkowników (np. We wdrożeniach komercyjnych). Istnieją kompatybilne, prawdopodobnie mniej restrykcyjne alternatywy, takie jak MariaDB.
  
A lot of Lazarus/FPC users prefer [[Firebird]] or [[postgresql|PostgreSQL]] databases for this reason.
+
Z tego powodu wielu użytkowników Lazarusa/FPC preferuje bazy danych [[Firebird]] lub [[postgresql|PostgreSQL]].
  
== MySQL licensing ==
+
== Licencjonowanie MySQL ==
Before a significant MySQL deployment, don't forget to read its [http://www.mysql.com/about/legal/licensing/index.html license].
+
Przed znaczącym wdrożeniem MySQL nie zapomnij przeczytać jej [http://www.mysql.com/about/legal/licensing/index.html licencji].
  
==SQLDB==
+
== SQLDB ==
Lazarus 1.2 (with FPC 2.6.2), supports
+
Lazarus 1.2 (z FPC 2.6.2), obsługuje
* MySQL 4.0 client library
+
* Biblioteka klienta MySQL 4.0
* MySQL 4.1 client library
+
* Biblioteka klienta MySQL 4.1
* MySQL 5.0 client library
+
* Biblioteka klienta MySQL 5.0
* MySQL 5.1 client library
+
* Biblioteka klienta MySQL 5.1
* MySQL 5.5 client library (supported since Lazarus 1.0.8)
+
* Biblioteka klienta MySQL 5.5 (obsługiwana od wersji Lazarus 1.0.8)
* MySQL 5.6 client library (supported since Lazarus <fill in>)
+
* Biblioteka klienta MySQL 5.6 (obsługiwana od Lazarusa ?)
  
[[Image:sqldbcomponents.png‎]]
+
[[Image: sqldbcomponents2.png]]
  
Newer versions of FPC/Lazarus may support newer MySQL client libraries.
+
Nowsze wersje FPC/Lazarus mogą obsługiwać nowsze biblioteki klienta MySQL.
  
Make sure you are using the correct connection component for your '''client''' library version. So if you have the client libraries installed for MySQL 4.1 then you have to use TMySQL41Connection component, '''even if the server is running''' version 4.0 or 5.0. The reason for this is that MySQL client libraries often break compatibility of their API so each version needs a different Pascal driver.
+
Upewnij się, że używasz odpowiedniego komponentu połączenia dla swojej wersji biblioteki '''klienta'''. Więc jeśli masz zainstalowane biblioteki klienta dla MySQL 4.1, musisz użyć komponentu TMySQL41Connection, '''nawet jeśli serwer działa''' w wersji 4.0 lub 5.0. Powodem tego jest to, że biblioteki klienckie MySQL często łamią kompatybilność ich API, więc każda wersja wymaga innego sterownika Pascala.
  
On *nix systems, the SQLDB code may look for the plain version of the library without version number suffixes. There are several ways you can deal with this:
+
W systemach typu *nix kod SQLDB może szukać zwykłej wersji biblioteki bez sufiksów numerów wersji. Możesz sobie z tym poradzić na kilka sposobów:
* (on many Linuxes) installing the -dev version of the library
+
* (w wielu Linuksach) zainstalowanie biblioteki w wersji -dev  
* symlinking your specific library name to the one FPC is looking for (rather hackish)
+
* utworzenie dowiązania symbolicznego twojej konkretnej nazwy biblioteki do tej, której szuka FPC (raczej hakerskie)
* use [[TSQLDBLibraryLoader]] to specify the library name before loading the connection
+
* użycie [[TSQLDBLibraryLoader]], aby określić nazwę biblioteki przed załadowaniem połączenia
  
==SQLDB tutorials and example code==
+
== Samouczki SQLDB i przykładowy kod ==
''BigChimp September 2012: note: a lot of this is duplicate code and could be consolidated. I propose to move as much as possible to the GUI-oriented SQLDB Tutorial1 and create a separate page FPC database tutorial to create a text mode sample''
+
''BigChimp wrzesień 2012: uwaga: wiele z tych samouczków to zduplikowany kod i można je skonsolidować. Proponuję przenieść jak najwięcej do samouczka SQLDB zorientowanego na GUI i utworzyć osobną stronę samouczka bazy danych FPC, aby utworzyć przykład trybu tekstowego''
=== Get MySQL working in Linux or Windows ===
+
=== Uruchom serwer MySQL działający w systemie Linux lub Windows ===
Follow the instructions in the MySQL User Manual. Make sure that the mysqld daemon runs reliably, and that all potential users (including root, mysql, yourself and anybody else that may need it) have as many privileges as they need, from as many hosts as may be needed (such as 'localhost', the local host's name, and other hosts on your network) as far as is consistent with security. It is preferable that all users including root have passwords. Test the action of the database system using the examples given in the manual, and check that all users really do have reliable access.
+
Postępuj zgodnie z instrukcjami zawartymi w podręczniku użytkownika MySQL. Upewnij się, że demon mysqld działa niezawodnie i że wszyscy potencjalni użytkownicy (w tym root, mysql, Ty i wszyscy inni, którzy mogą tego potrzebować) mają tyle uprawnień, ile potrzebują, z tylu hostów, ile potrzeba (takich jak 'localhost', nazwa hosta lokalnego i inne hosty w twojej sieci), o ile jest to zgodne z bezpieczeństwem. Zaleca się, aby wszyscy użytkownicy, w tym root, mieli hasła. Przetestuj działanie systemu bazy danych, korzystając z przykładów podanych w instrukcji i sprawdź, czy wszyscy użytkownicy naprawdę mają niezawodny dostęp.
  
=== Get MySQL working for FPC in text mode ===
+
=== Spraw, aby MySQL działał dla FPC w trybie tekstowym ===
There is a directory with an example program in $(fpc<b>src</b>dir)/packages/base/mysql/. You can find the fpc source directory in Lazarus: Tools -> Options -> Files -> FPC source directory. Possible paths for the mysql directory are /usr/share/fpcsrc/packages/base/mysql/ (rpm install) or C:\lazarus\fpcsrc\packages\base\mysql\ (windows). This directory also contains the units mysql.pp, mysql_com.pp and mysql_version.pp. Before running the test script, you need to create a database called testdb: do this by logging into the mysql monitor (as root with full privileges) and issuing the following SQL statement
+
W katalogu $(fpc<b>src</b>dir)/packages/base/mysql/ znajduje się przykładowy program. Możesz znaleźć katalog ze źródłami fpc w Lazarusie: Narzędzia -> Opcje -> Pliki -> Katalog źródłowy FPC (en: Tools -> Options -> Files -> FPC source directory). Możliwe ścieżki do katalogu mysql to /usr/share/fpcsrc/packages/base/mysql/ (rpm install) lub C:\lazarus\fpcsrc\packages\base\mysql\ (windows). Ten katalog zawiera również moduły mysql.pp, mysql_com.pp i mysql_version.pp. Przed uruchomieniem skryptu testowego musisz utworzyć bazę danych o nazwie testdb: zrób to, logując się do monitora mysql (jako root z pełnymi uprawnieniami) i wydając następującą instrukcję SQL:
 
<syntaxhighlight lang="sql">CREATE DATABASE testdb;</syntaxhighlight>
 
<syntaxhighlight lang="sql">CREATE DATABASE testdb;</syntaxhighlight>
then make sure that all relevant users have appropriate access privileges to it
+
następnie upewnij się, że wszyscy właściwi użytkownicy mają do niego odpowiednie uprawnienia dostępu
 
<syntaxhighlight lang="sql">GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';</syntaxhighlight>
 
<syntaxhighlight lang="sql">GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';</syntaxhighlight>
There is a script called mkdb which you should now try to run:
+
Istnieje skrypt o nazwie mkdb, który powinieneś teraz spróbować uruchomić:
 
  sh ./mkdb
 
  sh ./mkdb
This will probably fail, as the system will not allow an anonymous user to access the database. So change the script using an editor so that the line invoking mysql reads:
+
Prawdopodobnie zakończy się to niepowodzeniem, ponieważ system nie pozwoli anonimowemu użytkownikowi uzyskać dostęp do bazy danych. Zmień więc skrypt za pomocą edytora tak, aby wiersz wywołujący mysql brzmiał:
 
  mysql -u root -p  ${1-testdb} << EOF >/dev/null
 
  mysql -u root -p  ${1-testdb} << EOF >/dev/null
and try running it again, entering your password when prompted. With luck you might have managed to create the test database: test it (while logged in to the mysql monitor) by issuing the mysql statement
+
i spróbuj uruchomić go ponownie, wprowadzając hasło po wyświetleniu monitu. Przy odrobinie szczęścia mogłeś stworzyć testową bazę danych: przetestuj ją (będąc zalogowanym do monitora mysql), wydając instrukcję mysql
 
<syntaxhighlight lang="sql">select * from FPdev;</syntaxhighlight>
 
<syntaxhighlight lang="sql">select * from FPdev;</syntaxhighlight>
You should see a table listing the ID, username and email address of some of the FPC developers.
+
Powinieneś zobaczyć tabelę zawierającą ID, nazwę użytkownika i adres e-mail niektórych programistów FPC.
  
Now try to run the test program testdb.pp (this may need to be compiled, and will almost certainly fail on the first attempt!!).
+
Teraz spróbuj uruchomić program testowy testdb.pp (może to wymagać skompilowania i prawie na pewno zakończy się niepowodzeniem przy pierwszej próbie !!).
  
I found that the program could not connect to mysql for several reasons:
+
Zauważyłem, że program nie mógł połączyć się z mysql z kilku powodów:
  
* My system (SuSE Linux v9.0) installs mysql v4.0.15, not the version3 for which the package was designed.
+
* Mój system (SuSE Linux v9.0) instaluje mysql v4.0.15, a nie wersję 3, dla której pakiet został zaprojektowany.
  
* The program needs to have user names and passwords to get access to the database.
+
* Program musi mieć nazwy użytkowników i hasła, aby uzyskać dostęp do bazy danych.
  
* The compiler needs to know where to find the mysql libraries (IF YOU HAVEN'T INSTALLED THE MYSQL DEVELOPMENT LIBRARIES, DO SO NOW!)
+
* Kompilator musi wiedzieć, gdzie znaleźć biblioteki mysql (JEŚLI NIE ZAINSTALOWAŁEŚ BIBLIOTEK PROGRAMISTYCZNYCH MYSQL, ZRÓB TO TERAZ!)
  
I created a copy of testdb.pp called trydb.pp, rather than editing the original - this means that the original files still get fixed in subsequent CVS updates.
+
Utworzyłem kopię pliku testdb.pp o nazwie trydb.pp, zamiast edytować oryginał - oznacza to, że oryginalne pliki nadal są naprawiane w kolejnych aktualizacjach CVS.
I also copied the files found in the subdirectory mysql/ver40/ into the main mysql/ subdirectory, renaming them mysql_v4.pp, mysql_com_v4.pp and mysql_version_v4.pp, being sure to rename the units within each file correspondingly. I changed the uses statement in trydb.pp to
+
Skopiowałem również pliki znalezione w podkatalogu mysql/ver40/ do głównego podkatalogu mysql/, zmieniając ich nazwy na mysql_v4.pp, mysql_com_v4.pp i mysql_version_v4.pp, pamiętając o zmianie nazwy modułóww każdym pliku. Zmieniłem instrukcję użycia w trydb.pp na
  
 
<syntaxhighlight lang=pascal>uses mysql_v4</syntaxhighlight>
 
<syntaxhighlight lang=pascal>uses mysql_v4</syntaxhighlight>
and the statement in mysql_v4.pp to
+
i oświadczenie w mysql_v4.pp do
  
 
<syntaxhighlight lang=pascal>uses mysql_com_v4</syntaxhighlight>
 
<syntaxhighlight lang=pascal>uses mysql_com_v4</syntaxhighlight>
  
I added a line to /etc/fpc.cfg to point to my libraries:
+
Dodałem wiersz do /etc/fpc.cfg, aby wskazać moje biblioteki:
 
  -Fl/lib;/usr/lib
 
  -Fl/lib;/usr/lib
The following step might not be necessary if the devel-libraries are installed as the links will be created for you, but it never hurts to check.
+
Następujący krok może nie być konieczny, jeśli biblioteki deweloperskie są zainstalowane, ponieważ łącza zostaną utworzone za Ciebie, ale sprawdzenie nigdy nie zaszkodzi.
I had to find the real name of the mysqlclint library in the /usr/lib directory and in my case I had to issue the shell command:
+
Musiałem znaleźć prawdziwą nazwę biblioteki mysqlclint w katalogu /usr/lib i w moim przypadku musiałem wydać polecenie powłoki:
 
  ln -s libmysqlclient.so.12.0.0 lmysqlclient
 
  ln -s libmysqlclient.so.12.0.0 lmysqlclient
to make a symbolic link allowing FPC to find the library. For good measure I also created the link
+
aby utworzyć dowiązanie symboliczne umożliwiające FPC znalezienie biblioteki. Na wszelki wypadek stworzyłem też link
 
  ln -s libmysqlclient.so.12.0.0 mysqlclient
 
  ln -s libmysqlclient.so.12.0.0 mysqlclient
and placed similar links in various other directories: not strictly necessary, but just in case ...!
+
i umieściłem podobne linki w różnych innych katalogach: nie jest to absolutnie konieczne, ale na wszelki wypadek ...!
Some users might need to add the following link:
+
Niektórzy użytkownicy mogą potrzebować dodać następujące łącze:
 
  ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
 
  ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
  
I modified trydb.pp to include user details, initially by adding host, user and password as constants:
+
Zmodyfikowałem trydb.pp, aby zawierał dane użytkownika, początkowo dodając hosta, użytkownika i hasło jako stałe Pchar:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 97: Line 97:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
{{Warning|This section looks extremely outdated. If you are still on MySQL 4 perhaps it is time to upgrade}}
+
{{Uwaga|Ta sekcja wygląda na wyjątkowo nieaktualną. Jeśli nadal korzystasz z MySQL 4, być może nadszedł czas na aktualizację}}
I also found that I couldn't connect to mysql using the mysql_connect() call, but had to use mysql_real_connect() which has many more parameters. To complicate things further, the number of parameters seems to have changed between version3 (where there are seven) and version4 (where there are eight). Before using mysql_real_connect I had to use mysql_init() which is not found in the original mysql.pp but is found in mysql_v4.pp.
+
Odkryłem również, że nie mogę połączyć się z mysql za pomocą wywołania mysql_connect(), ale musiałem użyć mysql_real_connect(), który ma o wiele więcej parametrów. Aby jeszcze bardziej skomplikować sprawę, wydaje się, że liczba parametrów zmieniła się między wersją 3 (w której jest siedem) a wersją 4 (w której jest osiem). Przed użyciem mysql_real_connect musiałem użyć mysql_init(), którego nie ma w oryginalnym mysql.pp, ale znajduje się w mysql_v4.pp.
  
So the code for connection to the database is now:
+
Tak więc kod do połączenia z bazą danych to teraz:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
{ a few extra variables}
+
{ kilka dodatkowych zmiennych }
 
var
 
var
 
   alloc : PMYSQL;
 
   alloc : PMYSQL;
 
    
 
    
{main program fragment}
+
{fragment głównego programu}
 
    
 
    
 
begin
 
begin
Line 116: Line 116:
 
   end;
 
   end;
 
    
 
    
   Writeln('Allocating Space...');
+
   Writeln('Przydzielanie miejsca ...');
 
   alloc := mysql_init(PMYSQL(@qmysql));
 
   alloc := mysql_init(PMYSQL(@qmysql));
   Write('Connecting to MySQL...');
+
   Write('Łączę się z MySQL ...');
 
   sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
 
   sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
 
   if sock=Nil then
 
   if sock=Nil then
 
   begin
 
   begin
     Writeln(stderr,'Couldn''t connect to MySQL.');
+
     Writeln(stderr,'Nie można połączyć się z MySQL');
     Writeln(stderr, 'Error was: ', mysql_error(@qmysql));
+
     Writeln(stderr, 'Błąd: ', mysql_error(@qmysql));
 
     halt(1);
 
     halt(1);
 
   end;
 
   end;
   Writeln('Done.');
+
   Writeln('Gotowe.');
   Writeln('Connection data:');
+
   Writeln('Parametry połączenia:');
 
  {$ifdef Unix}
 
  {$ifdef Unix}
 
   writeln('Mysql_port      : ',mysql_port);
 
   writeln('Mysql_port      : ',mysql_port);
Line 136: Line 136:
 
   writeln('Client info    : ',mysql_get_client_info);
 
   writeln('Client info    : ',mysql_get_client_info);
 
    
 
    
   Writeln('Selecting Database ',DataBase,'...');
+
   Writeln('Wybór bazy danych ',DataBase,'...');
 
   if mysql_select_db(sock, DataBase) < 0 then
 
   if mysql_select_db(sock, DataBase) < 0 then
 
   begin
 
   begin
     Writeln(stderr,'Couldn''t select database ',Database);
+
     Writeln(stderr,'Nie udało się wybrać bazy danych ',Database);
 
     Writeln(stderr,mysql_error(sock));
 
     Writeln(stderr,mysql_error(sock));
 
     halt(1);
 
     halt(1);
 
   end;
 
   end;
  {... as original contents of testdb.pp}
+
  {... dalej oryginalna zawartość pliku testdb.pp}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Now - ready to start compiling trydb.pp?
+
Teraz - gotowy do rozpoczęcia kompilacji trydb.pp?
 
   fpc trydb
 
   fpc trydb
success! Now run it:
+
sukces! Teraz uruchom to:
 
   ./trydb
 
   ./trydb
whoopeeI got the listing of the FPC developers!
+
SuperMam listę twórców FPC!
  
A few extra refinements: make the entry of user details and the mysql commands interactive, using variables rather than constants, and allow several SQL commands to be entered, until we issue the quit command: see the [[Lazarus Database Tutorial/TryDbpp|full program listing]], where user details are entered from the console, and the program goes into a loop where SQL commands are entered from the console (without the terminal semicolon) and the responses are printed out, until 'quit' is entered from the keyboard.
+
Kilka dodatkowych ulepszeń: uczyń wprowadzanie danych użytkownika i poleceń mysql interaktywnymi, używając zmiennych zamiast stałych, i pozwól na wprowadzenie kilku poleceń SQL, dopóki nie wydamy polecenia quit: zobacz [[Lazarus Database Tutorial/TryDbpp|pełna lista programów]], gdzie dane użytkownika są wprowadzane z konsoli, a program przechodzi w pętlę, w której z konsoli wprowadza się polecenia SQL (bez średnika terminala) i wypisuje odpowiedzi, aż do wpisania „quit” z klawiatury.
  
See [[Lazarus Database Tutorial/SampleListing|Sample Console Listing]].
+
Zobacz [[Lazarus Database Tutorial/SampleListing|przykładową lista konsoli]].
  
===Connecting to MySQL from a Lazarus Application ===
+
=== Łączenie się z MySQL z aplikacji Lazarus ===
  
This tutorial shows how to connect Lazarus to the MySQL database, and execute simple queries, using only the basic Lazarus components; it uses no Data Aware components, but illustrates the principles of interfacing with the database.
+
Ten poradnik pokazuje, jak podłączyć Lazarus do bazy danych MySQL i wykonywać proste zapytania, używając tylko podstawowych komponentów Lazarusa; nie używa żadnych komponentów Data Aware, ale ilustruje zasady współpracy z bazą danych.
  
Create a new project in Lazarus:
+
Utwórz nowy projekt w Lazarusie:
  Project -> New Project -> Application
+
  Projekt -> Nowy projekt -> Aplikacja (en: Project -> New Project -> Application)
A new automatically generated Form will appear.
+
Pojawi się nowy automatycznie wygenerowany formularz.
  
Enlarge the form to fill about half of the screen, then re-name the form and its caption to 'TryMySQL'.
+
Powiększ formularz, aby wypełnić mniej więcej połowę ekranu, a następnie zmień nazwę formularza i jego podpis na „TryMySQL”.
  
From the Standard Component tab place three Edit Boxes on the upper left side of the Form, and immediately above each box place a label. Change the names and captions to 'Host' (and HostLLabel,HostEdit), 'UserName' (and UserLabel, UserEdit) and 'Password' (with PasswdLabel and PasswdEdit). Alternatively you could use LabelledEdit components from the Additional tab.
+
Z zakładki komponentów Standard umieść trzy pola edycji w lewym górnym rogu formularza i bezpośrednio nad każdym z nich umieść etykietę. Zmień im odpowiednio właściwość Caption na „Serwer” lub „Host” (a Name na HostLLabel, HostEdit), „Użytkownik” (i UserLabel, UserEdit) oraz „Hasło” (z PasswdLabel i PasswdEdit). Alternatywnie możesz użyć komponentów LabelledEdit z zakładki Additional.
  
Select the Passwd Edit box and find the PasswordChar property: change this to * or some other character, so that when you type in a password the characters do not appear on your screen but are echoed by a series of *s. Make sure that the Text property of each edit box is blank.
+
Zaznacz pole Passwd Edit i znajdź właściwość PasswordChar: zmień to na * lub inny znak, aby po wpisaniu hasła znaki nie pojawiały się na ekranie, ale były powtarzane serią znków *. Upewnij się, że właściwość Text każdego pola edycji jest pusta.
  
Now place another Edit box and label at the top of the right side of your form. Change the label to 'Enter SQL Command' and name it CommandEdit.
+
Teraz umieść kolejne pole edycji i etykietę u góry po prawej stronie formularza. Zmień etykietę na „Wpisz polecenie SQL” i nazwij ją CommandEdit.
  
Place three Buttons on the form: two on the left under the Edit boxes, and one on the right under the command box.
+
Umieść trzy przyciski na formularzu: dwa po lewej stronie pod polami edycji i jeden po prawej stronie pod polem poleceń.
  
Label the buttons on the left 'Connect to Database' (ConnectButton)and 'Exit' (ExitButton) and the one on the right 'Send Query' (QueryButton).
+
Oznacz przyciski po lewej stronie „Połącz z bazą” (ConnectButton) i „Wyjdź” (ExitButton), a przycisk po prawej stronie „Wyślij zapytanie” (QueryButton).
  
Place a large Memo Box labelled and named 'Results' (ResultMemo) on the lower right, to fill most of the available space. Find its ScrollBars property and select ssAutoBoth so that scroll bars appear automatically if text fills the space. Make the WordWrap property True.
+
Umieść duże okno memo z etykietą i nazwą ją „Wyniki” (ResultMemo) w prawym dolnym rogu, aby wypełnić większość dostępnego miejsca. Znajdź właściwość ScrollBars i wybierz ssAutoBoth, aby paski przewijania pojawiały się automatycznie, jeśli tekst wypełni przestrzeń. Ustaw właściwość WordWrap na True.
  
Place a Status Bar (from the Common Controls tab) at the bottom of the Form, and make its SimpleText property 'TryMySQL'.
+
Umieść pasek stanu Status Bar(z zakładki Common Controls) na dole formularza i ustaw jego właściwość SimpleText na „TryMySQL”.
  
A screenshot of the Form can be seen here: [http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png Mysql Example Screenshot]
+
Zrzut ekranu formularza można zobaczyć tutaj: [http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png Mysql Przykładowy zrzut ekranu]
  
Now we need to write some event handlers.
+
Teraz musimy napisać kilka procedur obsługi zdarzeń.
  
The three Edit boxes on the left are for entry of hostname, username and password. When these have been entered satisfactorily, the Connect Button is clicked. The OnCLick event handler for this button is based on part of the text-mode FPC program above.
+
Trzy pola edycji po lewej stronie służą do wprowadzania nazwy hosta (adresu serwera), nazwy użytkownika i hasła. Gdy zostaną one wprowadzone pomyślnie, kliknij przycisk Połącz. Procedura obsługi zdarzeń OnCLick dla tego przycisku jest oparta częściowo na powyższym programie FPC w trybie tekstowym.
  
The responses from the database should be converted into strings and displayed in the Memo box. Text mode Pascal write and writeln statements are capable of performing a lot of type conversion 'on the fly', but the use of a memo box for text output requires explicit conversion of data types to the correct string: so Pchar variables have to be converted to strings using StrPas, and integers have to be converted with IntToStr.
+
Odpowiedzi z bazy danych należy zamienić na ciągi znaków i wyświetlić w polu Memo. Instrukcje tryby tekstowego Pascala write i writeln, mogą wykonywać wiele konwersji 'w locie', ale użycie pola Memo do wyjścia tekstowego wymaga jawnej konwersji typów danych na poprawny ciąg: dlatego zmienne Pchar muszą zostać przekonwertowane na ciągi typu String przy użyciu funkcji StrPas, a liczby całkowite muszą być konwertowane za pomocą IntToStr.
  
Strings are displayed in the Memo box using:
+
Ciągi znaków są wyświetlane w polu Memo przy użyciu:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
 
procedure ShowString(S : string);
 
procedure ShowString(S : string);
(* display a string in a Memo box *)
+
(* wyświetl ciąg w polu Memo *)
 
begin
 
begin
 
   trymysqlForm1.ResultsMemo.Lines.Add(S)
 
   trymysqlForm1.ResultsMemo.Lines.Add(S)
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
The ConnectButton event handler thus becomes:
+
Procedura obsługi zdarzeń ConnectButton wygląda następująco:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
 
procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
 
procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
(* Connect to MySQL using user data from Text entry boxes on Main Form *)
+
(* Połącz się z MySQL przy użyciu danych użytkownika z pól tekstowych głównego formularza *)
 
var strg: string;
 
var strg: string;
 
    
 
    
Line 216: Line 216:
 
   if sock=Nil then
 
   if sock=Nil then
 
     begin
 
     begin
       strg :='Couldn''t connect to MySQL.'; showstring (strg);
+
       strg :='Nie można połączyć się z MySQL.'; showstring (strg);
       Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
+
       Strg :='Błąd: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
 
     end
 
     end
 
     else
 
     else
 
     begin
 
     begin
       trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
+
       trymysqlForm1.statusBar1.simpletext := 'Połączono z MySQL';
       strg := 'Now choosing database : ' + database; showstring (strg);
+
       strg := 'Teraz wybieram bazę danych: ' + database; showstring (strg);
 
  {$ifdef Unix}
 
  {$ifdef Unix}
 
       strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);
 
       strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);
Line 232: Line 232:
 
       Strg :='Client info    : ' + Strpas(mysql_get_client_info);  showstring (strg);
 
       Strg :='Client info    : ' + Strpas(mysql_get_client_info);  showstring (strg);
 
    
 
    
       trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
+
       trymysqlForm1.statusbar1.simpletext := 'Wybór bazy danych ' + DataBase +'...';
 
       if mysql_select_db(sock,DataBase) < 0 then
 
       if mysql_select_db(sock,DataBase) < 0 then
 
       begin
 
       begin
         strg :='Couldn''t select database '+ Database; ShowString (strg);
+
         strg :='Nie udało się wybrać bazy danych '+ Database; ShowString (strg);
 
         Strg := mysql_error(sock); ShowString (strg);
 
         Strg := mysql_error(sock); ShowString (strg);
 
       end
 
       end
Line 241: Line 241:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
The Text Box on the right allows entry of a SQL statement, without a terminal semicolon; when you are satisfied with its content or syntax, the SendQuery button is pressed, and the query is processed, with results being written in the ResultsMemo box.
+
Pole tekstowe po prawej stronie umożliwia wprowadzenie instrukcji SQL bez średnika terminala; gdy jesteś zadowolony z jego zawartości lub składni, naciśnij przycisk SendQuery, zapytanie zostanie przetworzone, a wyniki zostaną zapisane w polu ResultsMemo.
  
The SendQuery event handler is again based on the FPC text-mode version, except that once again explicit type-conversion has to be done before strings are displayed in the box.
+
Procedura obsługi zdarzeń SendQuery jest ponownie oparta na wersji trybu tekstowego FPC, z tą różnicą, że ponownie należy wykonać jawną konwersję typu, zanim ciągi zostaną wyświetlone w polu Memo.
  
A difference from the text-mode FPC program is that if an error condition is detected, the program does not halt and MySQL is not closed; instead, control is returned to the main form and an opportunity is given to correct the entry before the command is re-submitted. The application finally exits (with closure of MySQL) when the Exit Button is clicked.
+
Różnica w stosunku do programu FPC działającego w trybie tekstowym polega na tym, że w przypadku wykrycia błędu program nie zatrzymuje się, a MySQL nie jest zamykany; zamiast tego sterowanie wraca do głównego formularza i daje możliwość poprawienia wpisu przed ponownym wysłaniem polecenia. Aplikacja zostaje ostatecznie zamknięta (z zamknięciem MySQL) po kliknięciu przycisku 'Zakończ'.
  
The code for SendQuery follows:
+
Kod dla SendQuery jest następujący:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 257: Line 257:
 
   dumquery := dumquery+#0;
 
   dumquery := dumquery+#0;
 
   query := @dumquery[1];
 
   query := @dumquery[1];
   trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
+
   trymysqlForm1.statusbar1.simpletext := 'Wykonywanie zapytania: '+ dumQuery +'...';
   strg := 'Executing query : ' + dumQuery; showstring (strg);
+
   strg := 'Wykonywanie zapytania: ' + dumQuery; showstring (strg);
 
   if (mysql_query(sock,Query) < 0) then
 
   if (mysql_query(sock,Query) < 0) then
 
   begin
 
   begin
     Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);
+
     Strg :='Zapytanie nie powiodło się '+ StrPas(mysql_error(sock)); showstring (strg);
 
   end
 
   end
 
   else
 
   else
Line 268: Line 268:
 
     if RecBuf=Nil then
 
     if RecBuf=Nil then
 
     begin
 
     begin
       Strg :='Query returned nil result.'; showstring (strg);
+
       Strg :='Zapytanie zwróciło wynik nil.'; showstring (strg);
 
     end
 
     end
 
     else
 
     else
 
     begin
 
     begin
       strg :='Number of records returned  : ' + IntToStr(mysql_num_rows (recbuf));
+
       strg :='Liczba zwróconych rekordów: ' + IntToStr(mysql_num_rows (recbuf));
 
       Showstring (strg);
 
       Showstring (strg);
       Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));
+
       Strg :='Liczba pól w rekordzie: ' + IntToStr(mysql_num_fields(recbuf));
 
       showstring (strg);
 
       showstring (strg);
 
       rowbuf := mysql_fetch_row(recbuf);
 
       rowbuf := mysql_fetch_row(recbuf);
 
       while (rowbuf <>nil) do
 
       while (rowbuf <>nil) do
 
       begin
 
       begin
         Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +
+
         Strg :='(Id: '+ rowbuf[0]+', Imię: ' + rowbuf[1]+ ', Email : ' +
 
         rowbuf[2] +')';
 
         rowbuf[2] +')';
 
         showstring(strg);
 
         showstring(strg);
Line 288: Line 288:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
Save your Project, and press Run -> Run
+
Zapisz swój projekt i naciśnij Uruchom -> Uruchom (en: Run -> Run)
  
==== Download example source code ====
+
==== Pobierz przykładowy kod źródłowy ====
{{Warning|Current versions of Lazarus/FPC require committing all MySQL transactions. This was not necessary in earlier versions. The code download likely will not work until it is updated.}}
+
{{Uwaga| Obecne wersje Lazarusa/FPC wymagają zatwierdzania wszystkich transakcji MySQL. Nie było to konieczne we wcześniejszych wersjach. Pobrany kodu prawdopodobnie nie zadziała, dopóki nie zostanie zaktualizowany.}}
A full listing of the  program is available here [http://sourceforge.net/projects/lazarus-ccr/files/Demos%20and%20examples/MySql%20demo%20using%20SQLdb%20components%208%20April%202005/mysql_demo_20050408.tar.gz/download Sample Source Code]
+
Pełny listing programu jest dostępny tutaj [http://sourceforge.net/projects/lazarus-ccr/files/Demos%20and%20examples/MySql%20demo%20using%20SQLdb%20components%208%20April%202005/mysql_demo_20050408.tar.gz / pobierz przykładowy kod źródłowy]
  
=== Lazarus, MySQL and UTF-8 ===
+
=== Lazarus, MySQL i UTF-8 ===
''The following may be required for other codepages/character sets as well''
+
'' Poniższe może być wymagane również w przypadku innych stron kodowych/zestawów znaków''
  
UTF-8 Unicode is a convenient multibyte character set encoding, that allows working with multilingual texts without requiring WideStrings. It is supported both by Lazarus SQLdb components and by MySQL since version 4.1 by choosing the appropriate character set.  
+
UTF-8 Unicode to wygodne wielobajtowe kodowanie zestawu znaków, które umożliwia pracę z tekstami wielojęzycznymi bez konieczności stosowania WideStrings. Obsługiwany jest zarówno przez komponenty Lazarus SQLdb, jak i MySQL od wersji 4.1 poprzez wybór odpowiedniego zestawu znaków.
  
However, simply setting this encoding as default for
+
Jednak ustawiając to kodowanie tak po prostu jako domyślne dla
* your tables and
+
* twojej tabeli i
* the MySQL connection component (e.g. <code>TMySQL51Connection.CharSet:='UTF8';</code>)  
+
* komponentu połączenia MySQL (np. <code> TMySQL51Connection.CharSet:='UTF8';</code>)
will result in incorrect storage and retrieval of UTF-8 strings: any accented/international character will show up as question mark (?). Apparently, the reason for this is that MySQL client library is compiled to expect Latin1 character set by default.
+
spowoduje nieprawidłowe przechowywanie i pobieranie ciągów znaków UTF-8: każdy znak akcentowany/międzynarodowy zostanie wyświetlony jako znak zapytania (?). Najwyraźniej powodem tego jest to, że biblioteka klienta MySQL jest kompilowana tak, aby domyślnie oczekiwała zestawu znaków Latin1.
  
In order to enable proper communication between Lazarus, MySQL client library and MySQL server, additional two queries need to be executed '''each time''' a connection to the database is established:
+
Aby umożliwić poprawną komunikację między Lazarusem i biblioteką klienta MySQL a serwerem MySQL, należy wykonać dodatkowe dwa zapytania '''za każdym razem''' gdy nawiązywane jest połączenie z bazą danych:
<syntaxhighlight lang="sql">SET CHARACTER SET `utf8`</syntaxhighlight>
+
<syntaxhighlight lang = "sql">SET CHARACTER SET `utf8`</syntaxhighlight>
and
+
i
<syntaxhighlight lang="sql">SET NAMES 'utf8'</syntaxhighlight>
+
<syntaxhighlight lang = "sql">SET NAMES 'utf8'</syntaxhighlight>
The first query will ensure your application receives strings in correct encoding, and the second tells MySQL not to convert strings it receives from your application.
+
Pierwsze zapytanie zapewni, że aplikacja otrzyma ciągi znaków z poprawnym kodowaniem, a drugie powie MySQL, aby nie konwertował ciągów, które otrzymuje z aplikacji.
  
=== Simple MySQL Demo Using the TMySQL5xConnection Component ===
+
=== Proste demo MySQL przy użyciu komponentu TMySQL5xConnection ===
  
Here is code that functions as a quick demo to get up and running simply. As with all SQLDB components, make sure the database client library is in the correct place:
+
Oto kod, który działa jako szybkie demo, aby łatwo było go utworzyć i uruchomić. Podobnie jak w przypadku wszystkich komponentów SQLDB, upewnij się, że biblioteka klienta bazy danych znajduje się we właściwym miejscu:
* on Windows: the DLL, e.g. libmysql.dll is put in the project output directory (where the executable is generated). Alternatively, you could also place it in your Windows/system32 directory
+
* w systemie Windows: biblioteka DLL, np. libmysql.dll jest umieszczany w katalogu wyjściowym projektu (w którym jest generowany plik wykonywalny). Alternatywnie możesz również umieścić go w katalogu Windows/system32
* on Linux/OSX: install the mysql client library in your path (e.g. using your distribution's package manager)
+
* w systemie Linux/OSX: zainstaluj bibliotekę klienta mysql w swojej ścieżce (np. używając menedżera pakietów Twojej dystrybucji)
  
When distributing your application, make sure the proper MySQL client library is present on your user's computer. As this can be a problem, perhaps using a different database engine may make more sense.
+
Podczas dystrybucji aplikacji upewnij się, że na komputerze użytkownika znajduje się odpowiednia biblioteka klienta MySQL. Ponieważ może to stanowić problem, być może użycie innego silnika bazy danych może mieć większy sens.
  
=== Code-driven sample ===
+
=== Przykład kodu ===
The example below uses code to fill your controls with data. You can also use data-bound controls, which might be quicker/easier. See the example below it or [[SQLdb_Tutorial1]] for this.
+
Poniższy przykład używa kodu do wypełnienia kontrolek danymi. Możesz także użyć kontrolek powiązanych z danymi, co może być szybsze/łatwiejsze. Zobacz przykład poniżej lub [[SQLdb_Tutorial1|SQLdb Samouczek1]].
  
Place three edit boxes, a memo box and a few buttons on the form. You need to add mysqlXXconn and sqldb to the uses statement.
+
Umieść w formularzu trzy pola edycji, pole notatki i kilka przycisków. Musisz dodać mysqlXXconn i sqldb do instrukcji uses.
  
In this example, the MySQL DBMS has a user 'root' with no password, and a database 'test1' with table 'tPerson' which has three fields: 'personid' (int), 'surname' (varchar(40)) and 'dob' (datetime). Also, some test data was inserted.
+
W tym przykładzie DBMS MySQL ma użytkownika „root” bez hasła i bazę danych „test1” z tabelą „tPerson”, która ma trzy pola: „personid” (int), „sername” (varchar(40)) i „dob” (data i godzina). Wprowadzono również niektóre dane testowe.
  
The button btnTest must be clicked first as it creates the connection with the DBMS. Note the line that applies updates - without this the changed or new data will not be written back to the DB though they will be in memory and can be viewed using btnFirst and btnNext.
+
Najpierw należy kliknąć przycisk btnTest, ponieważ tworzy on połączenie z systemem DBMS. Zwróć uwagę na linię, która stosuje aktualizacje - bez tego zmienione lub nowe dane nie zostaną zapisane z powrotem do DB, chociaż będą w pamięci i można je wyświetlić za pomocą btnFirst i btnNext.
 +
 
 +
=== Przykładowy kod ===
 +
Poniższy przykład używa kodu do wypełnienia kontrolek danymi. Możesz także użyć kontrolek powiązanych z danymi, co może być szybsze/łatwiejsze. Zobacz przykład poniżej lub [[SQLdb_Tutorial1]].
 +
 
 +
Umieść w formularzu trzy pola edycji, pole notatki i kilka przycisków. Musisz dodać mysqlXXconn i sqldb do instrukcji uses.
 +
 
 +
W tym przykładzie DBMS MySQL ma użytkownika „root” bez hasła i bazę danych „test1” z tabelą „tPerson”, która ma trzy pola: „personid” (int), „sername” (varchar (40)) i „dob” (data i godzina). Wprowadzono również niektóre dane testowe.
 +
 
 +
Najpierw należy kliknąć przycisk btnTest, ponieważ tworzy on połączenie z systemem DBMS. Zwróć uwagę na linię, która stosuje aktualizacje - bez tego zmienione lub nowe dane nie zostaną zapisane z powrotem w DB, chociaż będą w pamięci i można je wyświetlić za pomocą btnFirst i btnNext.
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
 
unit unt_db;
 
unit unt_db;
// Example based on:
+
// Przykład oparty na:
 
// http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=5761
 
// http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=5761
// from tpglemur on that forum
+
// od tpglemur na tym forum
 
{$mode objfpc}{$H+}
 
{$mode objfpc}{$H+}
 
interface
 
interface
Line 374: Line 383:
 
   try
 
   try
 
     try
 
     try
       // Adjust to your own database server, username and password:
+
       // Dostosuj do własnego serwera bazy danych, nazwy użytkownika i hasła:
 
       conn.HostName := '127.0.0.1';
 
       conn.HostName := '127.0.0.1';
 
       conn.UserName := 'root';
 
       conn.UserName := 'root';
 
       conn.Password := '';
 
       conn.Password := '';
       // If you use a different database name, adjust here:
+
       // Jeśli używasz innej nazwy bazy danych, dostosuj tutaj:
 
       conn.DatabaseName := 'test1';
 
       conn.DatabaseName := 'test1';
 
       conn.Connected := True;
 
       conn.Connected := True;
 
       conn.Transaction := transaction;
 
       conn.Transaction := transaction;
 
       query.DataBase := conn;
 
       query.DataBase := conn;
       //query.ParseSQL := true; //line not needed - this is the default anyway
+
       //query.ParseSQL := true; //linia niepotrzebna - i tak jest to ustawienie domyślne
       //query.ReadOnly := false; //line not needed - this is the default anyway
+
       //query.ReadOnly := false; //linia niepotrzebna - i tak jest to ustawienie domyślne
 
       query.SQL.Text := 'select * from tperson';
 
       query.SQL.Text := 'select * from tperson';
 
       query.Open;
 
       query.Open;
Line 428: Line 437:
 
   query.FieldValues['dob'] := edtDOB.Text;
 
   query.FieldValues['dob'] := edtDOB.Text;
 
   query.Post;   
 
   query.Post;   
   query.ApplyUpdates; //to apply update
+
   query.ApplyUpdates; //aby zaktualizować dane w bazie
   transaction.Commit; //Needed since FPC 2.6.4; todo: somebody should check if this is enough
+
   transaction.Commit; //Potrzebne od FPC 2.6.4; todo: ktoś powinien sprawdzić, czy to wystarczy
 
end;
 
end;
  
Line 442: Line 451:
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
=== RAD/Databound controls ===
+
=== Kontrolki RAD/Databound ===
Please see [[SQLdb_Tutorial1]], [[SQLdb_Tutorial2]] and further tutorials.
+
Zobacz [[SQLdb_Tutorial1]], [[SQLdb_Tutorial2]] i dalsze samouczki.
  
 
==Zeos==
 
==Zeos==
See [[ZeosDBO]]
+
Zobacz [[ZeosDBO]]
  
==Pascal Data Objects (PDO)==
+
[http://pdo.sourceforge.net]
Pascal Data Objects is an alternative data access layer that seems to support:
+
== Pascal Data Objects (PDO) ==
* MySQL 4.0 clients
+
Pascal Data Objects to alternatywna warstwa dostępu do danych, która wydaje się obsługiwać:
* MySQL 4.1 clients
+
* Klientów MySQL 4.0
* MySQL 5.0 clients
+
* Klientów MySQL 4.1
* (and also) Firebird 1.5 and 2.0
+
* Klientów MySQL 5.0
 +
* (a także) Firebird 1.5 i 2.0
  
Functions introduced with MySQL 4.1 and 5.0 like prepared statements, binding, and stored procedures are supported. PDO is inspired by PHP Data Objects. All the code and documentation necessary to use this API is available on sourceforge:
+
Obsługiwane są funkcje wprowadzone w MySQL 4.1 i 5.0, takie jak przygotowane instrukcje, powiązania i procedury składowane. PDO jest inspirowane PHP Data Objects. Cały kod i dokumentacja niezbędna do korzystania z tego interfejsu API jest dostępna na sourceforge:
  
 
[http://pdo.sourceforge.net]
 
[http://pdo.sourceforge.net]
  
==MySQL package: the low level units==
+
== Pakiet MySQL: moduł niskiego poziomu ==
  
As with all databases, the SQLDB code depends on a lower level mysql specific unit that wraps around the mysql driver library (.so/.dll). Normally, you would use the higher-level SQLDB code as it allows you to code more quickly, easily switch databases etc.
+
Podobnie jak w przypadku wszystkich baz danych, kod SQLDB zależy od specyficznego modułu dla mysql niższego poziomu, która otacza bibliotekę sterownika mysql (.so/.dll). Zwykle używałbyś kodu SQLDB wyższego poziomu, ponieważ umożliwia on szybsze kodowanie, łatwe przełączanie baz danych itp.
  
Using this is very easy, all you need to do is compile some units, and use these units in your program. You need to specify the location in the filesystem of the MySQL client Library (libmysqlclient on Linux) when compiling, and that is it.  
+
Używanie tego jest bardzo łatwe, wszystko, co musisz zrobić, to skompilować kilka modułów i użyć tych modułów w swoim programie. Podczas kompilacji musisz określić lokalizację w systemie plików biblioteki klienta MySQL (libmysqlclient w systemie Linux) i to wszystko.  
  
=== Provided units and programs ===
+
=== Dostarczone moduły i programy ===
The packages provides 3 units, of which normally only the first is needed:
+
W pakiecie znajdują się 3 moduły, z których zwykle potrzebny jest tylko pierwszy:
  
* ''mysql'' the main mysql unit.  
+
* ''mysql'' - główny moduł mysql.
* ''mysql<version>'' (e.g. ''mysql50'') provides access to the specific mysql library for that version. Note: the client library version is unrelated to the version of the server in use - except that you want to make sure these versions are compatible.
+
* ''mysql<wersja>'' (np. ''mysql50'') zapewnia dostęp do konkretnej biblioteki mysql dla danej wersji. Uwaga: wersja biblioteki klienta nie jest związana z wersją używanego serwera - z tym wyjątkiem, że chcesz się upewnić, że te wersje są kompatybilne.
* ''mysql<version>com'' contains some internal routines of MySQL (presumably a translation of mysql_com.h); it should normally not be used unless you want access to some internal types.  
+
* ''mysql<wersja>com'' zawiera pewne wewnętrzne procedury MySQL (prawdopodobnie tłumaczenie mysql_com.h); normalnie nie powinno być używane, chyba że chcesz uzyskać dostęp do niektórych typów wewnętrznych.
  
Example programs can be found in the <fpc>\packages\mysql\examples directory.
+
Przykładowe programy można znaleźć w katalogu <fpc>\packages\mysql\examples.
  
=== Installation ===
+
=== Instalacja ===
The mysql interface is distributed with the Free Pascal packages, and come with the compiler distribution: Normally no action should be taken to work with MySQL.
+
Interfejs mysql jest rozpowszechniany z pakietami Free Pascal i wraz z dystrybucją kompilatora: Normalnie nie należy podejmować żadnych działań, aby pracować z MySQL.
  
In case you want to modify and compile the units yourself, the mysql sources are in the packages directory: ''packages/mysql''
+
Jeśli chcesz samodzielnie zmodyfikować i skompilować moduły, źródła mysql znajdują się w katalogu pakietów: ''packages/mysql''
  
This directory contains the units, a test program and a makefile. cd to the directory and type
+
Ten katalog zawiera moduły, program testowy i plik makefile. Przejdź to tego katalogu komendą cd i wpisz
  
 
  make
 
  make
  
This should compile the units. If compilation was succesful, you can install with
+
Powinno to skompilować moduły. Jeśli kompilacja się powiodła, możesz zainstalować je poleceniem
  
 
  make install
 
  make install
  
You can then test the program by running
+
Następnie możesz przetestować program, uruchamiając
  
 
  make test
 
  make test
  
This will:
+
Spowoduje to:
  
* Run a script to create a table in a database, and fill it with some data. (the mysql program should be in your PATH for this) . By default, the used database is testdb.
+
* Uruchomienie skryptu, który utworzy tabelę w bazie danych i wypełni ją danymi. (w tym celu program mysql powinien znajdować się w twojej ścieżce). Domyślnie używana baza danych to testdb.
* Run the testprogram testdb
+
* Uruchomienie programu testowego testdb
* Run a shell script again to remove the created table.  
+
* Ponowne uruchomienie skryptu powłoki, który usunie utworzoną tabelę.
  
You will see a lot of messages on your screen, giving you feedback and results. If something went wrong, make will inform you of this.
+
Na ekranie zobaczysz wiele komunikatów, które zawierają informacje zwrotne i wyniki. Jeśli coś poszło nie tak, make poinformuje Cię o tym.
  
Go back to [[Package_List|Packages List]]
+
Wróć do [[Package_List|Listy Pakietów]]
  
==See also==
+
== Zobacz także ==
  
* [[Lazarus DB Faq]] - More about database programming
+
* [[Lazarus DB Faq|Najczęęściej zadawane pytania]] - Więcej o programowaniu baz danych
* [[SQLdb Tutorial1]] - SQLDB tutorial series that takes you through creating a working database grid GUI application
+
* [[SQLdb Tutorial1|SQLdb Samouczek1]] - seria samouczków SQLDB, które przeprowadzą Cię przez proces tworzenia działającej aplikacji GUI siatki bazy danych
* [[Lazarus Database Overview]] - Getting Lazarus working with various database
+
* [[Lazarus Database Overview|Przegląd baz danych Lazarusa]] - Uruchomienie Lazarusa do pracy z różnymi bazami danych

Latest revision as of 00:14, 4 February 2021

English (en) español (es) français (fr) polski (pl)

Databases portal

References:

Tutorials/practical articles:

Databases

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

Przegląd

Możesz użyć Free Pascal/Lazarus, aby uzyskać dostęp do serwera bazy danych MySQL.

Win64: zobacz ostrzeżenie tutaj dotyczące nieużywania niektórych wersji FPC/Lazarus Win64.

Zalety MySQL:

  • Jest bardzo szeroko stosowany i dostępny
  • Chociaż starsze wersje miały zasłużoną opinię, że nie są prawdziwymi RDBMS, nowsze wersje obsługują właściwości ACID, jeśli są prawidłowo skonfigurowane (z odpowiednim zapleczem pamięci)

Wady MySQL:

  • Opiekunowie MySQL łamią binarną kompatybilność między wersjami bibliotek klienta. Oznacza to, że dla każdej nowej wersji trzeba wykonać tłumaczenie FPC/Lazarus, co spowalnia działanie.
  • Licencja może być ograniczona dla niektórych użytkowników (np. We wdrożeniach komercyjnych). Istnieją kompatybilne, prawdopodobnie mniej restrykcyjne alternatywy, takie jak MariaDB.

Z tego powodu wielu użytkowników Lazarusa/FPC preferuje bazy danych Firebird lub PostgreSQL.

Licencjonowanie MySQL

Przed znaczącym wdrożeniem MySQL nie zapomnij przeczytać jej licencji.

SQLDB

Lazarus 1.2 (z FPC 2.6.2), obsługuje

  • Biblioteka klienta MySQL 4.0
  • Biblioteka klienta MySQL 4.1
  • Biblioteka klienta MySQL 5.0
  • Biblioteka klienta MySQL 5.1
  • Biblioteka klienta MySQL 5.5 (obsługiwana od wersji Lazarus 1.0.8)
  • Biblioteka klienta MySQL 5.6 (obsługiwana od Lazarusa ?)

sqldbcomponents2.png

Nowsze wersje FPC/Lazarus mogą obsługiwać nowsze biblioteki klienta MySQL.

Upewnij się, że używasz odpowiedniego komponentu połączenia dla swojej wersji biblioteki klienta. Więc jeśli masz zainstalowane biblioteki klienta dla MySQL 4.1, musisz użyć komponentu TMySQL41Connection, nawet jeśli serwer działa w wersji 4.0 lub 5.0. Powodem tego jest to, że biblioteki klienckie MySQL często łamią kompatybilność ich API, więc każda wersja wymaga innego sterownika Pascala.

W systemach typu *nix kod SQLDB może szukać zwykłej wersji biblioteki bez sufiksów numerów wersji. Możesz sobie z tym poradzić na kilka sposobów:

  • (w wielu Linuksach) zainstalowanie biblioteki w wersji -dev
  • utworzenie dowiązania symbolicznego twojej konkretnej nazwy biblioteki do tej, której szuka FPC (raczej hakerskie)
  • użycie TSQLDBLibraryLoader, aby określić nazwę biblioteki przed załadowaniem połączenia

Samouczki SQLDB i przykładowy kod

BigChimp wrzesień 2012: uwaga: wiele z tych samouczków to zduplikowany kod i można je skonsolidować. Proponuję przenieść jak najwięcej do samouczka SQLDB zorientowanego na GUI i utworzyć osobną stronę samouczka bazy danych FPC, aby utworzyć przykład trybu tekstowego

Uruchom serwer MySQL działający w systemie Linux lub Windows

Postępuj zgodnie z instrukcjami zawartymi w podręczniku użytkownika MySQL. Upewnij się, że demon mysqld działa niezawodnie i że wszyscy potencjalni użytkownicy (w tym root, mysql, Ty i wszyscy inni, którzy mogą tego potrzebować) mają tyle uprawnień, ile potrzebują, z tylu hostów, ile potrzeba (takich jak 'localhost', nazwa hosta lokalnego i inne hosty w twojej sieci), o ile jest to zgodne z bezpieczeństwem. Zaleca się, aby wszyscy użytkownicy, w tym root, mieli hasła. Przetestuj działanie systemu bazy danych, korzystając z przykładów podanych w instrukcji i sprawdź, czy wszyscy użytkownicy naprawdę mają niezawodny dostęp.

Spraw, aby MySQL działał dla FPC w trybie tekstowym

W katalogu $(fpcsrcdir)/packages/base/mysql/ znajduje się przykładowy program. Możesz znaleźć katalog ze źródłami fpc w Lazarusie: Narzędzia -> Opcje -> Pliki -> Katalog źródłowy FPC (en: Tools -> Options -> Files -> FPC source directory). Możliwe ścieżki do katalogu mysql to /usr/share/fpcsrc/packages/base/mysql/ (rpm install) lub C:\lazarus\fpcsrc\packages\base\mysql\ (windows). Ten katalog zawiera również moduły mysql.pp, mysql_com.pp i mysql_version.pp. Przed uruchomieniem skryptu testowego musisz utworzyć bazę danych o nazwie testdb: zrób to, logując się do monitora mysql (jako root z pełnymi uprawnieniami) i wydając następującą instrukcję SQL:

CREATE DATABASE testdb;

następnie upewnij się, że wszyscy właściwi użytkownicy mają do niego odpowiednie uprawnienia dostępu

GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';

Istnieje skrypt o nazwie mkdb, który powinieneś teraz spróbować uruchomić:

sh ./mkdb

Prawdopodobnie zakończy się to niepowodzeniem, ponieważ system nie pozwoli anonimowemu użytkownikowi uzyskać dostęp do bazy danych. Zmień więc skrypt za pomocą edytora tak, aby wiersz wywołujący mysql brzmiał:

mysql -u root -p  ${1-testdb} << EOF >/dev/null

i spróbuj uruchomić go ponownie, wprowadzając hasło po wyświetleniu monitu. Przy odrobinie szczęścia mogłeś stworzyć testową bazę danych: przetestuj ją (będąc zalogowanym do monitora mysql), wydając instrukcję mysql

select * from FPdev;

Powinieneś zobaczyć tabelę zawierającą ID, nazwę użytkownika i adres e-mail niektórych programistów FPC.

Teraz spróbuj uruchomić program testowy testdb.pp (może to wymagać skompilowania i prawie na pewno zakończy się niepowodzeniem przy pierwszej próbie !!).

Zauważyłem, że program nie mógł połączyć się z mysql z kilku powodów:

  • Mój system (SuSE Linux v9.0) instaluje mysql v4.0.15, a nie wersję 3, dla której pakiet został zaprojektowany.
  • Program musi mieć nazwy użytkowników i hasła, aby uzyskać dostęp do bazy danych.
  • Kompilator musi wiedzieć, gdzie znaleźć biblioteki mysql (JEŚLI NIE ZAINSTALOWAŁEŚ BIBLIOTEK PROGRAMISTYCZNYCH MYSQL, ZRÓB TO TERAZ!)

Utworzyłem kopię pliku testdb.pp o nazwie trydb.pp, zamiast edytować oryginał - oznacza to, że oryginalne pliki nadal są naprawiane w kolejnych aktualizacjach CVS. Skopiowałem również pliki znalezione w podkatalogu mysql/ver40/ do głównego podkatalogu mysql/, zmieniając ich nazwy na mysql_v4.pp, mysql_com_v4.pp i mysql_version_v4.pp, pamiętając o zmianie nazwy modułóww każdym pliku. Zmieniłem instrukcję użycia w trydb.pp na

uses mysql_v4

i oświadczenie w mysql_v4.pp do

uses mysql_com_v4

Dodałem wiersz do /etc/fpc.cfg, aby wskazać moje biblioteki:

-Fl/lib;/usr/lib

Następujący krok może nie być konieczny, jeśli biblioteki deweloperskie są zainstalowane, ponieważ łącza zostaną utworzone za Ciebie, ale sprawdzenie nigdy nie zaszkodzi. Musiałem znaleźć prawdziwą nazwę biblioteki mysqlclint w katalogu /usr/lib i w moim przypadku musiałem wydać polecenie powłoki:

ln -s libmysqlclient.so.12.0.0 lmysqlclient

aby utworzyć dowiązanie symboliczne umożliwiające FPC znalezienie biblioteki. Na wszelki wypadek stworzyłem też link

ln -s libmysqlclient.so.12.0.0 mysqlclient

i umieściłem podobne linki w różnych innych katalogach: nie jest to absolutnie konieczne, ale na wszelki wypadek ...! Niektórzy użytkownicy mogą potrzebować dodać następujące łącze:

ln -s libmysqlclient.so.12.0.0 libmysqlclient.so

Zmodyfikowałem trydb.pp, aby zawierał dane użytkownika, początkowo dodając hosta, użytkownika i hasło jako stałe Pchar:

const
  host : Pchar= 'localhost';
  user : Pchar= 'myusername';
  passwd: Pchar = 'mypassword';
Note-icon.png

Uwaga: Ta sekcja wygląda na wyjątkowo nieaktualną. Jeśli nadal korzystasz z MySQL 4, być może nadszedł czas na aktualizację

Odkryłem również, że nie mogę połączyć się z mysql za pomocą wywołania mysql_connect(), ale musiałem użyć mysql_real_connect(), który ma o wiele więcej parametrów. Aby jeszcze bardziej skomplikować sprawę, wydaje się, że liczba parametrów zmieniła się między wersją 3 (w której jest siedem) a wersją 4 (w której jest osiem). Przed użyciem mysql_real_connect musiałem użyć mysql_init(), którego nie ma w oryginalnym mysql.pp, ale znajduje się w mysql_v4.pp.

Tak więc kod do połączenia z bazą danych to teraz:

{ kilka dodatkowych zmiennych }
var
  alloc : PMYSQL;
  
{fragment głównego programu}
  
begin
  if paramcount=1 then
  begin
    Dummy:=Paramstr(1)+#0;
    DataBase:=@Dummy[1];
  end;
  
  Writeln('Przydzielanie miejsca ...');
  alloc := mysql_init(PMYSQL(@qmysql));
  Write('Łączę się z MySQL ...');
  sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
  if sock=Nil then
  begin
    Writeln(stderr,'Nie można połączyć się z MySQL');
    Writeln(stderr, 'Błąd: ', mysql_error(@qmysql));
    halt(1);
  end;
  Writeln('Gotowe.');
  Writeln('Parametry połączenia:');
 {$ifdef Unix}
  writeln('Mysql_port      : ',mysql_port);
  writeln('Mysql_unix_port : ',mysql_unix_port);
 {$endif}
  writeln('Host info       : ',mysql_get_host_info(sock));
  writeln('Server info     : ',mysql_stat(sock));
  writeln('Client info     : ',mysql_get_client_info);
  
  Writeln('Wybór bazy danych ',DataBase,'...');
  if mysql_select_db(sock, DataBase) < 0 then
  begin
    Writeln(stderr,'Nie udało się wybrać bazy danych ',Database);
    Writeln(stderr,mysql_error(sock));
    halt(1);
  end;
 {... dalej oryginalna zawartość pliku testdb.pp}

Teraz - gotowy do rozpoczęcia kompilacji trydb.pp?

 fpc trydb

sukces! Teraz uruchom to:

 ./trydb

Super! Mam listę twórców FPC!

Kilka dodatkowych ulepszeń: uczyń wprowadzanie danych użytkownika i poleceń mysql interaktywnymi, używając zmiennych zamiast stałych, i pozwól na wprowadzenie kilku poleceń SQL, dopóki nie wydamy polecenia quit: zobacz pełna lista programów, gdzie dane użytkownika są wprowadzane z konsoli, a program przechodzi w pętlę, w której z konsoli wprowadza się polecenia SQL (bez średnika terminala) i wypisuje odpowiedzi, aż do wpisania „quit” z klawiatury.

Zobacz przykładową lista konsoli.

Łączenie się z MySQL z aplikacji Lazarus

Ten poradnik pokazuje, jak podłączyć Lazarus do bazy danych MySQL i wykonywać proste zapytania, używając tylko podstawowych komponentów Lazarusa; nie używa żadnych komponentów Data Aware, ale ilustruje zasady współpracy z bazą danych.

Utwórz nowy projekt w Lazarusie:

Projekt -> Nowy projekt -> Aplikacja (en: Project -> New Project -> Application)

Pojawi się nowy automatycznie wygenerowany formularz.

Powiększ formularz, aby wypełnić mniej więcej połowę ekranu, a następnie zmień nazwę formularza i jego podpis na „TryMySQL”.

Z zakładki komponentów Standard umieść trzy pola edycji w lewym górnym rogu formularza i bezpośrednio nad każdym z nich umieść etykietę. Zmień im odpowiednio właściwość Caption na „Serwer” lub „Host” (a Name na HostLLabel, HostEdit), „Użytkownik” (i UserLabel, UserEdit) oraz „Hasło” (z PasswdLabel i PasswdEdit). Alternatywnie możesz użyć komponentów LabelledEdit z zakładki Additional.

Zaznacz pole Passwd Edit i znajdź właściwość PasswordChar: zmień to na * lub inny znak, aby po wpisaniu hasła znaki nie pojawiały się na ekranie, ale były powtarzane serią znków *. Upewnij się, że właściwość Text każdego pola edycji jest pusta.

Teraz umieść kolejne pole edycji i etykietę u góry po prawej stronie formularza. Zmień etykietę na „Wpisz polecenie SQL” i nazwij ją CommandEdit.

Umieść trzy przyciski na formularzu: dwa po lewej stronie pod polami edycji i jeden po prawej stronie pod polem poleceń.

Oznacz przyciski po lewej stronie „Połącz z bazą” (ConnectButton) i „Wyjdź” (ExitButton), a przycisk po prawej stronie „Wyślij zapytanie” (QueryButton).

Umieść duże okno memo z etykietą i nazwą ją „Wyniki” (ResultMemo) w prawym dolnym rogu, aby wypełnić większość dostępnego miejsca. Znajdź właściwość ScrollBars i wybierz ssAutoBoth, aby paski przewijania pojawiały się automatycznie, jeśli tekst wypełni przestrzeń. Ustaw właściwość WordWrap na True.

Umieść pasek stanu Status Bar(z zakładki Common Controls) na dole formularza i ustaw jego właściwość SimpleText na „TryMySQL”.

Zrzut ekranu formularza można zobaczyć tutaj: Mysql Przykładowy zrzut ekranu

Teraz musimy napisać kilka procedur obsługi zdarzeń.

Trzy pola edycji po lewej stronie służą do wprowadzania nazwy hosta (adresu serwera), nazwy użytkownika i hasła. Gdy zostaną one wprowadzone pomyślnie, kliknij przycisk Połącz. Procedura obsługi zdarzeń OnCLick dla tego przycisku jest oparta częściowo na powyższym programie FPC w trybie tekstowym.

Odpowiedzi z bazy danych należy zamienić na ciągi znaków i wyświetlić w polu Memo. Instrukcje tryby tekstowego Pascala write i writeln, mogą wykonywać wiele konwersji 'w locie', ale użycie pola Memo do wyjścia tekstowego wymaga jawnej konwersji typów danych na poprawny ciąg: dlatego zmienne Pchar muszą zostać przekonwertowane na ciągi typu String przy użyciu funkcji StrPas, a liczby całkowite muszą być konwertowane za pomocą IntToStr.

Ciągi znaków są wyświetlane w polu Memo przy użyciu:

procedure ShowString(S : string);
(* wyświetl ciąg w polu Memo *)
begin
  trymysqlForm1.ResultsMemo.Lines.Add(S)
end;

Procedura obsługi zdarzeń ConnectButton wygląda następująco:

procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
(* Połącz się z MySQL przy użyciu danych użytkownika z pól tekstowych głównego formularza *)
var strg: string;
  
begin
  dummy1 :=  trymysqlForm1.HostEdit.text+#0;
  host := @dummy1[1];
  dummy2 := trymysqlForm1.UserEdit.text+#0;
  user := @dummy2[1] ;
  dummy3 := trymysqlForm1.PasswdEdit.text+#0;
  passwd := @dummy3[1] ;

  alloc := mysql_init(PMYSQL(@qmysql));
  sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
  if sock=Nil then
    begin
      strg :='Nie można połączyć się z MySQL.'; showstring (strg);
      Strg :='Błąd: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
    end
    else
    begin
      trymysqlForm1.statusBar1.simpletext := 'Połączono z MySQL';
      strg := 'Teraz wybieram bazę danych: ' + database; showstring (strg);
 {$ifdef Unix}
      strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);
      strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
 {$endif}
      Strg :='Host info       : ' + StrPas(mysql_get_host_info(sock));
      showstring (strg);
      Strg :='Server info     : ' + StrPas(mysql_stat(sock)); showstring (strg);
      Strg :='Client info     : ' + Strpas(mysql_get_client_info);  showstring (strg);
  
      trymysqlForm1.statusbar1.simpletext := 'Wybór bazy danych ' + DataBase +'...';
      if mysql_select_db(sock,DataBase) < 0 then
      begin
        strg :='Nie udało się wybrać bazy danych '+ Database; ShowString (strg);
        Strg := mysql_error(sock); ShowString (strg);
      end
    end;
end;

Pole tekstowe po prawej stronie umożliwia wprowadzenie instrukcji SQL bez średnika terminala; gdy jesteś zadowolony z jego zawartości lub składni, naciśnij przycisk SendQuery, zapytanie zostanie przetworzone, a wyniki zostaną zapisane w polu ResultsMemo.

Procedura obsługi zdarzeń SendQuery jest ponownie oparta na wersji trybu tekstowego FPC, z tą różnicą, że ponownie należy wykonać jawną konwersję typu, zanim ciągi zostaną wyświetlone w polu Memo.

Różnica w stosunku do programu FPC działającego w trybie tekstowym polega na tym, że w przypadku wykrycia błędu program nie zatrzymuje się, a MySQL nie jest zamykany; zamiast tego sterowanie wraca do głównego formularza i daje możliwość poprawienia wpisu przed ponownym wysłaniem polecenia. Aplikacja zostaje ostatecznie zamknięta (z zamknięciem MySQL) po kliknięciu przycisku 'Zakończ'.

Kod dla SendQuery jest następujący:

procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
var
  dumquery, strg: string;
begin
  dumquery := TrymysqlForm1.CommandEdit.text;
  dumquery := dumquery+#0;
  query := @dumquery[1];
  trymysqlForm1.statusbar1.simpletext := 'Wykonywanie zapytania: '+ dumQuery +'...';
  strg := 'Wykonywanie zapytania: ' + dumQuery; showstring (strg);
  if (mysql_query(sock,Query) < 0) then
  begin
    Strg :='Zapytanie nie powiodło się '+ StrPas(mysql_error(sock)); showstring (strg);
  end
  else
  begin
    recbuf := mysql_store_result(sock);
    if RecBuf=Nil then
    begin
      Strg :='Zapytanie zwróciło wynik nil.'; showstring (strg);
    end
    else
    begin
      strg :='Liczba zwróconych rekordów: ' + IntToStr(mysql_num_rows (recbuf));
      Showstring (strg);
      Strg :='Liczba pól w rekordzie: ' + IntToStr(mysql_num_fields(recbuf));
      showstring (strg);
      rowbuf := mysql_fetch_row(recbuf);
      while (rowbuf <>nil) do
      begin
        Strg :='(Id: '+ rowbuf[0]+', Imię: ' + rowbuf[1]+ ', Email : ' +
        rowbuf[2] +')';
        showstring(strg);
        rowbuf := mysql_fetch_row(recbuf);
      end;
    end;
  end;
end;

Zapisz swój projekt i naciśnij Uruchom -> Uruchom (en: Run -> Run)

Pobierz przykładowy kod źródłowy

Note-icon.png

Uwaga: Obecne wersje Lazarusa/FPC wymagają zatwierdzania wszystkich transakcji MySQL. Nie było to konieczne we wcześniejszych wersjach. Pobrany kodu prawdopodobnie nie zadziała, dopóki nie zostanie zaktualizowany.

Pełny listing programu jest dostępny tutaj / pobierz przykładowy kod źródłowy

Lazarus, MySQL i UTF-8

Poniższe może być wymagane również w przypadku innych stron kodowych/zestawów znaków

UTF-8 Unicode to wygodne wielobajtowe kodowanie zestawu znaków, które umożliwia pracę z tekstami wielojęzycznymi bez konieczności stosowania WideStrings. Obsługiwany jest zarówno przez komponenty Lazarus SQLdb, jak i MySQL od wersji 4.1 poprzez wybór odpowiedniego zestawu znaków.

Jednak ustawiając to kodowanie tak po prostu jako domyślne dla

  • twojej tabeli i
  • komponentu połączenia MySQL (np. TMySQL51Connection.CharSet:='UTF8';)

spowoduje nieprawidłowe przechowywanie i pobieranie ciągów znaków UTF-8: każdy znak akcentowany/międzynarodowy zostanie wyświetlony jako znak zapytania (?). Najwyraźniej powodem tego jest to, że biblioteka klienta MySQL jest kompilowana tak, aby domyślnie oczekiwała zestawu znaków Latin1.

Aby umożliwić poprawną komunikację między Lazarusem i biblioteką klienta MySQL a serwerem MySQL, należy wykonać dodatkowe dwa zapytania za każdym razem gdy nawiązywane jest połączenie z bazą danych:

SET CHARACTER SET `utf8`

i

SET NAMES 'utf8'

Pierwsze zapytanie zapewni, że aplikacja otrzyma ciągi znaków z poprawnym kodowaniem, a drugie powie MySQL, aby nie konwertował ciągów, które otrzymuje z aplikacji.

Proste demo MySQL przy użyciu komponentu TMySQL5xConnection

Oto kod, który działa jako szybkie demo, aby łatwo było go utworzyć i uruchomić. Podobnie jak w przypadku wszystkich komponentów SQLDB, upewnij się, że biblioteka klienta bazy danych znajduje się we właściwym miejscu:

  • w systemie Windows: biblioteka DLL, np. libmysql.dll jest umieszczany w katalogu wyjściowym projektu (w którym jest generowany plik wykonywalny). Alternatywnie możesz również umieścić go w katalogu Windows/system32
  • w systemie Linux/OSX: zainstaluj bibliotekę klienta mysql w swojej ścieżce (np. używając menedżera pakietów Twojej dystrybucji)

Podczas dystrybucji aplikacji upewnij się, że na komputerze użytkownika znajduje się odpowiednia biblioteka klienta MySQL. Ponieważ może to stanowić problem, być może użycie innego silnika bazy danych może mieć większy sens.

Przykład kodu

Poniższy przykład używa kodu do wypełnienia kontrolek danymi. Możesz także użyć kontrolek powiązanych z danymi, co może być szybsze/łatwiejsze. Zobacz przykład poniżej lub SQLdb Samouczek1.

Umieść w formularzu trzy pola edycji, pole notatki i kilka przycisków. Musisz dodać mysqlXXconn i sqldb do instrukcji uses.

W tym przykładzie DBMS MySQL ma użytkownika „root” bez hasła i bazę danych „test1” z tabelą „tPerson”, która ma trzy pola: „personid” (int), „sername” (varchar(40)) i „dob” (data i godzina). Wprowadzono również niektóre dane testowe.

Najpierw należy kliknąć przycisk btnTest, ponieważ tworzy on połączenie z systemem DBMS. Zwróć uwagę na linię, która stosuje aktualizacje - bez tego zmienione lub nowe dane nie zostaną zapisane z powrotem do DB, chociaż będą w pamięci i można je wyświetlić za pomocą btnFirst i btnNext.

Przykładowy kod

Poniższy przykład używa kodu do wypełnienia kontrolek danymi. Możesz także użyć kontrolek powiązanych z danymi, co może być szybsze/łatwiejsze. Zobacz przykład poniżej lub SQLdb_Tutorial1.

Umieść w formularzu trzy pola edycji, pole notatki i kilka przycisków. Musisz dodać mysqlXXconn i sqldb do instrukcji uses.

W tym przykładzie DBMS MySQL ma użytkownika „root” bez hasła i bazę danych „test1” z tabelą „tPerson”, która ma trzy pola: „personid” (int), „sername” (varchar (40)) i „dob” (data i godzina). Wprowadzono również niektóre dane testowe.

Najpierw należy kliknąć przycisk btnTest, ponieważ tworzy on połączenie z systemem DBMS. Zwróć uwagę na linię, która stosuje aktualizacje - bez tego zmienione lub nowe dane nie zostaną zapisane z powrotem w DB, chociaż będą w pamięci i można je wyświetlić za pomocą btnFirst i btnNext.

unit unt_db;
// Przykład oparty na:
// http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=5761
// od tpglemur na tym forum
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
  mysql50conn, sqldb, StdCtrls;
type
  { TForm1 }
  TForm1 = class(TForm)
    btnTest: TButton;
    btnNext: TButton;
    btnFirst: TButton;
    btnNew: TButton;
    edtPersonID: TEdit;
    edtSurname: TEdit;
    edtDOB: TEdit;
    Memo1: TMemo;
    procedure btnFirstClick(Sender: TObject);
    procedure btnNewClick(Sender: TObject);
    procedure btnNextClick(Sender: TObject);
    procedure btnTestClick(Sender: TObject);
  private
    { private declarations }
    conn : TMySQL50Connection;
    query : TSQLQuery;
    transaction : TSQLTransaction;
    procedure Display;
  public
    { public declarations }
  end;
var
  Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.btnTestClick(Sender: TObject);
var
  S: String;
begin
  conn := TMySQL50Connection.Create(nil);
  query := TSQLQuery.Create(nil);
  transaction := TSQLTransaction.Create(nil);
  try
    try
      // Dostosuj do własnego serwera bazy danych, nazwy użytkownika i hasła:
      conn.HostName := '127.0.0.1';
      conn.UserName := 'root';
      conn.Password := '';
      // Jeśli używasz innej nazwy bazy danych, dostosuj tutaj:
      conn.DatabaseName := 'test1';
      conn.Connected := True;
      conn.Transaction := transaction;
      query.DataBase := conn;
      //query.ParseSQL := true;  //linia niepotrzebna - i tak jest to ustawienie domyślne
      //query.ReadOnly := false; //linia niepotrzebna - i tak jest to ustawienie domyślne
      query.SQL.Text := 'select * from tperson';
      query.Open;

      query.Last;
      S := IntToStr(query.RecordCount) + #13#10;
      query.First;

      while not query.EOF do
      begin
        S := S + query.FieldByName('surname').AsString + #13#10;
        query.Next;
      end;
    finally
      //query.Free;
      //conn.Free;
    end;
  except
    on E: Exception do
      ShowMessage(E.message);
  end;
  Memo1.Text:= S;
end;

procedure TForm1.Display;
begin
  edtPersonID.Text := query.FieldByName('personid').AsString;
  edtSurname.Text := query.FieldByName('surname').AsString;
  edtDOB.Text := query.FieldByName('dob').AsString;
end;

procedure TForm1.btnFirstClick(Sender: TObject);
begin
  query.First;
  Display;
end;

procedure TForm1.btnNewClick(Sender: TObject);
begin
  query.Append;
  query.FieldValues['personid'] := edtPersonID.Text;
  query.FieldValues['surname'] := edtSurname.Text;
  query.FieldValues['dob'] := edtDOB.Text;
  query.Post;  
  query.ApplyUpdates; //aby zaktualizować dane w bazie
  transaction.Commit; //Potrzebne od FPC 2.6.4; todo: ktoś powinien sprawdzić, czy to wystarczy
end;

procedure TForm1.btnNextClick(Sender: TObject);
begin
  query.Next;
  Display;
end;

initialization
  {$I unt_db.lrs}
end.

Kontrolki RAD/Databound

Zobacz SQLdb_Tutorial1, SQLdb_Tutorial2 i dalsze samouczki.

Zeos

Zobacz ZeosDBO

[1]

Pascal Data Objects (PDO)

Pascal Data Objects to alternatywna warstwa dostępu do danych, która wydaje się obsługiwać:

  • Klientów MySQL 4.0
  • Klientów MySQL 4.1
  • Klientów MySQL 5.0
  • (a także) Firebird 1.5 i 2.0

Obsługiwane są funkcje wprowadzone w MySQL 4.1 i 5.0, takie jak przygotowane instrukcje, powiązania i procedury składowane. PDO jest inspirowane PHP Data Objects. Cały kod i dokumentacja niezbędna do korzystania z tego interfejsu API jest dostępna na sourceforge:

[2]

Pakiet MySQL: moduł niskiego poziomu

Podobnie jak w przypadku wszystkich baz danych, kod SQLDB zależy od specyficznego modułu dla mysql niższego poziomu, która otacza bibliotekę sterownika mysql (.so/.dll). Zwykle używałbyś kodu SQLDB wyższego poziomu, ponieważ umożliwia on szybsze kodowanie, łatwe przełączanie baz danych itp.

Używanie tego jest bardzo łatwe, wszystko, co musisz zrobić, to skompilować kilka modułów i użyć tych modułów w swoim programie. Podczas kompilacji musisz określić lokalizację w systemie plików biblioteki klienta MySQL (libmysqlclient w systemie Linux) i to wszystko.

Dostarczone moduły i programy

W pakiecie znajdują się 3 moduły, z których zwykle potrzebny jest tylko pierwszy:

  • mysql - główny moduł mysql.
  • mysql<wersja> (np. mysql50) zapewnia dostęp do konkretnej biblioteki mysql dla danej wersji. Uwaga: wersja biblioteki klienta nie jest związana z wersją używanego serwera - z tym wyjątkiem, że chcesz się upewnić, że te wersje są kompatybilne.
  • mysql<wersja>com zawiera pewne wewnętrzne procedury MySQL (prawdopodobnie tłumaczenie mysql_com.h); normalnie nie powinno być używane, chyba że chcesz uzyskać dostęp do niektórych typów wewnętrznych.

Przykładowe programy można znaleźć w katalogu <fpc>\packages\mysql\examples.

Instalacja

Interfejs mysql jest rozpowszechniany z pakietami Free Pascal i wraz z dystrybucją kompilatora: Normalnie nie należy podejmować żadnych działań, aby pracować z MySQL.

Jeśli chcesz samodzielnie zmodyfikować i skompilować moduły, źródła mysql znajdują się w katalogu pakietów: packages/mysql

Ten katalog zawiera moduły, program testowy i plik makefile. Przejdź to tego katalogu komendą cd i wpisz

make

Powinno to skompilować moduły. Jeśli kompilacja się powiodła, możesz zainstalować je poleceniem

make install

Następnie możesz przetestować program, uruchamiając

make test

Spowoduje to:

  • Uruchomienie skryptu, który utworzy tabelę w bazie danych i wypełni ją danymi. (w tym celu program mysql powinien znajdować się w twojej ścieżce). Domyślnie używana baza danych to testdb.
  • Uruchomienie programu testowego testdb
  • Ponowne uruchomienie skryptu powłoki, który usunie utworzoną tabelę.

Na ekranie zobaczysz wiele komunikatów, które zawierają informacje zwrotne i wyniki. Jeśli coś poszło nie tak, make poinformuje Cię o tym.

Wróć do Listy Pakietów

Zobacz także