Sign in Join
Wiki copytemporary

mysql/pl: what changed

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

OldNewLine
11## Przegląd
22
33Możesz użyć Free Pascal/Lazarus, aby uzyskać dostęp do serwera bazy danych MySQL.
44
55Win64: zobacz ostrzeżenie [[Windows Programming Tips|tutaj]] dotyczące nieużywania niektórych wersji FPC/Lazarus Win64.
66
77Zalety MySQL:
88
99- Jest bardzo szeroko stosowany i dostępny
1010- 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)
1111
1212Wady MySQL:
1313
1414- 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.
1515- 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.
1616
1717Z tego powodu wielu użytkowników Lazarusa/FPC preferuje bazy danych [[Firebird]] lub [[postgresql|PostgreSQL]].
1818
1919## Licencjonowanie MySQL
2020
2121Przed znaczącym wdrożeniem MySQL nie zapomnij przeczytać jej [licencji](https://www.mysql.com/about/legal/licensing/oem/).
2222
2323## SQLDB
2424
2525Lazarus 1.2 (z FPC 2.6.2), obsługuje
2626
2727- Biblioteka klienta MySQL 4.0
2828- Biblioteka klienta MySQL 4.1
2929- Biblioteka klienta MySQL 5.0
3030- Biblioteka klienta MySQL 5.1
3131- Biblioteka klienta MySQL 5.5 (obsługiwana od wersji Lazarus 1.0.8)
3232- Biblioteka klienta MySQL 5.6 (obsługiwana od Lazarusa ?)
3333- Biblioteka klienta MySQL 5.7 (obsługiwana od Lazarusa ?)
3434- Biblioteka klienta MySQL 8.0 (obsługiwana od Lazarusa ?)
3535
3636![](/wiki-images/c/c1/Sqldbcomponents2.png)
3737
3838Nowsze wersje FPC/Lazarus mogą obsługiwać nowsze biblioteki klienta MySQL.
3939
4040Upewnij 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.
4141
4242W 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:
4343
4444- (w wielu Linuksach) zainstalowanie biblioteki w wersji -dev
4545- utworzenie dowiązania symbolicznego twojej konkretnej nazwy biblioteki do tej, której szuka FPC (raczej hakerskie)
4646- użycie [[TSQLDBLibraryLoader]], aby określić nazwę biblioteki przed załadowaniem połączenia
4747
4848## Samouczki SQLDB i przykładowy kod
4949
5050*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*
5151
5252### Uruchom serwer MySQL działający w systemie Linux lub Windows
5353
5454Postę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.
5555
5656### Spraw, aby MySQL działał dla FPC w trybie tekstowym
5757
5858W 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:
5959
6060``` sql
6161CREATE DATABASE testdb;
6262```
6363
6464następnie upewnij się, że wszyscy właściwi użytkownicy mają do niego odpowiednie uprawnienia dostępu
6565
6666``` sql
6767GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';
6868```
6969
7070Istnieje skrypt o nazwie mkdb, który powinieneś teraz spróbować uruchomić:
7171
72-`sh ./mkdb`
72+```text
73+sh ./mkdb
74+```
7375
7476Prawdopodobnie 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ł:
7577
76-`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
78+```text
79+mysql -u root -p ${1-testdb} << EOF >/dev/null
80+```
7781
7882i 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
7983
8084``` sql
8185select * from FPdev;
8286```
8387
8488Powinieneś zobaczyć tabelę zawierającą ID, nazwę użytkownika i adres e-mail niektórych programistów FPC.
8589
8690Teraz spróbuj uruchomić program testowy testdb.pp (może to wymagać skompilowania i prawie na pewno zakończy się niepowodzeniem przy pierwszej próbie !!).
8791
8892Zauważyłem, że program nie mógł połączyć się z mysql z kilku powodów:
8993
9094- Mój system (SuSE Linux v9.0) instaluje mysql v4.0.15, a nie wersję 3, dla której pakiet został zaprojektowany.
9195
9296- Program musi mieć nazwy użytkowników i hasła, aby uzyskać dostęp do bazy danych.
9397
9498- Kompilator musi wiedzieć, gdzie znaleźć biblioteki mysql (JEŚLI NIE ZAINSTALOWAŁEŚ BIBLIOTEK PROGRAMISTYCZNYCH MYSQL, ZRÓB TO TERAZ!)
9599
96100Utworzył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
97101
98102``` pascal
99103uses mysql_v4
100104```
101105
102106i oświadczenie w mysql_v4.pp do
103107
104108``` pascal
105109uses mysql_com_v4
106110```
107111
108112Dodałem wiersz do /etc/fpc.cfg, aby wskazać moje biblioteki:
109113
110-`-Fl/lib;/usr/lib`
114+```text
115+-Fl/lib;/usr/lib
116+```
111117
112118Nastę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:
113119
114-`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
120+```text
121+ln -s libmysqlclient.so.12.0.0 lmysqlclient
122+```
115123
116124aby utworzyć dowiązanie symboliczne umożliwiające FPC znalezienie biblioteki. Na wszelki wypadek stworzyłem też link
117125
118-`ln -s libmysqlclient.so.12.0.0 mysqlclient`
126+```text
127+ln -s libmysqlclient.so.12.0.0 mysqlclient
128+```
119129
120130i 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:
121131
122-`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
132+```text
133+ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
134+```
123135
124136Zmodyfikowałem trydb.pp, aby zawierał dane użytkownika, początkowo dodając hosta, użytkownika i hasło jako stałe Pchar:
125137
126138``` pascal
127139const
128140 host : Pchar= 'localhost';
129141 user : Pchar= 'myusername';
130142 passwd: Pchar = 'mypassword';
131143```
132144
133145> **Warning:** Ta sekcja wygląda na wyjątkowo nieaktualną. Jeśli nadal korzystasz z MySQL 4, być może nadszedł czas na aktualizację
134146
135147Odkrył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.
136148
137149Tak więc kod do połączenia z bazą danych to teraz:
138150
139151``` pascal
140152{ kilka dodatkowych zmiennych }
141153var
142154 alloc : PMYSQL;
143155
144156{fragment głównego programu}
145157
146158begin
147159 if paramcount=1 then
148160 begin
149161 Dummy:=Paramstr(1)+#0;
150162 DataBase:=@Dummy[1];
151163 end;
152164
153165 Writeln('Przydzielanie miejsca ...');
154166 alloc := mysql_init(PMYSQL(@qmysql));
155167 Write('Łączę się z MySQL ...');
156168 sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
157169 if sock=Nil then
158170 begin
159171 Writeln(stderr,'Nie można połączyć się z MySQL');
160172 Writeln(stderr, 'Błąd: ', mysql_error(@qmysql));
161173 halt(1);
162174 end;
163175 Writeln('Gotowe.');
164176 Writeln('Parametry połączenia:');
165177 {$ifdef Unix}
166178 writeln('Mysql_port : ',mysql_port);
167179 writeln('Mysql_unix_port : ',mysql_unix_port);
168180 {$endif}
169181 writeln('Host info : ',mysql_get_host_info(sock));
170182 writeln('Server info : ',mysql_stat(sock));
171183 writeln('Client info : ',mysql_get_client_info);
172184
173185 Writeln('Wybór bazy danych ',DataBase,'...');
174186 if mysql_select_db(sock, DataBase) < 0 then
175187 begin
176188 Writeln(stderr,'Nie udało się wybrać bazy danych ',Database);
177189 Writeln(stderr,mysql_error(sock));
178190 halt(1);
179191 end;
180192 {... dalej oryginalna zawartość pliku testdb.pp}
181193```
182194
183195Teraz - gotowy do rozpoczęcia kompilacji trydb.pp?
184196
185-` fpc trydb`
197+```text
198+ fpc trydb
199+```
186200
187201sukces! Teraz uruchom to:
188202
189-` ./trydb`
203+```text
204+ ./trydb
205+```
190206
191207Super! Mam listę twórców FPC!
192208
193209Kilka 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.
194210
195211Zobacz [[Lazarus Database Tutorial/SampleListing|przykładową lista konsoli]].
196212
197213### Łączenie się z MySQL z aplikacji Lazarus
198214
199215Ten 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.
200216
201217Utwórz nowy projekt w Lazarusie:
202218
203-`Projekt -> Nowy projekt -> Aplikacja (en: Project -> New Project -> Application)`
219+```text
220+Projekt -> Nowy projekt -> Aplikacja (en: Project -> New Project -> Application)
221+```
204222
205223Pojawi się nowy automatycznie wygenerowany formularz.
206224
207225Powiększ formularz, aby wypełnić mniej więcej połowę ekranu, a następnie zmień nazwę formularza i jego podpis na „TryMySQL”.
208226
209227Z 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.
210228
211229Zaznacz 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.
212230
213231Teraz umieść kolejne pole edycji i etykietę u góry po prawej stronie formularza. Zmień etykietę na „Wpisz polecenie SQL” i nazwij ją CommandEdit.
214232
215233Umieść trzy przyciski na formularzu: dwa po lewej stronie pod polami edycji i jeden po prawej stronie pod polem poleceń.
216234
217235Oznacz przyciski po lewej stronie „Połącz z bazą” (ConnectButton) i „Wyjdź” (ExitButton), a przycisk po prawej stronie „Wyślij zapytanie” (QueryButton).
218236
219237Umieść 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.
220238
221239Umieść pasek stanu Status Bar(z zakładki Common Controls) na dole formularza i ustaw jego właściwość SimpleText na „TryMySQL”.
222240
223241Zrzut ekranu formularza można zobaczyć tutaj: [Mysql Przykładowy zrzut ekranu](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png)
224242
225243Teraz musimy napisać kilka procedur obsługi zdarzeń.
226244
227245Trzy 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.
228246
229247Odpowiedzi 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.
230248
231249Ciągi znaków są wyświetlane w polu Memo przy użyciu:
232250
233251``` pascal
234252procedure ShowString(S : string);
235253(* wyświetl ciąg w polu Memo *)
236254begin
237255 trymysqlForm1.ResultsMemo.Lines.Add(S)
238256end;
239257```
240258
241259Procedura obsługi zdarzeń ConnectButton wygląda następująco:
242260
243261``` pascal
244262procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
245263(* Połącz się z MySQL przy użyciu danych użytkownika z pól tekstowych głównego formularza *)
246264var strg: string;
247265
248266begin
249267 dummy1 := trymysqlForm1.HostEdit.text+#0;
250268 host := @dummy1[1];
251269 dummy2 := trymysqlForm1.UserEdit.text+#0;
252270 user := @dummy2[1] ;
253271 dummy3 := trymysqlForm1.PasswdEdit.text+#0;
254272 passwd := @dummy3[1] ;
255273
256274 alloc := mysql_init(PMYSQL(@qmysql));
257275 sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
258276 if sock=Nil then
259277 begin
260278 strg :='Nie można połączyć się z MySQL.'; showstring (strg);
261279 Strg :='Błąd: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
262280 end
263281 else
264282 begin
265283 trymysqlForm1.statusBar1.simpletext := 'Połączono z MySQL';
266284 strg := 'Teraz wybieram bazę danych: ' + database; showstring (strg);
267285 {$ifdef Unix}
268286 strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg);
269287 strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
270288 {$endif}
271289 Strg :='Host info : ' + StrPas(mysql_get_host_info(sock));
272290 showstring (strg);
273291 Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg);
274292 Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg);
275293
276294 trymysqlForm1.statusbar1.simpletext := 'Wybór bazy danych ' + DataBase +'...';
277295 if mysql_select_db(sock,DataBase) < 0 then
278296 begin
279297 strg :='Nie udało się wybrać bazy danych '+ Database; ShowString (strg);
280298 Strg := mysql_error(sock); ShowString (strg);
281299 end
282300 end;
283301end;
284302```
285303
286304Pole 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.
287305
288306Procedura 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.
289307
290308Róż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'.
291309
292310Kod dla SendQuery jest następujący:
293311
294312``` pascal
295313procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
296314var
297315 dumquery, strg: string;
298316begin
299317 dumquery := TrymysqlForm1.CommandEdit.text;
300318 dumquery := dumquery+#0;
301319 query := @dumquery[1];
302320 trymysqlForm1.statusbar1.simpletext := 'Wykonywanie zapytania: '+ dumQuery +'...';
303321 strg := 'Wykonywanie zapytania: ' + dumQuery; showstring (strg);
304322 if (mysql_query(sock,Query) < 0) then
305323 begin
306324 Strg :='Zapytanie nie powiodło się '+ StrPas(mysql_error(sock)); showstring (strg);
307325 end
308326 else
309327 begin
310328 recbuf := mysql_store_result(sock);
311329 if RecBuf=Nil then
312330 begin
313331 Strg :='Zapytanie zwróciło wynik nil.'; showstring (strg);
314332 end
315333 else
316334 begin
317335 strg :='Liczba zwróconych rekordów: ' + IntToStr(mysql_num_rows (recbuf));
318336 Showstring (strg);
319337 Strg :='Liczba pól w rekordzie: ' + IntToStr(mysql_num_fields(recbuf));
320338 showstring (strg);
321339 rowbuf := mysql_fetch_row(recbuf);
322340 while (rowbuf <>nil) do
323341 begin
324342 Strg :='(Id: '+ rowbuf[0]+', Imię: ' + rowbuf[1]+ ', Email : ' +
325343 rowbuf[2] +')';
326344 showstring(strg);
327345 rowbuf := mysql_fetch_row(recbuf);
328346 end;
329347 end;
330348 end;
331349end;
332350```
333351
334352Zapisz swój projekt i naciśnij Uruchom -\> Uruchom (en: Run -\> Run)
335353
336354#### Pobierz przykładowy kod źródłowy
337355
338356> **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.
339357
340358Peł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)
341359
342360### Lazarus, MySQL i UTF-8
343361
344362*Poniższe może być wymagane również w przypadku innych stron kodowych/zestawów znaków*
345363
346364UTF-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.
347365
348366Jednak ustawiając to kodowanie tak po prostu jako domyślne dla
349367
350368- twojej tabeli i
351369- komponentu połączenia MySQL (np. `TMySQL51Connection.CharSet:='UTF8';`)
352370
353371spowoduje 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.
354372
355373Aby 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:
356374
357375``` sql
358376SET CHARACTER SET `utf8`
359377```
360378
361379i
362380
363381``` sql
364382SET NAMES 'utf8'
365383```
366384
367385Pierwsze 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.
368386
369387### Proste demo MySQL przy użyciu komponentu TMySQL5xConnection
370388
371389Oto 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:
372390
373391- 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
374392- w systemie Linux/OSX: zainstaluj bibliotekę klienta mysql w swojej ścieżce (np. używając menedżera pakietów Twojej dystrybucji)
375393
376394Podczas 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.
377395
378396### Przykład kodu
379397
380398Poniż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]].
381399
382400Umieść w formularzu trzy pola edycji, pole notatki i kilka przycisków. Musisz dodać mysqlXXconn i sqldb do instrukcji uses.
383401
384402W 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.
385403
386404Najpierw 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.
387405
388406### Przykładowy kod
389407
390408Poniż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]].
391409
392410Umieść w formularzu trzy pola edycji, pole notatki i kilka przycisków. Musisz dodać mysqlXXconn i sqldb do instrukcji uses.
393411
394412W 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.
395413
396414Najpierw 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.
397415
398416``` pascal
399417unit unt_db;
400418// Przykład oparty na:
401419// http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&t=5761
402420// od tpglemur na tym forum
403421{$mode objfpc}{$H+}
404422interface
405423uses
406424 Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
407425 mysql50conn, sqldb, StdCtrls;
408426type
409427 { TForm1 }
410428 TForm1 = class(TForm)
411429 btnTest: TButton;
412430 btnNext: TButton;
413431 btnFirst: TButton;
414432 btnNew: TButton;
415433 edtPersonID: TEdit;
416434 edtSurname: TEdit;
417435 edtDOB: TEdit;
418436 Memo1: TMemo;
419437 procedure btnFirstClick(Sender: TObject);
420438 procedure btnNewClick(Sender: TObject);
421439 procedure btnNextClick(Sender: TObject);
422440 procedure btnTestClick(Sender: TObject);
423441 private
424442 { private declarations }
425443 conn : TMySQL50Connection;
426444 query : TSQLQuery;
427445 transaction : TSQLTransaction;
428446 procedure Display;
429447 public
430448 { public declarations }
431449 end;
432450var
433451 Form1: TForm1;
434452implementation
435453{ TForm1 }
436454procedure TForm1.btnTestClick(Sender: TObject);
437455var
438456 S: String;
439457begin
440458 conn := TMySQL50Connection.Create(nil);
441459 query := TSQLQuery.Create(nil);
442460 transaction := TSQLTransaction.Create(nil);
443461 try
444462 try
445463 // Dostosuj do własnego serwera bazy danych, nazwy użytkownika i hasła:
446464 conn.HostName := '127.0.0.1';
447465 conn.UserName := 'root';
448466 conn.Password := '';
449467 // Jeśli używasz innej nazwy bazy danych, dostosuj tutaj:
450468 conn.DatabaseName := 'test1';
451469 conn.Connected := True;
452470 conn.Transaction := transaction;
453471 query.DataBase := conn;
454472 //query.ParseSQL := true; //linia niepotrzebna - i tak jest to ustawienie domyślne
455473 //query.ReadOnly := false; //linia niepotrzebna - i tak jest to ustawienie domyślne
456474 query.SQL.Text := 'select * from tperson';
457475 query.Open;
458476
459477 query.Last;
460478 S := IntToStr(query.RecordCount) + #13#10;
461479 query.First;
462480
463481 while not query.EOF do
464482 begin
465483 S := S + query.FieldByName('surname').AsString + #13#10;
466484 query.Next;
467485 end;
468486 finally
469487 //query.Free;
470488 //conn.Free;
471489 end;
472490 except
473491 on E: Exception do
474492 ShowMessage(E.message);
475493 end;
476494 Memo1.Text:= S;
477495end;
478496
479497procedure TForm1.Display;
480498begin
481499 edtPersonID.Text := query.FieldByName('personid').AsString;
482500 edtSurname.Text := query.FieldByName('surname').AsString;
483501 edtDOB.Text := query.FieldByName('dob').AsString;
484502end;
485503
486504procedure TForm1.btnFirstClick(Sender: TObject);
487505begin
488506 query.First;
489507 Display;
490508end;
491509
492510procedure TForm1.btnNewClick(Sender: TObject);
493511begin
494512 query.Append;
495513 query.FieldValues['personid'] := edtPersonID.Text;
496514 query.FieldValues['surname'] := edtSurname.Text;
497515 query.FieldValues['dob'] := edtDOB.Text;
498516 query.Post;
499517 query.ApplyUpdates; //aby zaktualizować dane w bazie
500518 transaction.Commit; //Potrzebne od FPC 2.6.4; todo: ktoś powinien sprawdzić, czy to wystarczy
501519end;
502520
503521procedure TForm1.btnNextClick(Sender: TObject);
504522begin
505523 query.Next;
506524 Display;
507525end;
508526
509527initialization
510528 {$I unt_db.lrs}
511529end.
512530```
513531
514532### Kontrolki RAD/Databound
515533
516534Zobacz [[SQLdb Tutorial1]], [[SQLdb Tutorial2]] i dalsze samouczki.
517535
518536## Zeos
519537
520538Zobacz [[ZeosDBO]]
521539
522540[1](http://pdo.sourceforge.net)
523541
524542## Pascal Data Objects (PDO)
525543
526544Pascal Data Objects to alternatywna warstwa dostępu do danych, która wydaje się obsługiwać:
527545
528546- Klientów MySQL 4.0
529547- Klientów MySQL 4.1
530548- Klientów MySQL 5.0
531549- (a także) Firebird 1.5 i 2.0
532550
533551Obsł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:
534552
535553[2](http://pdo.sourceforge.net)
536554
537555## Pakiet MySQL: moduł niskiego poziomu
538556
539557Podobnie 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.
540558
541559Uż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.
542560
543561### Dostarczone moduły i programy
544562
545563W pakiecie znajdują się 3 moduły, z których zwykle potrzebny jest tylko pierwszy:
546564
547565- *mysql* - główny moduł mysql.
548566- *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.
549567- *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.
550568
551569Przykładowe programy można znaleźć w katalogu \<fpc\>\packages\mysql\examples.
552570
553571### Instalacja
554572
555573Interfejs mysql jest rozpowszechniany z pakietami Free Pascal i wraz z dystrybucją kompilatora: Normalnie nie należy podejmować żadnych działań, aby pracować z MySQL.
556574
557575Jeśli chcesz samodzielnie zmodyfikować i skompilować moduły, źródła mysql znajdują się w katalogu pakietów: *packages/mysql*
558576
559577Ten katalog zawiera moduły, program testowy i plik makefile. Przejdź to tego katalogu komendą cd i wpisz
560578
561-`make`
579+```text
580+make
581+```
562582
563583Powinno to skompilować moduły. Jeśli kompilacja się powiodła, możesz zainstalować je poleceniem
564584
565-`make install`
585+```text
586+make install
587+```
566588
567589Następnie możesz przetestować program, uruchamiając
568590
569-`make test`
591+```text
592+make test
593+```
570594
571595Spowoduje to:
572596
573597- 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.
574598- Uruchomienie programu testowego testdb
575599- Ponowne uruchomienie skryptu powłoki, który usunie utworzoną tabelę.
576600
577601Na ekranie zobaczysz wiele komunikatów, które zawierają informacje zwrotne i wyniki. Jeśli coś poszło nie tak, make poinformuje Cię o tym.
578602
579603Wróć do [[Package List|Listy Pakietów]]
580604
581605## Zobacz także
582606
583607- [[Lazarus DB Faq|Najczęęściej zadawane pytania]] - Więcej o programowaniu baz danych
584608- [[SQLdb Tutorial1|SQLdb Samouczek1]] - seria samouczków SQLDB, które przeprowadzą Cię przez proces tworzenia działającej aplikacji GUI siatki bazy danych
585609- [[Lazarus Database Overview|Przegląd baz danych Lazarusa]] - Uruchomienie Lazarusa do pracy z różnymi bazami danych
586610
587611---
588612*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