Sign in Join
Wiki copytemporary

MySQLDatabases/pl: what changed

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

OldNewLine
11## Wprowadzenie
22
33Ta strona wyjaśnia, jak połączyć się z serwerem bazy danych [[mysql|MySQL]] przy użyciu komponentów wizualnych.
44
55> **Note:** Ta strona została przetłumaczona z wersji angielskiej na język polski w dniu 2021.01.31, ale wersja angielska została napisana dawno temu i może nie być aktualna. Ponadto większość opisanych tutaj koncepcji nie jest specyficznych dla MySQL, ale ma zastosowanie do wszystkich baz danych SQLDB. Dlatego skorzystanie z poniższej serii samouczków SQLdb może być łatwiejsze
66
77Uwaga: zapoznaj się również z samouczkami, które uczą obsługi kontrolek związanych z danymi, zapytań parametrycznych, programowania niezależnego od bazy danych itp .:
88
99- [[SQLdb Tutorial1|SQLdb Samouczek1]]
1010- [[SQLdb Tutorial2|SQLdb Samouczek2]]
1111- [[SQLdb Tutorial3|SQLdb Samouczek3]]
1212
1313Te samouczki są napisane dla wszystkich baz danych obsługujących sqldb, w tym MySQL.
1414
1515W razie potrzeby zobacz również [[mysql|Samouczki SQLDB i przykładowy kod]], aby uzyskać więcej samouczków (które również zostały napisane dawno temu.
1616
1717## Dostępne komponenty
1818
1919### Komponenty SQLdb
2020
2121W każdej, nawet dość niedawnej wersji Lazarusa, komponenty SQLdb są instalowane domyślnie.
2222
2323![](/wiki-images/4/4b/Sqldbcomponents2.png%E2%80%8E)
2424
2525W zakładce SQLdb znajdziesz:
2626
2727- Różne złącza (connectors), w tym [[TMySQL40Connection]] .. [[TMySQL57Connection]] (a może nawet nowsze wersje) i najbardziej wszechstronne ze wszystkich [[TSQLConnector]], które mogą ładować dowolne ze sterowników baz danych takich jak mysql/oracle/postgres/mssql/interbase/firebird/odbc.
2828- [[TSQLQuery]]
2929
3030Jeśli brakuje karty SQLdb, zajrzyj do [[Install Packages|Instalowanie pakietów]], aby uzyskać instrukcje dotyczące instalacji.
3131
3232## Wyjaśnienie zastosowanych komponentów
3333
3434### TMySQLConnection
3535
3636TMySQLConnection służy do przechowywania parametrów połączenia z serwerem bazy danych. Umożliwia ustawienie hosta, z którym ma się łączyć, oraz identyfikatora użytkownika i hasła, które mają być używane w połączeniu. Inna właściwość TMySQLConnection służy do wskazania bazy danych, której chcesz użyć. „LoginPrompt” jeszcze nie działa, więc upewnij się, że obok właściwości HostName i DatabaseName uzupełnione są również wartości UserName i Password, zanim spróbujesz otworzyć połączenie. Pamiętaj, że aby użyć również TSQLTransaction i połączyć ją z MySQLConnection, ustaw właściwość Transaction, w przeciwnym razie nie będziesz mógł otworzyć zapytania SQLQuery.
3737
3838> **Note:** Jak wskazano powyżej, istnieją różne komponenty MySQLConnection, które różnią się numerem wersji. Numer wersji **musi** odpowiadać numerowi wersji biblioteki klienta, której używasz do łączenia się z serwerem. Jeśli więc używasz serwera MySQL 5.1, ale używasz klienta MySQL 5.0, użyj TMySQL50Connection.
3939
4040Powinieneś sprawdzić dokumentację MySQL, aby upewnić się, że połączenie między wersją klienta i wersją serwera jest obsługiwane - np. możesz mieć problemy z połączeniem się z serwerem 4.0 przy użyciu klienta 5.x.
4141
4242We wszystkich przypadkach należy umieścić kopię biblioteki libmysql.dll *i wszelkich innych wymaganych plików/bibliotek dll*
4343
4444- w twoim katalogu Lazarus i tym samym katalogu co pliki twojego projektu lub
4545- w katalogu systemowym Windows (jeśli nie chcesz dalej kopiować plików). Zauważ, że w 64-bitowym systemie Windows bibliotekę 32-bitową musisz umieścić w katalogu SysWOW64, podczas gdy biblioteki 64-bitowe należy przenieść do System32.
4646
4747### TSQLTransaction
4848
4949[[TSQLTransaction]] jest potrzebne do niektórych wewnętrznych procedur. SQLTransaction jest automatycznie aktywowana po otwarciu zestawu danych przy jej użyciu. Zamknięcie połączenia również dezaktywuje powiązaną transakcję i zamyka wszystkie korzystające z niej zbiory danych.
5050
5151### TSQLQuery
5252
5353[[TSQLQuery]] służy do wykonywania instrukcji SQL na serwerze. Możesz pobrać dane, ustawiając SQL na jakąś instrukcję SELECT i wywołując metodę Open. Możesz też manipulować danymi, wydając instrukcję INSERT, DELETE lub UPDATE. W tym drugim przypadku nie powinieneś używać metody Open, ale metodę ExecSQL.
5454
5555### TDataSource
5656
5757[[TDataSource]] zapewnia połączenie między widocznymi komponentami obsługującymi dane, takimi jak DBEdit, DBGrid i zbiorem danych. Przygotowuje dane do wyświetlania w komponentach obsługujących te dane. DataSource (źródło danych) może być jednocześnie połączone tylko z jednym zestawem danych, ale do niego może być połączonych kilka komponentów obsługujących dane.
5858
5959### TDBGrid
6060
6161[[TDBGrid]] może służyć do przedstawienia danych pobranych przez Dataset (zbiór danych). DBGrid potrzebuje Datasource (źródła danych), aby połączyć się ze zbirem danych. Gdy zbiór danych zostanie otwarty, DBGrid zostanie automatycznie wypełniony danymi.
6262
6363## Nasz program
6464
6565### Podstawy
6666
6767Spróbujemy stworzyć program w oparciu o ten stworzony [[Lazarus Database Tutorial/nl|tutaj (w języku niderlandzkim)]], który jest oparty na [[Lazarus Database Tutorial|oryginale (w języku angielskim)]] autorstwa Chris.
6868
6969### Formularz główny
7070
7171Użyjemy tego samego ekranu głównego i zbudujemy całą funkcjonalność od podstaw :) Jak zobaczysz, jest tu o wiele mniej do zrobienia, ponieważ komponenty naprawdę rozwiązują wszystkie trudne rzeczy! Zacznijmy więc od stworzenia ekranu, który wygląda tak:
7272
7373![](/wiki-images/f/f4/Trymysql_pl.png)
7474
7575Korzystając z zakładki SQLdb umieść na swojej formatce komponenty [[TMySQL56Connection]] ![](/wiki-images/9/97/Tmysql56connection.png) (lub inną wersję klienta mysql), [[TSQLTransaction]] ![](/wiki-images/b/bd/Tsqltransaction.png) i [[TSQLQuery]] ![](/wiki-images/b/bb/Tsqlquery.png). Nie zmieniaj domyślnych nazw nadanych tym komponentom. Z wyjątkiem komponentu łączącego do bazy. Aby artykuł był taki sam dla wszystkich wersji MySQL, nazwij komponent TMySQL##Connection: `MySQLConnection1`. Musimy te komponenty połączyć razem, aby mogły wykonywać swoją pracę. Dlatego należy ustawić następujące właściwości:
7676
7777| | | |
7878|------------------|----------------|------------------|
7979| **Komponent** | **Właściwość** | **Wartość** |
8080| MySQLConnection1 | Transaction | SQLTransaction1 |
8181| SQLTransaction1 | Database | MySQLConnection1 |
8282| SQLQuery1 | Transaction | SQLTransaction1 |
8383| SQLQuery1 | Database | MySQLConnection1 |
8484
8585Właściwość Transaction komponentu SQLQuery1 zostanie ustawiona automatycznie, jeśli najpierw ustawisz właściwość Transaction dla MySQLConnection1. Gdy to ustawisz, zauważysz, że SQLTransaction1.Database została ustawiona na MySQLConnection1.
8686
8787Jak wspomniano wcześniej: upewnij się, że używasz odpowiedniego komponentu połączenia dla swojej wersji serwera MySQL.
8888
8989### Kod
9090
9191Jak widać na zrzucie ekranu, jedynymi przyciskami dostępnymi po uruchomieniu programu są „Połącz z serwerem” i „Zakończ”. Aby inne przyciski działały, potrzebujemy więcej informacji, więc są one wyłączone. Moglibyśmy również zdecydować o wyłączeniu opcji „Połącz z serwerem” do czasu podania informacji o hoście, nazwie użytkownika i haśle. Zdecydowałem się tego nie robić, ponieważ nasz użytkownik mógłby pomyśleć: „Nic nie wydaje się możliwe, więc przejdźmy do wyjścia”. :)
9292
9393Zanim zacznę podawać jakikolwiek kod, chciałbym podkreślić, że w kodzie powinna być dodana obsługa wyjątków. Sekcje krytyczne należy umieścić w blokach kodu
9494
95-`try ... finally`
95+```text
96+try ... finally
97+```
9698
9799i / lub
98100
99-`try ... except`
101+```text
102+try ... except
103+```
100104
101105#### Połączenie z serwerem
102106
103107Pierwszą rzeczą, którą musimy zrobić, jest połączenie się z naszym serwerem. Ponieważ przy łączeniu nie wiemy, jakie bazy danych są dostępne na serwerze, przy połączeniu poprosimy o listę baz danych. Jest jednak jeden haczyk, aby nawiązać połączenie, musimy wprowadzić poprawną nazwę bazy danych we właściwościach MySQLConnection. W kodzie zobaczysz, że używam bazy danych „mysql”. Ta baza danych jest używana przez mysql do pewnych czynności porządkowych, więc zawsze tam będzie.
104108
105109``` pascal
106110procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
107111begin
108112 // Sprawdź, czy mamy aktywne połączenie. Jeśli tak, musimy je zamknąć.
109113 if MySQLConnection1.Connected then CloseConnection(Sender);
110114 // Ustaw parametry połączenia.
111115 MySQLConnection1.HostName := HostEdit.Text;
112116 MySQLConnection1.UserName := UserEdit.Text;
113117 MySQLConnection1.Password := PasswdEdit.Text;
114118 MySQLConnection1.DatabaseName := 'mysql'; // Baza mysql jest zawsze dostępna!
115119 ShowString('Otwarcie połączenia z serwerem: ' + HostEdit.Text);
116120 MySQLConnection1.Open;
117121 // Najpierw pobierzmy listę dostępnych baz danych.
118122 if MySQLConnection1.Connected then begin
119123 ShowString('Połączono z serwerem: ' + HostEdit.Text);
120124 ShowString('Pobieranie listy dostępnych baz danych.');
121125 SQLQuery1.SQL.Text := 'show databases';
122126 SQLQuery1.Open;
123127 while not SQLQuery1.EOF do begin
124128 DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
125129 SQLQuery1.Next;
126130 end;
127131 SQLQuery1.Close;
128132 ShowString('Lista otrzymanych baz danych!');
129133 end;
130134end;
131135```
132136
133137Pierwszą rzeczą, jaką robimy, jest sprawdzenie, czy jesteśmy połączeni z serwerem, jeśli tak, wywołujemy prywatną metodę „CloseConnection”. W tej metodzie robi się więcej porządków. jak wyłączanie przycisków i czyszczenie comboboxów i listbox. Następnie ustawiamy niezbędne parametry, aby połączyć się z serwerem.
134138
135139
136140*W całym naszym programie możesz zobaczyć wywołania ShowString. Ta metoda dodaje wiersz do notatki w naszym formularzu, który działa jak rodzaj dziennika.*
137141
138142Po ustawieniu parametrów możemy połączyć się z serwerem. Odbywa się to przez wywołanie
139143
140144``` pascal
141145MySQLConnection1.Open;
142146```
143147
144148W odpowiedniej aplikacji można by to umieścić w konstrukcji obsługi wyjątków, aby przedstawić użytkownikowi przyjazny komunikat w przypadku niepowodzenia połączenia. Kiedy jesteśmy połączeni, chcemy uzyskać listę baz danych z serwera. Aby uzyskać dane z serwera, używane jest zapytanie TSQLQuery. Właściwość SQL służy do przechowywania instrukcji SQL wysyłanej do serwera. MySQL zna polecenie „SHOW DATABASES”, aby uzyskać listę baz danych. Więc po ustawieniu tekstu SQL wywołujemy
145149
146150``` pascal
147151SQLQuery1.Open;
148152```
149153
150154W MySQL5 ustaw to, aby poprawić błąd ze składnią SQL:
151155
152156``` pascal
153157SQLQuery1.ParseSQL := False;
154158SQLQuery1.ReadOnly := True;
155159```
156160
157161Zestaw wyników SQLQuery można sprawdzić za pomocą właściwości fields. Jak widać, przeglądamy wszystkie zapisy, wywołując
158162
159163``` pascal
160164SQLQuery1.Next;
161165```
162166
163167Kiedy dodamy wszystkie dostępne bazy danych do naszego combobox, ponownie zamykamy SQLQuery.
164168
165169#### Wybieranie bazy danych
166170
167171Jeśli użytkownik wybierze bazę danych w DatabaseComboBox, włączamy przycisk „Wybierz bazę danych”. W zdarzeniu OnClick tego przycisku ustawiamy DatabaseName MySQLConnection1 i żądamy listy tabel. Ostatnia instrukcja tej procedury włącza przycisk „Otwórz zapytanie”, dzięki czemu użytkownik może wprowadzić zapytanie w polu edycji „Polecenie” i wysłać je na serwer.
168172
169173``` pascal
170174procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
171175begin
172176 // Baza danych została wybrana, więc pobierzmy z niej tabele.
173177 CloseConnection(Sender);
174178 if DatabaseComboBox.ItemIndex <> -1 then begin
175179 with DatabaseComboBox do
176180 MySQLConnection1.DatabaseName := Items[ItemIndex];
177181 ShowString('Pobieranie listy tabel');
178182 SQLQuery1.SQL.Text := 'SHOW TABLES';
179183 SQLQuery1.Open;
180184 while not SQLQuery1.EOF do begin
181185 TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
182186 SQLQuery1.Next;
183187 end;
184188 SQLQuery1.Close;
185189 ShowString('Lista otrzymanych tabel');
186190 end;
187191 OpenQueryButton.Enabled := True;
188192end;
189193```
190194
191195MySQL ma specjalne polecenie do pobierania listy tabel, porównywalne do pobierania listy baz danych, „SHOW TABLES”. Wynik tego zapytania jest obsługiwany w taki sam sposób, jak lista baz danych, a wszystkie tabele są dodawane do TableComboBox. Możesz się zastanawiać, dlaczego nie otwieramy ponownie połączenia przed otwarciem zapytania? Cóż, odbywa się to automatycznie (jeśli to konieczne), gdy aktywujemy SQLQuery.
192196
193197#### Pola w tabeli
194198
195199W MySQL możesz ponownie użyć formy „SHOW”, aby pobrać pola w tabeli. W tym przypadku „SHOW COLUMNS FROM \<nazwa tabeli\>”. Jeśli użytkownik wybierze tabelę z TableComboBox, wyzwalane jest zdarzenie OnChangeEvent tego ComboBox, które wypełnia pole FieldListbox.
196200
197201``` pascal
198202procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
199203begin
200204 FieldListBox.Clear;
201205 SQLQuery1.SQL.Text := 'SHOW COLUMNS FROM ' + TableComboBox.Text;
202206 SQLQuery1.Open;
203207 while not SQLQuery1.EOF do begin
204208 FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);
205209 SQLQuery1.Next;
206210 end;
207211 SQLQuery1.Close;
208212end;
209213```
210214
211215Oprócz nazw pól, zestaw wyników zawiera informacje o typie pola, jeśli pole jest kluczem, czy dozwolone są wartości null i nie tylko.
212216
213217#### Wyświetlanie danych
214218
215219Tak jak powiedzieliśmy, użyjemy komponentów do połączenia się z bazą danych, użyjmy również niektórych komponentów, aby pokazać dane. W drugim formularzu pokażemy siatkę z danymi żądanymi przez użytkownika. Formularz ten zostanie wyświetlony, gdy użytkownik wpisze polecenie SQL w polu edycji „Polecenie”, a następnie kliknie przycisk „Otwórz zapytanie”. To jest zdarzenie OnClick:
216220
217221``` pascal
218222procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
219223begin
220224 ShowQueryForm := TShowQueryForm.Create(self);
221225 ShowQueryForm.Datasource1.DataSet := SQLQuery1;
222226 SQLQuery1.SQL.Text := CommandEdit.Text;
223227 SQLQuery1.Open;
224228 ShowQueryForm.ShowModal;
225229 ShowQueryForm.Free;
226230 SQLQuery1.Close;
227231end;
228232```
229233
230234ShowQueryForm wygląda następująco:
231235
232236![](/wiki-images/a/aa/Mysqlshow_pl.png)
233237
234238i zawiera
235239
236240| | | |
237241|----|----|----|
238242| [[TPanel]] | Align | alBottom |
239243| [[TDataSource]] | | |
240244| [[TDBGrid]] | Align | alClient |
241245| | DataSource | DataSource1 |
242246| [[TButton]] | Caption | Close |
243247
244248Przycisk umieszczony jest na panelu. Kolejność działań w OnClick przycisku „Otwórz zapytanie” jest następująca. Najpierw tworzymy wystąpienie TShowQueryForm. Po drugie ustawiliśmy właściwość DataSet źródła danych na nasz SQLQuery1. Następnie ustawiamy polecenie SQLQuery SQL na to, co użytkownik wpisał w polu edycji „Polecenie” i otwieramy je. Następnie ShowQueryForm jest pokazywany modalnie, co oznacza, że ​​będzie się na nim koncentrował, dopóki nie zostanie zamknięty. Po zamknięciu „zwalniamy” go i ponownie zamykamy SQLQuery1.
245249
246250Formularz można dodatkowo ulepszyć poprzez wstawienie metody modyfikowania zawartości [[TDataSet]] i ostatecznie DataBase. Pełną wersję można pobrać z <http://digitus.itk.ppke.hu/~janma/lazarus/MySql5Test.tar.gz> (dzięki Arwen i JZombi z Lazarus MySQL Forum) ale istotne szczegóły są następujące:
247251
248252Dodaj przycisk u dołu formularza ShowQuery o nazwie AddButton i podpisem „Dodaj”. Utwórz metodę dla AddButtonClick w następujący sposób:
249253
250254``` pascal
251255procedure TShowQueryForm.AddButtonClick(Sender: TObject);
252256begin
253257 DataSource1.DataSet.Append;
254258end;
255259```
256260
257261Zmień kod dla OpenQueryButtonClick, aby umożliwić aktualizacje bazy danych po zakończeniu pracy z formularzem zapytania.
258262
259263``` pascal
260264procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
261265begin
262266 ShowQueryForm := TShowQueryForm.Create(nil);
263267 try
264268 ShowQueryForm.DataSource1.DataSet := SQLQuery1;
265269 // Będziemy pisać w bazie danych, więc ustawmy ReadOnly na false,
266270 // a do tego musimy ustawić ParseSQL na true
267271 SQLQuery1.ParseSQL:=true;
268272 SQLQuery1.ReadOnly:=false;
269273 SQLQuery1.SQL.Text := CommandEdit.Text;
270274 SQLQuery1.Open;
271275 ShowQueryForm.ShowModal;
272276 finally
273277 // ustaw tryb aktualizacji i zaktualizuj bazę danych
274278 SQLQuery1.UpdateMode:=upWhereChanged;
275279 SQLQuery1.ApplyUpdates;
276280 SQLTransaction1.Commit;
277281 ShowQueryForm.Free;
278282 SQLQuery1.Close;
279283 // ustaw ReadOnly i ParsesSQL z powrotem na domyślne
280284 SQLQuery1.ParseSQL:=false;
281285 SQLQuery1.ReadOnly:=true;
282286 end;
283287end;
284288```
285289
286290Możemy teraz dodawać rekordy do bazy danych. Jeśli dodamy TDBNavigator do formularza ShowQuery, możemy łatwiej poruszać się po siatce danych i edytować rekordy; baza danych jest aktualizowana o nasze zmiany za każdym razem, gdy zamykamy formularz ShowQuery i możemy to przetestować, otwierając go ponownie w celu sprawdzenia bazy danych.
287291
288292Jeśli chcesz mieć możliwość USUWANIA lub w inny sposób modyfikowania rekordów w oryginalnej bazie danych (tj. trzeba upewnić się, że zmiany wprowadzone w lokalnym zestawie danych zostaną zatwierdzone z powrotem w bazie danych), musisz mieć jedną kolumnę w tabeli bazy danych, która jest kluczem podstawowym autoincremented, ponieważ metoda 'delete' wymaga możliwości wygenerowania klauzuli 'where' podczas zapisywania instrukcji z powrotem do bazy danych, aby zidentyfikować rekordy wybrane do usunięcia. Użyj więc następującego kodu w swoim kliencie MySQL (wszystko może być wpisane w jednej linii, ale dla przejrzystości dodano podziały linii):
289293
290294``` sql
291295ALTER TABLE TRESTRIG
292296ADD COLUMN AUTOID INT
293297PRIMARY KEY AUTO_INCREMENT;
294298```
295299
296300a wtedy zauważysz, że przycisk Usuń w nawigatorze działa.
297301
298302## Źródła
299303
300304Oryginalne źródła tego projektu można pobrać [tutaj](http://prdownloads.sourceforge.net/lazarus-ccr/mysql_demo_20050408.tar.gz?download). Aby uzyskać więcej projektów demonstracyjnych, zobacz [sourceforge](http://sourceforge.net/project/showfiles.php?group_id=92177&package_id=148359).
301305
302306> **Note:** Projekty te powstały w latach 2004-2009 i nie były aktualizowane. Bez kilku poprawek mogą nie kompilować się w obecnym Lazarus 2.0.10.
303307
304308## Zobacz także
305309
306310- [[mysql]]
307311
308312---
309313*From the Free Pascal wiki, page "MySQLDatabases/pl", as it stood on 2021-11-12 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