MySQLDatabases/pl
│
Deutsch (de) │
English (en) │
français (fr) │
日本語 (ja) │
polski (pl) │
slovenčina (sk) │
References:
Tutorials/practical articles:
Databases |
Wprowadzenie
Ta strona wyjaśnia, jak połączyć się z serwerem bazy danych MySQL przy użyciu komponentów wizualnych.
Uwaga: zapoznaj się również z samouczkami, które uczą obsługi kontrolek związanych z danymi, zapytań parametrycznych, programowania niezależnego od bazy danych itp .:
Te samouczki są napisane dla wszystkich baz danych obsługujących sqldb, w tym MySQL.
W razie potrzeby zobacz również Samouczki SQLDB i przykładowy kod, aby uzyskać więcej samouczków (które również zostały napisane dawno temu.
Dostępne komponenty
Komponenty SQLdb
W każdej, nawet dość niedawnej wersji Lazarusa, komponenty SQLdb są instalowane domyślnie.
W zakładce SQLdb znajdziesz:
- Różne złącza (connectors), w tym TMySQL40Connection .. TMySQL57Connection (a może nawet nowsze wersje) i najbardziej wszechstronne ze wszystkich TSQLConnector, które mogą ładować dowolne ze sterowników baz danych takich jak mysql/oracle/postgres/mssql/interbase/firebird/odbc.
- TSQLQuery
Jeśli brakuje karty SQLdb, zajrzyj do Instalowanie pakietów, aby uzyskać instrukcje dotyczące instalacji.
Wyjaśnienie zastosowanych komponentów
TMySQLConnection
TMySQLConnection służy do przechowywania parametrów połączenia z serwerem bazy danych. Umożliwia ustawienie hosta, z którym ma się łączyć, oraz identyfikatora użytkownika i hasła, które mają być używane w połączeniu. Inna właściwość TMySQLConnection służy do wskazania bazy danych, której chcesz użyć. „LoginPrompt” jeszcze nie działa, więc upewnij się, że obok właściwości HostName i DatabaseName uzupełnione są również wartości UserName i Password, zanim spróbujesz otworzyć połączenie. Pamiętaj, że aby użyć również TSQLTransaction i połączyć ją z MySQLConnection, ustaw właściwość Transaction, w przeciwnym razie nie będziesz mógł otworzyć zapytania SQLQuery.
Powinieneś sprawdzić dokumentację MySQL, aby upewnić się, że połączenie między wersją klienta i wersją serwera jest obsługiwane - np. możesz mieć problemy z połączeniem się z serwerem 4.0 przy użyciu klienta 5.x.
We wszystkich przypadkach należy umieścić kopię biblioteki libmysql.dll i wszelkich innych wymaganych plików/bibliotek dll
- w twoim katalogu Lazarus i tym samym katalogu co pliki twojego projektu lub
- w katalogu systemowym Windows (jeśli nie chcesz dalej kopiować plików). Zauważ, że w 64-bitowym systemie Windows bibliotekę 32-bitową musisz umieścić w katalogu SysWOW64, podczas gdy biblioteki 64-bitowe należy przenieść do System32.
TSQLTransaction
TSQLTransaction jest potrzebne do niektórych wewnętrznych procedur. SQLTransaction jest automatycznie aktywowana po otwarciu zestawu danych przy jej użyciu. Zamknięcie połączenia również dezaktywuje powiązaną transakcję i zamyka wszystkie korzystające z niej zbiory danych.
TSQLQuery
TSQLQuery służy do wykonywania instrukcji SQL na serwerze. Możesz pobrać dane, ustawiając SQL na jakąś instrukcję SELECT i wywołując metodę Open. Możesz też manipulować danymi, wydając instrukcję INSERT, DELETE lub UPDATE. W tym drugim przypadku nie powinieneś używać metody Open, ale metodę ExecSQL.
TDataSource
TDataSource zapewnia połączenie między widocznymi komponentami obsługującymi dane, takimi jak DBEdit, DBGrid i zbiorem danych. Przygotowuje dane do wyświetlania w komponentach obsługujących te dane. DataSource (źródło danych) może być jednocześnie połączone tylko z jednym zestawem danych, ale do niego może być połączonych kilka komponentów obsługujących dane.
TDBGrid
TDBGrid może służyć do przedstawienia danych pobranych przez Dataset (zbiór danych). DBGrid potrzebuje Datasource (źródła danych), aby połączyć się ze zbirem danych. Gdy zbiór danych zostanie otwarty, DBGrid zostanie automatycznie wypełniony danymi.
Nasz program
Podstawy
Spróbujemy stworzyć program w oparciu o ten stworzony tutaj (w języku niderlandzkim), który jest oparty na oryginał (w języku angielskim) autorstwa Chris.
Formularz główny
Użyjemy tego samego ekranu głównego i zbudujemy całą funkcjonalność od podstaw :) Jak zobaczysz, jest tu o wiele mniej do zrobienia, ponieważ komponenty naprawdę rozwiązują wszystkie trudne rzeczy! Zacznijmy więc od stworzenia ekranu, który wygląda tak:
Korzystając z zakładki SQLdb umieść na swojej formatce komponenty TMySQL56Connection (lub inną wersję klienta mysql), TSQLTransaction i TSQLQuery . Nie zmieniaj domyślnych nazw nadanych tym komponentom. Z wyjątkiem komponentu łączącego do bazy. Aby artykuł był taki sam dla wszystkich wersji MySQL, nazwij komponent TMySQL##Connection: MySQLConnection1. Musimy te komponenty połączyć razem, aby mogły wykonywać swoją pracę. Dlatego należy ustawić następujące właściwości:
Komponent | Właściwość | Wartość |
MySQLConnection1 | Transaction | SQLTransaction1 |
SQLTransaction1 | Database | MySQLConnection1 |
SQLQuery1 | Transaction | SQLTransaction1 |
SQLQuery1 | Database | MySQLConnection1 |
Właściwość Transaction komponentu SQLQuery1 zostanie ustawiona automatycznie, jeśli najpierw ustawisz właściwość Transaction dla MySQLConnection1. Gdy to ustawisz, zauważysz, że SQLTransaction1.Database została ustawiona na MySQLConnection1.
Jak wspomniano wcześniej: upewnij się, że używasz odpowiedniego komponentu połączenia dla swojej wersji serwera MySQL.
Kod
Jak widać na zrzucie ekranu, jedynymi przyciskami dostępnymi po uruchomieniu programu są „Connect to server” („Połącz z serwerem”) i „Exit” („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 „Connect to server” do czasu podania informacji o hoście, nazwie użytkownika i haśle. Zdecydowałem się tego nie robić, ponieważ nasz użytkownik mógłby pomyśleć: „Nic nie wydaje się możliwe, więc przejdźmy do wyjścia”. :)
Zanim zacznę podawać jakikolwiek kod, chciałbym podkreślić, że w kodzie powinna być dodana obsługa wyjątków. Sekcje krytyczne należy umieścić w blokach kodu
try ... finally
lub
try ... except
Połączenie z serwerem
Pierwszą rzeczą, którą musimy zrobić, jest połączenie się z naszym serwerem. Ponieważ przy łączeniu nie wiemy, jakie bazy danych są dostępne na serwerze, przy połączeniu poprosimy o listę baz danych. Jest jednak jeden haczyk, aby nawiązać połączenie, musimy wprowadzić poprawną nazwę bazy danych we właściwościach MySQLConnection. W kodzie zobaczysz, że używam bazy danych „mysql”. Ta baza danych jest używana przez mysql do pewnych czynności porządkowych, więc zawsze tam będzie.
procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
begin
// Sprawdź, czy mamy aktywne połączenie. Jeśli tak, musimy je zamknąć.
if MySQLConnection1.Connected then CloseConnection(Sender);
// Ustaw parametry połączenia.
MySQLConnection1.HostName := HostEdit.Text;
MySQLConnection1.UserName := UserEdit.Text;
MySQLConnection1.Password := PasswdEdit.Text;
MySQLConnection1.DatabaseName := 'mysql'; // Baza mysql jest zawsze dostępna!
ShowString('Otwarcie połączenia z serwerem: ' + HostEdit.Text);
MySQLConnection1.Open;
// Najpierw pobierzmy listę dostępnych baz danych.
if MySQLConnection1.Connected then begin
ShowString('Połączono z serwerem: ' + HostEdit.Text);
ShowString('Pobieranie listy dostępnych baz danych.');
SQLQuery1.SQL.Text := 'show databases';
SQLQuery1.Open;
while not SQLQuery1.EOF do begin
DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
SQLQuery1.Next;
end;
SQLQuery1.Close;
ShowString('Lista otrzymanych baz danych!');
end;
end;
Pierwszą rzeczą, jaką robimy, jest sprawdzenie, czy jesteśmy połączeni z serwerem, jeśli tak, wywołujemy prywatną metodę „CloseConnection”. W tej metodzie robi się więcej porządków. jak wyłączanie przycisków i czyszczenie comboboxów i listbox. Następnie ustawiamy niezbędne parametry, aby połączyć się z serwerem.
- W całym naszym programie możesz zobaczyć wywołania ShowString. Ta metoda dodaje wiersz do notatki w naszym formularzu, który działa jak rodzaj dziennika.
Po ustawieniu parametrów możemy połączyć się z serwerem. Odbywa się to przez wywołanie
MySQLConnection1.Open;
W odpowiedniej aplikacji można by to umieścić w konstrukcji obsługi wyjątków, aby przedstawić użytkownikowi przyjazny komunikat w przypadku niepowodzenia połączenia. Kiedy jesteśmy połączeni, chcemy uzyskać listę baz danych z serwera. Aby uzyskać dane z serwera, używane jest zapytanie TSQLQuery. Właściwość SQL służy do przechowywania instrukcji SQL wysyłanej do serwera. MySQL zna polecenie „SHOW DATABASES”, aby uzyskać listę baz danych. Więc po ustawieniu tekstu SQL wywołujemy
SQLQuery1.Open;
W MySQL5 ustaw to, aby poprawić błąd ze składnią SQL:
SQLQuery1.ParseSQL := False;
SQLQuery1.ReadOnly := True;
Zestaw wyników SQLQuery można sprawdzić za pomocą właściwości fields. Jak widać, przeglądamy wszystkie zapisy, wywołując
SQLQuery1.Next;
Kiedy dodamy wszystkie dostępne bazy danych do naszego combobox, ponownie zamykamy SQLQuery.
Wybieranie bazy danych
Jeśli użytkownik wybierze bazę danych w DatabaseComboBox, włączamy przycisk „Wybierz bazę danych”. W zdarzeniu OnClick tego przycisku ustawiamy DatabaseName MySQLConnection1 i żądamy listy tabel. Ostatnia instrukcja tej procedury włącza przycisk „Otwórz zapytanie”, dzięki czemu użytkownik może wprowadzić zapytanie w polu edycji „Polecenie” i wysłać je na serwer.
procedure TFormTryMySQL.SelectDBButtonClick(Sender: TObject);
begin
// Baza danych została wybrana, więc pobierzmy z niej tabele.
CloseConnection(Sender);
if DatabaseComboBox.ItemIndex <> -1 then begin
with DatabaseComboBox do
MySQLConnection1.DatabaseName := Items[ItemIndex];
ShowString('Pobieranie listy tabel');
SQLQuery1.SQL.Text := 'SHOW TABLES';
SQLQuery1.Open;
while not SQLQuery1.EOF do begin
TableComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
SQLQuery1.Next;
end;
SQLQuery1.Close;
ShowString('Lista otrzymanych tabel');
end;
OpenQueryButton.Enabled := True;
end;
MySQL ma specjalne polecenie do pobierania listy tabel, porównywalne do pobierania listy baz danych, „SHOW TABLES”. Wynik tego zapytania jest obsługiwany w taki sam sposób, jak lista baz danych, a wszystkie tabele są dodawane do TableComboBox. Możesz się zastanawiać, dlaczego nie otwieramy ponownie połączenia przed otwarciem zapytania? Cóż, odbywa się to automatycznie (jeśli to konieczne), gdy aktywujemy SQLQuery.
Pola w tabeli
W MySQL możesz ponownie użyć formy „SHOW”, aby pobrać pola w tabeli. W tym przypadku „SHOW COLUMNS FROM <nazwa tabeli>”. Jeśli użytkownik wybierze tabelę z TableComboBox, wyzwalane jest zdarzenie OnChangeEvent tego ComboBox, które wypełnia pole FieldListbox.
procedure TFormTryMySQL.TableComboBoxChange(Sender: TObject);
begin
FieldListBox.Clear;
SQLQuery1.SQL.Text := 'SHOW COLUMNS FROM ' + TableComboBox.Text;
SQLQuery1.Open;
while not SQLQuery1.EOF do begin
FieldListBox.Items.Add(SQLQuery1.Fields[0].AsString);
SQLQuery1.Next;
end;
SQLQuery1.Close;
end;
Oprócz nazw pól, zestaw wyników zawiera informacje o typie pola, jeśli pole jest kluczem, czy dozwolone są wartości null i nie tylko.
Showing the data
Well as we said we would use components to get connected to the database, lets use some components to show the data as well. We will use a second form to show a grid with the data requested by the user. This form will be shown when the user typed a SQL command in the "Command" editbox and afterwards clicks the "Open Query" button. This is the OnClick event:
procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
begin
ShowQueryForm := TShowQueryForm.Create(self);
ShowQueryForm.Datasource1.DataSet := SQLQuery1;
SQLQuery1.SQL.Text := CommandEdit.Text;
SQLQuery1.Open;
ShowQueryForm.ShowModal;
ShowQueryForm.Free;
SQLQuery1.Close;
end;
The ShowQueryForm looks like this:
and contains a
TPanel | Align | alBottom |
TDataSource | ||
TDBGrid | Align | alClient |
DataSource | DataSource1 | |
TButton | Caption | Close |
The button is placed on the panel. What happens in the "Open Query" OnClick is this. First we create an instance of TShowQueryForm. Secondly we set the DataSet property of the DataSource to our SQLQuery1. Then we set the SQLQuery SQL command to what the user entered in the "Command" editbox and open it. Then the ShowQueryForm is shown modally, this means that it will have the focus of our application until it is closed. When it is closed, we "free" it and close SQLQuery1 again.
The Form can be further enhanced by inserting a method for modifying the content of the TDataSet and ultimately the DataBase. A full version can be downloaded from http://digitus.itk.ppke.hu/~janma/lazarus/MySql5Test.tar.gz (with thanks to Arwen and JZombi from the Lazarus MySQL Forum) but the relevant details are as follows:
Add a Button at the bottom of the ShowQuery Form named AddButton and with Caption 'Add'. Create a method for AddButtonClick like this:
procedure TShowQueryForm.AddButtonClick(Sender: TObject);
begin
DataSource1.DataSet.Append;
end;
Change the code for OpenQueryButtonClick to allow for updates to the database when we finish with the Query Form.
procedure TFormTryMySQL.OpenQueryButtonClick(Sender: TObject);
begin
ShowQueryForm := TShowQueryForm.Create(nil);
try
ShowQueryForm.DataSource1.DataSet := SQLQuery1;
// We will write in the database, so let's set ReadOnly to false,
// and for that we need to set ParseSQL true
SQLQuery1.ParseSQL:=true;
SQLQuery1.ReadOnly:=false;
SQLQuery1.SQL.Text := CommandEdit.Text;
SQLQuery1.Open;
ShowQueryForm.ShowModal;
finally
// set up update mode, and update database
SQLQuery1.UpdateMode:=upWhereChanged;
SQLQuery1.ApplyUpdates;
SQLTransaction1.Commit;
ShowQueryForm.Free;
SQLQuery1.Close;
// set read-only and parsesql back to default
SQLQuery1.ParseSQL:=false;
SQLQuery1.ReadOnly:=true;
end;
end;
We can now add records to the Database. If we add a TDBNavigator to the ShowQuery Form we can move around the Data Grid more easily, and edit records; the database gets updated with our changes each time we close the ShowQuery Form, and we can test this by opening it up again to inspect the database.
If you want to be able to DELETE or otherwise modify records on the original database (ie make sure changes you make to the local dataset get committed back to the database) then you need to have one column in your database table that is a primary key autoincremented, as the 'delete' method requires to be able to generate a 'where' clause when writing instructions back to the database, to identify the records selected for deletion. So use the following code in your MySQL client (it can all be typed on one line, but line breaks have been added for clarity):
ALTER TABLE TRESTRIG
ADD COLUMN AUTOID INT
PRIMARY KEY AUTO_INCREMENT;
and then you will find that the Delete button on the navigator works.
Źródła
Źródła tego projektu można pobrać tutaj Aby uzyskać więcej projektów demonstracyjnych, zobacz sourceforge