Sign in Join
Wiki copytemporary

mysql/pl: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: mysql/pl

OldNewLine
1+## Przegląd
2+
3+Możesz użyć Free Pascal/Lazarus, aby uzyskać dostęp do serwera bazy danych MySQL.
4+
5+Win64: zobacz ostrzeżenie [[Windows Programming Tips|tutaj]] dotyczące nieużywania niektórych wersji FPC/Lazarus Win64.
6+
7+Zalety MySQL:
8+
9+- Jest bardzo szeroko stosowany i dostępny
10+- 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)
11+
12+Wady MySQL:
13+
14+- 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.
15+- 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.
16+
17+Z tego powodu wielu użytkowników Lazarusa/FPC preferuje bazy danych [[Firebird]] lub [[postgresql|PostgreSQL]].
18+
19+## Licencjonowanie MySQL
20+
21+Przed znaczącym wdrożeniem MySQL nie zapomnij przeczytać jej [licencji](https://www.mysql.com/about/legal/licensing/oem/).
22+
23+## SQLDB
24+
25+Lazarus 1.2 (z FPC 2.6.2), obsługuje
26+
27+- Biblioteka klienta MySQL 4.0
28+- Biblioteka klienta MySQL 4.1
29+- Biblioteka klienta MySQL 5.0
30+- Biblioteka klienta MySQL 5.1
31+- Biblioteka klienta MySQL 5.5 (obsługiwana od wersji Lazarus 1.0.8)
32+- Biblioteka klienta MySQL 5.6 (obsługiwana od Lazarusa ?)
33+- Biblioteka klienta MySQL 5.7 (obsługiwana od Lazarusa ?)
34+- Biblioteka klienta MySQL 8.0 (obsługiwana od Lazarusa ?)
35+
36+![](/wiki-images/c/c1/Sqldbcomponents2.png)
37+
38+Nowsze wersje FPC/Lazarus mogą obsługiwać nowsze biblioteki klienta MySQL.
39+
40+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.
41+
42+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:
43+
44+- (w wielu Linuksach) zainstalowanie biblioteki w wersji -dev
45+- utworzenie dowiązania symbolicznego twojej konkretnej nazwy biblioteki do tej, której szuka FPC (raczej hakerskie)
46+- użycie [[TSQLDBLibraryLoader]], aby określić nazwę biblioteki przed załadowaniem połączenia
47+
48+## Samouczki SQLDB i przykładowy kod
49+
50+*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*
51+
52+### Uruchom serwer MySQL działający w systemie Linux lub Windows
53+
54+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.
55+
56+### Spraw, aby MySQL działał dla FPC w trybie tekstowym
57+
58+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:
59+
60+``` sql
61+CREATE DATABASE testdb;
62+```
63+
64+następnie upewnij się, że wszyscy właściwi użytkownicy mają do niego odpowiednie uprawnienia dostępu
65+
66+``` sql
67+GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';
68+```
69+
70+Istnieje skrypt o nazwie mkdb, który powinieneś teraz spróbować uruchomić:
71+
72+`sh ./mkdb`
73+
74+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ł:
75+
76+`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
77+
78+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
79+
80+``` sql
81+select * from FPdev;
82+```
83+
84+Powinieneś zobaczyć tabelę zawierającą ID, nazwę użytkownika i adres e-mail niektórych programistów FPC.
85+
86+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 !!).
87+
88+Zauważyłem, że program nie mógł połączyć się z mysql z kilku powodów:
89+
90+- Mój system (SuSE Linux v9.0) instaluje mysql v4.0.15, a nie wersję 3, dla której pakiet został zaprojektowany.
91+
92+- Program musi mieć nazwy użytkowników i hasła, aby uzyskać dostęp do bazy danych.
93+
94+- Kompilator musi wiedzieć, gdzie znaleźć biblioteki mysql (JEŚLI NIE ZAINSTALOWAŁEŚ BIBLIOTEK PROGRAMISTYCZNYCH MYSQL, ZRÓB TO TERAZ!)
95+
96+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
97+
98+``` pascal
99+uses mysql_v4
100+```
101+
102+i oświadczenie w mysql_v4.pp do
103+
104+``` pascal
105+uses mysql_com_v4
106+```
107+
108+Dodałem wiersz do /etc/fpc.cfg, aby wskazać moje biblioteki:
109+
110+`-Fl/lib;/usr/lib`
111+
112+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:
113+
114+`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
115+
116+aby utworzyć dowiązanie symboliczne umożliwiające FPC znalezienie biblioteki. Na wszelki wypadek stworzyłem też link
117+
118+`ln -s libmysqlclient.so.12.0.0 mysqlclient`
119+
120+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:
121+
122+`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
123+
124+Zmodyfikowałem trydb.pp, aby zawierał dane użytkownika, początkowo dodając hosta, użytkownika i hasło jako stałe Pchar:
125+
126+``` pascal
127+const
128+ host : Pchar= 'localhost';
129+ user : Pchar= 'myusername';
130+ passwd: Pchar = 'mypassword';
131+```
132+
133+> **Warning:** Ta sekcja wygląda na wyjątkowo nieaktualną. Jeśli nadal korzystasz z MySQL 4, być może nadszedł czas na aktualizację
134+
135+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.
136+
137+Tak więc kod do połączenia z bazą danych to teraz:
138+
139+``` pascal
140+{ kilka dodatkowych zmiennych }
141+var
142+ alloc : PMYSQL;
143+
144+{fragment głównego programu}
145+
146+begin
147+ if paramcount=1 then
148+ begin
149+ Dummy:=Paramstr(1)+#0;
150+ DataBase:=@Dummy[1];
151+ end;
152+
153+ Writeln('Przydzielanie miejsca ...');
154+ alloc := mysql_init(PMYSQL(@qmysql));
155+ Write('Łączę się z MySQL ...');
156+ sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
157+ if sock=Nil then
158+ begin
159+ Writeln(stderr,'Nie można połączyć się z MySQL');
160+ Writeln(stderr, 'Błąd: ', mysql_error(@qmysql));
161+ halt(1);
162+ end;
163+ Writeln('Gotowe.');
164+ Writeln('Parametry połączenia:');
165+ {$ifdef Unix}
166+ writeln('Mysql_port : ',mysql_port);
167+ writeln('Mysql_unix_port : ',mysql_unix_port);
168+ {$endif}
169+ writeln('Host info : ',mysql_get_host_info(sock));
170+ writeln('Server info : ',mysql_stat(sock));
171+ writeln('Client info : ',mysql_get_client_info);
172+
173+ Writeln('Wybór bazy danych ',DataBase,'...');
174+ if mysql_select_db(sock, DataBase) < 0 then
175+ begin
176+ Writeln(stderr,'Nie udało się wybrać bazy danych ',Database);
177+ Writeln(stderr,mysql_error(sock));
178+ halt(1);
179+ end;
180+ {... dalej oryginalna zawartość pliku testdb.pp}
181+```
182+
183+Teraz - gotowy do rozpoczęcia kompilacji trydb.pp?
184+
185+` fpc trydb`
186+
187+sukces! Teraz uruchom to:
188+
189+` ./trydb`
190+
191+Super! Mam listę twórców FPC!
192+
193+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.
194+
195+Zobacz [[Lazarus Database Tutorial/SampleListing|przykładową lista konsoli]].
196+
197+### Łączenie się z MySQL z aplikacji Lazarus
198+
199+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.
200+
201+Utwórz nowy projekt w Lazarusie:
202+
203+`Projekt -> Nowy projekt -> Aplikacja (en: Project -> New Project -> Application)`
204+
205+Pojawi się nowy automatycznie wygenerowany formularz.
206+
207+Powiększ formularz, aby wypełnić mniej więcej połowę ekranu, a następnie zmień nazwę formularza i jego podpis na „TryMySQL”.
208+
209+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.
210+
211+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.
212+
213+Teraz umieść kolejne pole edycji i etykietę u góry po prawej stronie formularza. Zmień etykietę na „Wpisz polecenie SQL” i nazwij ją CommandEdit.
214+
215+Umieść trzy przyciski na formularzu: dwa po lewej stronie pod polami edycji i jeden po prawej stronie pod polem poleceń.
216+
217+Oznacz przyciski po lewej stronie „Połącz z bazą” (ConnectButton) i „Wyjdź” (ExitButton), a przycisk po prawej stronie „Wyślij zapytanie” (QueryButton).
218+
219+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.
220+
221+Umieść pasek stanu Status Bar(z zakładki Common Controls) na dole formularza i ustaw jego właściwość SimpleText na „TryMySQL”.
222+
223+Zrzut ekranu formularza można zobaczyć tutaj: [Mysql Przykładowy zrzut ekranu](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png)
224+
225+Teraz musimy napisać kilka procedur obsługi zdarzeń.
226+
227+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.
228+
229+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.
230+
231+Ciągi znaków są wyświetlane w polu Memo przy użyciu:
232+
233+``` pascal
234+procedure ShowString(S : string);
235+(* wyświetl ciąg w polu Memo *)
236+begin
237+ trymysqlForm1.ResultsMemo.Lines.Add(S)
238+end;
239+```
240+
241+Procedura obsługi zdarzeń ConnectButton wygląda następująco:
242+
243+``` pascal
244+procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
245+(* Połącz się z MySQL przy użyciu danych użytkownika z pól tekstowych głównego formularza *)
246+var strg: string;
247+
248+begin
249+ dummy1 := trymysqlForm1.HostEdit.text+#0;
250+ host := @dummy1[1];
251+ dummy2 := trymysqlForm1.UserEdit.text+#0;
252+ user := @dummy2[1] ;
253+ dummy3 := trymysqlForm1.PasswdEdit.text+#0;
254+ passwd := @dummy3[1] ;
255+
256+ alloc := mysql_init(PMYSQL(@qmysql));
257+ sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
258+ if sock=Nil then
259+ begin
260+ strg :='Nie można połączyć się z MySQL.'; showstring (strg);
261+ Strg :='Błąd: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
262+ end
263+ else
264+ begin
265+ trymysqlForm1.statusBar1.simpletext := 'Połączono z MySQL';
266+ strg := 'Teraz wybieram bazę danych: ' + database; showstring (strg);
267+ {$ifdef Unix}
268+ strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg);
269+ strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
270+ {$endif}
271+ Strg :='Host info : ' + StrPas(mysql_get_host_info(sock));
272+ showstring (strg);
273+ Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg);
274+ Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg);
275+
276+ trymysqlForm1.statusbar1.simpletext := 'Wybór bazy danych ' + DataBase +'...';
277+ if mysql_select_db(sock,DataBase) < 0 then
278+ begin
279+ strg :='Nie udało się wybrać bazy danych '+ Database; ShowString (strg);
280+ Strg := mysql_error(sock); ShowString (strg);
281+ end
282+ end;
283+end;
284+```
285+
286+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.
287+
288+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.
289+
290+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'.
291+
292+Kod dla SendQuery jest następujący:
293+
294+``` pascal
295+procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
296+var
297+ dumquery, strg: string;
298+begin
299+ dumquery := TrymysqlForm1.CommandEdit.text;
300+ dumquery := dumquery+#0;
301+ query := @dumquery[1];
302+ trymysqlForm1.statusbar1.simpletext := 'Wykonywanie zapytania: '+ dumQuery +'...';
303+ strg := 'Wykonywanie zapytania: ' + dumQuery; showstring (strg);
304+ if (mysql_query(sock,Query) < 0) then
305+ begin
306+ Strg :='Zapytanie nie powiodło się '+ StrPas(mysql_error(sock)); showstring (strg);
307+ end
308+ else
309+ begin
310+ recbuf := mysql_store_result(sock);
311+ if RecBuf=Nil then
312+ begin
313+ Strg :='Zapytanie zwróciło wynik nil.'; showstring (strg);
314+ end
315+ else
316+ begin
317+ strg :='Liczba zwróconych rekordów: ' + IntToStr(mysql_num_rows (recbuf));
318+ Showstring (strg);
319+ Strg :='Liczba pól w rekordzie: ' + IntToStr(mysql_num_fields(recbuf));
320+ showstring (strg);
321+ rowbuf := mysql_fetch_row(recbuf);
322+ while (rowbuf <>nil) do
323+ begin
324+ Strg :='(Id: '+ rowbuf[0]+', Imię: ' + rowbuf[1]+ ', Email : ' +
325+ rowbuf[2] +')';
326+ showstring(strg);
327+ rowbuf := mysql_fetch_row(recbuf);
328+ end;
329+ end;
330+ end;
331+end;
332+```
333+
334+Zapisz swój projekt i naciśnij Uruchom -\> Uruchom (en: Run -\> Run)
335+
336+#### Pobierz przykładowy kod źródłowy
337+
338+> **Warning:** 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.
339+
340+Pełny listing programu jest dostępny tutaj [/ pobierz przykładowy kod źródłowy](http://sourceforge.net/projects/lazarus-ccr/files/Demos%20and%20examples/MySql%20demo%20using%20SQLdb%20components%208%20April%202005/mysql_demo_20050408.tar.gz)
341+
342+### Lazarus, MySQL i UTF-8
343+
344+*Poniższe może być wymagane również w przypadku innych stron kodowych/zestawów znaków*
345+
346+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.
347+
348+Jednak ustawiając to kodowanie tak po prostu jako domyślne dla
349+
350+- twojej tabeli i
351+- komponentu połączenia MySQL (np. `TMySQL51Connection.CharSet:='UTF8';`)
352+
353+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.
354+
355+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:
356+
357+``` sql
358+SET CHARACTER SET `utf8`
359+```
360+
361+i
362+
363+``` sql
364+SET NAMES 'utf8'
365+```
366+
367+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.
368+
369+### Proste demo MySQL przy użyciu komponentu TMySQL5xConnection
370+
371+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:
372+
373+- 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
374+- w systemie Linux/OSX: zainstaluj bibliotekę klienta mysql w swojej ścieżce (np. używając menedżera pakietów Twojej dystrybucji)
375+
376+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.
377+
378+### Przykład kodu
379+
380+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]].
381+
382+Umieść w formularzu trzy pola edycji, pole notatki i kilka przycisków. Musisz dodać mysqlXXconn i sqldb do instrukcji uses.
383+
384+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.
385+
386+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.
387+
388+### Przykładowy kod
389+
390+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]].
391+
392+Umieść w formularzu trzy pola edycji, pole notatki i kilka przycisków. Musisz dodać mysqlXXconn i sqldb do instrukcji uses.
393+
394+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.
395+
396+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.
397+
398+``` pascal
399+unit unt_db;
400+// Przykład oparty na:
401+// http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=5761
402+// od tpglemur na tym forum
403+{$mode objfpc}{$H+}
404+interface
405+uses
406+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
407+ mysql50conn, sqldb, StdCtrls;
408+type
409+ { TForm1 }
410+ TForm1 = class(TForm)
411+ btnTest: TButton;
412+ btnNext: TButton;
413+ btnFirst: TButton;
414+ btnNew: TButton;
415+ edtPersonID: TEdit;
416+ edtSurname: TEdit;
417+ edtDOB: TEdit;
418+ Memo1: TMemo;
419+ procedure btnFirstClick(Sender: TObject);
420+ procedure btnNewClick(Sender: TObject);
421+ procedure btnNextClick(Sender: TObject);
422+ procedure btnTestClick(Sender: TObject);
423+ private
424+ { private declarations }
425+ conn : TMySQL50Connection;
426+ query : TSQLQuery;
427+ transaction : TSQLTransaction;
428+ procedure Display;
429+ public
430+ { public declarations }
431+ end;
432+var
433+ Form1: TForm1;
434+implementation
435+{ TForm1 }
436+procedure TForm1.btnTestClick(Sender: TObject);
437+var
438+ S: String;
439+begin
440+ conn := TMySQL50Connection.Create(nil);
441+ query := TSQLQuery.Create(nil);
442+ transaction := TSQLTransaction.Create(nil);
443+ try
444+ try
445+ // Dostosuj do własnego serwera bazy danych, nazwy użytkownika i hasła:
446+ conn.HostName := '127.0.0.1';
447+ conn.UserName := 'root';
448+ conn.Password := '';
449+ // Jeśli używasz innej nazwy bazy danych, dostosuj tutaj:
450+ conn.DatabaseName := 'test1';
451+ conn.Connected := True;
452+ conn.Transaction := transaction;
453+ query.DataBase := conn;
454+ //query.ParseSQL := true; //linia niepotrzebna - i tak jest to ustawienie domyślne
455+ //query.ReadOnly := false; //linia niepotrzebna - i tak jest to ustawienie domyślne
456+ query.SQL.Text := 'select * from tperson';
457+ query.Open;
458+
459+ query.Last;
460+ S := IntToStr(query.RecordCount) + #13#10;
461+ query.First;
462+
463+ while not query.EOF do
464+ begin
465+ S := S + query.FieldByName('surname').AsString + #13#10;
466+ query.Next;
467+ end;
468+ finally
469+ //query.Free;
470+ //conn.Free;
471+ end;
472+ except
473+ on E: Exception do
474+ ShowMessage(E.message);
475+ end;
476+ Memo1.Text:= S;
477+end;
478+
479+procedure TForm1.Display;
480+begin
481+ edtPersonID.Text := query.FieldByName('personid').AsString;
482+ edtSurname.Text := query.FieldByName('surname').AsString;
483+ edtDOB.Text := query.FieldByName('dob').AsString;
484+end;
485+
486+procedure TForm1.btnFirstClick(Sender: TObject);
487+begin
488+ query.First;
489+ Display;
490+end;
491+
492+procedure TForm1.btnNewClick(Sender: TObject);
493+begin
494+ query.Append;
495+ query.FieldValues['personid'] := edtPersonID.Text;
496+ query.FieldValues['surname'] := edtSurname.Text;
497+ query.FieldValues['dob'] := edtDOB.Text;
498+ query.Post;
499+ query.ApplyUpdates; //aby zaktualizować dane w bazie
500+ transaction.Commit; //Potrzebne od FPC 2.6.4; todo: ktoś powinien sprawdzić, czy to wystarczy
501+end;
502+
503+procedure TForm1.btnNextClick(Sender: TObject);
504+begin
505+ query.Next;
506+ Display;
507+end;
508+
509+initialization
510+ {$I unt_db.lrs}
511+end.
512+```
513+
514+### Kontrolki RAD/Databound
515+
516+Zobacz [[SQLdb Tutorial1]], [[SQLdb Tutorial2]] i dalsze samouczki.
517+
518+## Zeos
519+
520+Zobacz [[ZeosDBO]]
521+
522+[1](http://pdo.sourceforge.net)
523+
524+## Pascal Data Objects (PDO)
525+
526+Pascal Data Objects to alternatywna warstwa dostępu do danych, która wydaje się obsługiwać:
527+
528+- Klientów MySQL 4.0
529+- Klientów MySQL 4.1
530+- Klientów MySQL 5.0
531+- (a także) Firebird 1.5 i 2.0
532+
533+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:
534+
535+[2](http://pdo.sourceforge.net)
536+
537+## Pakiet MySQL: moduł niskiego poziomu
538+
539+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.
540+
541+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.
542+
543+### Dostarczone moduły i programy
544+
545+W pakiecie znajdują się 3 moduły, z których zwykle potrzebny jest tylko pierwszy:
546+
547+- *mysql* - główny moduł mysql.
548+- *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.
549+- *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.
550+
551+Przykładowe programy można znaleźć w katalogu \<fpc\>\packages\mysql\examples.
552+
553+### Instalacja
554+
555+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.
556+
557+Jeśli chcesz samodzielnie zmodyfikować i skompilować moduły, źródła mysql znajdują się w katalogu pakietów: *packages/mysql*
558+
559+Ten katalog zawiera moduły, program testowy i plik makefile. Przejdź to tego katalogu komendą cd i wpisz
560+
561+`make`
562+
563+Powinno to skompilować moduły. Jeśli kompilacja się powiodła, możesz zainstalować je poleceniem
564+
565+`make install`
566+
567+Następnie możesz przetestować program, uruchamiając
568+
569+`make test`
570+
571+Spowoduje to:
572+
573+- 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.
574+- Uruchomienie programu testowego testdb
575+- Ponowne uruchomienie skryptu powłoki, który usunie utworzoną tabelę.
576+
577+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.
578+
579+Wróć do [[Package List|Listy Pakietów]]
580+
581+## Zobacz także
582+
583+- [[Lazarus DB Faq|Najczęęściej zadawane pytania]] - Więcej o programowaniu baz danych
584+- [[SQLdb Tutorial1|SQLdb Samouczek1]] - seria samouczków SQLDB, które przeprowadzą Cię przez proces tworzenia działającej aplikacji GUI siatki bazy danych
585+- [[Lazarus Database Overview|Przegląd baz danych Lazarusa]] - Uruchomienie Lazarusa do pracy z różnymi bazami danych
586+
587+---
588+*From the Free Pascal wiki, page "mysql/pl", as it stood on 2023-01-26 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history