MySQL w Delphi

Feratoin

1 MYSQL SERVER
          1.1 INSTALACJA:
          1.2 PRACA W KONSOLI:
          1.3 ZAPYTANIA I PRACA Z BAZAMI:
          1.4 DODAWANIE REKORDÓW:
          1.5 USUWANIE REKORDÓW:
          1.6 MODYFIKOWANIE REKORDÓW:
2 dbExpress
     2.1 CZAS PROGRAMOWANIA:
          2.1.7 POBIERANIE ZAWARTOŚCI TABELI:
          2.1.8 DODAWANIE REKORDÓW:
          2.1.9 USUWANIE REKORDÓW:
          2.1.10 POBIERANIE LISTY TABEL

*Poniższy opis i procedury były testowane na Delphi 7.

Witam serdecznie.

Każdy programista w późniejszym czasie będzie musiał, lub spotka się z wykorzystaniem baz danych. Mnie zmusił do tego jeden z konkursów ;). Mało jest informacji na ten temat. Dlatego postanowiłem podzielić się z wami ostatnio zdobytą wiedzą. Zasiądzmy w wygodnym fotelu, z puszeczka Coli... juz? Gotowi? No to zaczynamy!

Na wstępie postaram się przytoczyć całkiem standardowe informacje nt. mysql'a: instalacja, parę prostych zapytań itp.

MYSQL SERVER

Zacznę od krótkiego wprowadzenia. W tym rozdziale nauczysz się teorii mysql i podstawowych operacji na serwerze.

MySQL to obok PostgreSQL najpopularniejszy z wolnodostępnych silników relacyjnych baz danych. W odróżnieniu jednak od rozwijanego przez społeczność open-source PostgreSQL-a, MySQL tworzony jest przez pojedynczy podmiot - szwedzką firmę MySQL AB.

INSTALACJA:

Najprostszym rozwiązaniem jest skorzystanie z KrasnalServ czy innego tego typu gotowego serwera, innym sposobem jest bezposrednie zainstalowanie samego serwera baz dostepnego na stronie producenta: www.mysql.com. Załóżmy, że jesteśmy po instalacji, zwróćmy teraz uwagę na parę instotnych szczegołów.
Bardzo ważnym elementem przy wykorzystaniu połączenia z bazą przez dbExpress jest wersja mysql. Dlatego, że jeśli chcemy łączyć się z bazą gdzieś w sieci np. u usługodawcy naszego hostingu, musimy dobrać bibliotekę libMySQL.dll, która znajduje się w katalogu:

mysql\bin

Kopiujemy ją do katalogu: Windows\system32.

PRACA W KONSOLI:

Macie zielone światełko? No to wchodzimy znowu do katalogu bin ... np. 'c:\usr\mysql\bin' znajdujemy mysql.exe i uruchamiamy przez cmd aby nie zamykalo się po zakończeniu. Wywołujemy z takimi parametrami:

mysql -u root -p

-u root - admin mysql na localhost
-p - dodajac ten parametr informujemy, że użytkownik posiada hasło i wymuszamy podanie go.

konsola_2.jpg

Wpisujemy hasło i zaczynamy działać. Jest znak zachęty: 'mysql>'. Stwórzmy sobie małą bazę z jedną tabelką do testów, rzućmy z góry, że będzie to baza z numerami telefonów i adresami e-mail naszych znajomych.

ZAPYTANIA I PRACA Z BAZAMI:

Wpisz: show databases;

  • przez to zapytanie zostaje zwrócona lista naszych baz:
    mysql: baza w ktorej sa przechowywane wszelkie dane o uzytkownikach serwera
    test: baza testowa, do zabawy

Czas aby stworzyć naszą bazę. Wpisz: create database adresy; Ok mamy baze... teraz czas na tabelę. Ale najpierw musimy wskazać bazę do, której ma być przypisana, do tego sluzy: use adresy;

  • oczywiscie zamiast adresy wpisujemy dowolna nazwę bazy.

Tworzymy tabelę:

create table tabela (
id           int unsigned not null auto_increment primary key,
imie         char(50),
nazwisko     char(50),
gg           char(7),
telefon      char(20),
email        char(50));

Spokojnie, pisz ciągle, mysql wykona to wszystko dopiero gdy zakonczysz skrypt znakiem ';'. Kolejną metodą jest zapisanie tego jako plik .sql i wykonanie komendą:

source skrypt.sql

Spróbuj. Zapisz powyższy kod do pliku z rozszerzeniem .sql i umiesc w katalogu bin razem z mysql.exe, i wpisz zapytanie wykonujace.
No dobrze mamy juz baze.. tabele.. teraz rekordy, zrobie tylko jeden, z reszta sie sami bedziecie bawic wg. upodoban.:

DODAWANIE REKORDÓW:

Zapytanie:

INSERT INTO tabela('imie','nazwisko','gg','telefon','email') 
VALUES('Marek','Wycisk','1968439','2222222','[email protected]');

Napisz sobie plik.. np. add.sql i wykonaj. Mamy już jeden rekord. Resztę pozostawiam waszej woli.

USUWANIE REKORDÓW:

Jak kazde inne polecenie wykonania czegos w bazie uzywamy zapytan... w jezyku angielskim usuń znaczy 'delete' czyli usuwanie rekordów odbywa się wg. tego wzoru:

DELETE FROM <nazwa_tabeli> WHERE <warunek>

<nazwa_tabeli> - w naszym przypadku adresy albo 'adresy' obie frazy muszą być zapisane w tego typu cudzyslowiach.. jednym albo drugim. Obecnie najpopularniejszy jest 1 sposób.
<warunek> - napewno kojarzycie instrukcje warunkowe, jeśli cos=czemu to tamto. Tutaj jest tak samo... tylko bez 'jeśli'. Przykładowo: id='1' , brzmi 'gdzie id wynosi 1', co usunie nam rekord ktorego wartosc w kolumnie 'id' równa się 1.

Przykładowe zapytanie, które usunie nam poprzedni rekord z moimi danymi:

DELETE FROM `adresy` WHERE imie = `Marek` OR nazwisko = `Wycisk`;

Zostanie usunięty rekord gdzie w kolumnie 'imię' znajduje się wartość 'Marek' albo gdy nazwisko ma 'Wycisk'. Jak na pewno zauważyłeś możemy stosować instrukcje typu: lub,i itp. OR, AND.

MODYFIKOWANIE REKORDÓW:

Co jeśli tabela ma 30 kolumn lub więcej, a Twój znajomy zmienił numer... bez sensu tracić tyle danych. Dlatego mysql jak inne bazy wykorzystujące SQL (Structure Query Language - Strukturalny Język Zapytań), pozwala nam na tego typu działania. Oto szablon zapytania:

UPDATE <nazwa_tabeli> SET <nazwa_pola> = 'wartość' WHERE <warunek>

<nazwa_pola> - lub inaczej nazwa kolumny, w naszych przypadkach: id, imie, nazwisko, gg, telefon, email.

UPDATE, znane updatuj, zmien cos co juz jest.
SET, ustaw.

Zmienmy telefon w moim rekordzie

UPDATE `adresy` SET telefon = '2233333' WHERE imie = `Marek`;

Po SET ustawiamy nową wartość rekordu! Nie pomyl się! Dopiero po WHERE ustawiamy warunek gdzie ma to zostać zmienione. To chyba na tyle.. więcej do naszych działań nie będzie nam potrzebne. Radzę poćwiczyć troszkę. W ostateczności odsyłam do kursów. Teraz czas na Delphiego, o to tutaj przecież chodzi.

dbExpress

Najnowsza metoda opracowana przez Borlanda dla potrzeb obsługi baz danych zgodnie z wymaganiami klientów z zapewnieniem dostępu z różnych platform. DbExpress jest dostępny dla Kylixa i Delphi od 6 w górę. Jest standardem ściśle związanym z narzędziami programistycznymi i jak na razie nie ma planów udostępnienia go do innych zastosowań. Jego wyróżniającą się cechą jest minimalizowanie roli warstwy pośredniej w tworzeniu aplikacji. W zasadzie dbExpress to specyfikacja biblioteki klienckiej, do której odwoływała się będzie aplikacja, aby zapewnić sobie dostęp do danych.

Czyli poprostu są to komponenty pozwalające na szybkie jak sama nazwa wskazuje, łączenie z bazami danych, przedstawię tylko potrzebne nam komponenty:
sqlc.jpg - SQLConnection - Komponent ten odpowiada za połączenie z mysql cos w stylu funkcji mysq_connect znanej z php.

cds.jpg - SQLClientDataSet - Wykonuje zapytania, przekazuje informacje do SQLConnection.

CZAS PROGRAMOWANIA:

Zaczynamy programowanie. Dodatkowe możliwości będą stopniowo dopisywane do tego rodziału. Polecam grupy dyskusyjne (zwłaszcza w j. angielskim) jako dodatkowy materiał dydaktyczny.

POBIERANIE ZAWARTOŚCI TABELI:

Wrzuć na formę z dwa Buttony i 5 editów do wprowadzania danych. Nasze komponenty połączeniowe nie umiescimy na formie, a w DataModule. Tworzymy przez: File/New/Data Module, i tam wrzucamy SQLConnection1, SQLClientDataSet1, SQLClientDataSet2 , którego nazwę zmieniamy na SQLClientDataSetAdd. Ustawiamy takie o to procedury przy OnCreate i onDestroy naszego DataModule... no i oczywiscie zmieniamy nazwę na 'DM':

procedure TDM.DataModuleCreate(Sender: TObject);
begin
SQLConnection1.Connected := True;
end;

procedure TDM.DataModuleDestroy(Sender: TObject);
begin
SQLConnection1.Connected := False;
end;

dm.jpg
Przejdź w Object Inspectorze na SQLConnection, przesta ConnectionName na MySQLConnection,LoginPrompt na False (przy True wyskakuje nam okienko do wpisania loginu i hasla... co jest zbedne gdyz wszystko ustawiamy w params) a następnie do Params i ustaw mniej-więcej jak na poniższym rysunku:

params.jpg

Sprawdź łączność ustawiając Connected na True. Jeśli żaden error nie wyskoczy to znaczy, że wszystko jest ok.

SQLDataSet1. Ten komponent posłuży nam do ładowania rekordów z bazy, przedstawię również dodawanie, usuwanie i modyfikownie.

SQLConnection ustaw na SQLConnection1.
CommandType: ctQuery
CommandText... no właśnie tutaj musimy ustawić nasze zapytanie. Nie możemy użyć do tego SQLQuery ponieważ nie jest on kompatybilny z MySQL tak samo jak dbGrid, dlatego zastosujemy ListView.

Zapytanie do ładowania rekordów ustawmy na takie:

select * from osoby order by imie, nazwisko;

I tyle. Teraz najgorsza część przed nami.

Zróbmy to tak... napiszemy procedurę.. którą poźniej umieścimy w OnShow nowej formy. Stwórz nową formę np. adresy TAdresy i wrzuć na nią ListView.

w public glównej klasy wpisz:
procedure pokaz_adresy();

I teraz zrób sobie gdzieś na dole miejsce na procedurkę:

procedure TAdresy.pokaz_adresy();
var
begin
end;

OK... czas na kod... postaram się powolutku wszystko tłumaczyć.

procedure TAdresy.pokaz_adresy();
var
   kolumny  : Tlistcolumn; // tworzymy sobie liste kolumn aby dodac wszystkie naraz
   listitem : tlistitem;
   id       : integer; // id z naszej bazy
   imie     : string; // imię
   nazwisko : string; // itd. chyba wiecie o co chodzi
   gg       : string;
   telefon  : string;
   email    : string;
begin
   Adresy.Caption := 'Baza: '+DM.SQLConnection1.Params.ValueFromIndex[2]+' / Tabela: Adresy'; // tutaj sobie robimy bajerek że wskaże nam aktualnie używaną bazę danych przez Delphi.

W tej części kodu musimy ustawić sobie zmienne, które nazywają się tak samo jak kolumny naszej tabeli. Łatwiej się połapać w kodzie. Idziemy dalej.

DM.SQLDataSet1.Open; // uruchamiamy połączenie ze sqlconnection

with ListView do begin
     Columns.Clear;
     Clear;
     Parent := Self;
     Align := alClient;
     ViewStyle := vsReport;
     RowSelect := True;
     ReadOnly := False;
     Color := clInfobk;
     GridLines := True;
     ShowColumnHeaders := True;
end;

Łączymy się z bazą, i ustawiamy wartosci ListView.
Columns.Clear; i Clear; Niech wyczyści nam wszystko... przydatne gdy wywolujemy kilka razy rożne procedury z wykorzystaniem ListView.
Styl koniecznie na vsReport, i GridLines.. dzieki temu zyska to designu tabeli.

Dalsza czesc chyba jest zrozumiala. Nastepny kawalek:

with ListView do begin
     Kolumny := Columns.Add;
     Kolumny.Caption := 'Id';
     Kolumny.Width := 30;

     Kolumny := Columns.Add;
     Kolumny.Caption := 'Imię';
     Kolumny.Width := 100;

     Kolumny := Columns.Add;
     Kolumny.Caption := 'Nazwisko';
     Kolumny.Width := 100;

     Kolumny := Columns.Add;
     Kolumny.Caption := 'GG';
     Kolumny.Width := 40;

     Kolumny := Columns.Add;
     Kolumny.Caption := 'Telefon';
     Kolumny.Width := 70;

     Kolumny := Columns.Add;
     Kolumny.Caption := 'E-Mail';
     Kolumny.Width := 200;
end;

Tworzymy kolumny w ListView z główną ID. Width postaraj się dopasować do rekordów. Te powinny wystarczyć. Teraz ostatnia część... ładowanie wszystkiego z tabeli mysql.

  with ListView do begin
     while not DM.SQLDataSet1.Eof do begin // petla
           id := DM.SQLDataSet1.FieldValues['id']; // przypisujemy wartości rekordu do zmiennych
           imie := DM.SQLDataSet1.FieldValues['imie'];
           nazwisko := DM.SQLDataSet1.FieldValues['nazwisko'];
           gg := DM.SQLDataSet1.FieldValues['gg'];
           telefon := DM.SQLDataSet1.FieldValues['telefon'];

           ListItem := items.Add;
           ListItem.Caption := inttostr(id); // konwersja... id jest liczbą całkowitą musimy ją przekonwertować

           // dodajemy wartości do  kolumn listview
           ListItem.SubItems.Add(imie);
           ListItem.SubItems.Add(nazwisko);
           ListItem.SubItems.Add(gg);
           ListItem.SubItems.Add(telefon);
           ListItem.SubItems.Add(email);

           DM.SQLDataSet1.Next(); // przerzucamy rekord, w końcu pętla
     end;
  end;

DM.SQLDataSet1.Close(); // zamykamy połączenie.

end;

Wszystko zapętlamy jak w PHP, wtajemniczeni na pewno znaja ten kod:

$zapytanie = "SELECT * FROM adresy";
$wykonaj = mysql_query($zapytanie);

while($row = mysql_fetch_array($wykonaj)) {
     echo row[0]." ".row[1]." ".row[2]." ". row[3]." ".row[4]." ".row[5];
}

Działa to praktycznie na tej samej zasadzie. Skompiluj program i zobacz ListView.

listv.jpg

Tutaj akurat screen z mojego programu na konkurs. Wygląd chyba wam coś przypomina, chociażby system kasy chorych. To raczej dla ślązaków.

Kod:

procedure TAdresy.pokaz_adresy();
var
   kolumny  : Tlistcolumn;
   listitem : tlistitem;
   id       : integer;
   imie     : string;
   nazwisko : string;
   gg       : string;
   telefon  : string;
   email    : string;
begin
   Adresy.Caption := 'Baza: '+DM.SQLConnection1.Params.ValueFromIndex[2]+' / Tabela: Adresy';

   DM.SQLDataSet1.Open;

   with ListView do begin
        Columns.Clear;
        Clear;
        Parent := Self;
        Align := alClient;
        ViewStyle := vsReport;
        RowSelect := True;
        ReadOnly := False;
        Color := clInfobk;
        GridLines := True;
        ShowColumnHeaders := True;
   end;

   with ListView do begin
        Kolumny := Columns.Add;
        Kolumny.Caption := 'Id';
        Kolumny.Width := 30;

        Kolumny := Columns.Add;
        Kolumny.Caption := 'Imię';
        Kolumny.Width := 100;

        Kolumny := Columns.Add;
        Kolumny.Caption := 'Nazwisko';
        Kolumny.Width := 100;

        Kolumny := Columns.Add;
        Kolumny.Caption := 'GG';
        Kolumny.Width := 40;

        Kolumny := Columns.Add;
        Kolumny.Caption := 'Telefon';
        Kolumny.Width := 70;

        Kolumny := Columns.Add;
        Kolumny.Caption := 'E-Mail';
        Kolumny.Width := 200;
   end;

   with ListView do begin
       while not DM.SQLDataSet1.Eof do begin
          id := DM.SQLDataSet1.FieldValues['id'];
          imie := DM.SQLDataSet1.FieldValues['imie'];
          nazwisko := DM.SQLDataSet1.FieldValues['nazwisko'];
          gg := DM.SQLDataSet1.FieldValues['gg'];
          telefon := DM.SQLDataSet1.FieldValues['telefon'];

          ListItem := items.Add;
          ListItem.Caption := inttostr(id);


          ListItem.SubItems.Add(imie);
          ListItem.SubItems.Add(nazwisko);
          ListItem.SubItems.Add(gg);
          ListItem.SubItems.Add(telefon);
          ListItem.SubItems.Add(email);

          DM.SQLDataSet1.Next();
       end;
   end;
        DM.SQLDataSet1.Close();
end;

DODAWANIE REKORDÓW:

Jak na pewno zauważyliście wszystko robimy przez różnego rodzaju zapytania... dodawanie rekordów. Przy opisie prostych zapytan do mysql, wymienilem zapytanie dodajace rekord do tabeli bazy. Przytoczę to jeszcze raz.

INSERT INTO tabela (imie, nazwisko, gg, telefon, email)
VALUES(:imie,:nazwisko,:gg,:telefon,:email);

I to umieszczamy w CommandText, SQLDataSetAdd czyli tego trzeciego komponentu.

Jak wcześniej ustalamy, że ma brać przy dodawaniu nasze zdeklarowane zmienne. Stwórz nową formę z 5 editami, lub labelededitami i jednym speedbuttonem o nazwie: 'add', powiedzmy że edity będą o takich nazwach:

add_imie
add_nazwisko
add_gg
add_telefon
add_email

Klikamy dwa razy na naszego speedbuttona, i wpisujemy taką procedurę:

procedure Tadd.SpeedButton1Click(Sender: TObject);
begin
with DM do begin
SQLDataSetAdd.ParamByName('imie').AsString := add_imie.text;
SQLDataSetAdd.ParamByName('nazwisko').AsString := add_nazwisko.Text;
SQLDataSetAdd.ParamByName('gg').AsString := add_gg.text;
SQLDataSetAdd.ParamByName('telefon').AsString := add_telefon.Text;
SQLDataSetAdd.ParamByName('email').AsString := add_email.Text;

Informujemy go aby dodał nam nowy rekord i wpisal do niego wartości z naszych editów... idziemy dalej...

SQLDataSetAdd.ExecSQL();
end;
end;

Tutaj wykonujemy zapytanie... czyli rekord został dodany. Dodam małe urozmaicenie. Aby odrazu załadował nam tabelę z nową wartością. A po dodaniu zamknął okno i wyświetlil komunikat.

Kod:

procedure Tadd.SpeedButton1Click(Sender: TObject);
begin
with DM do begin
SQLDataSetAdd.ParamByName('imie').AsString := add_imie.text;
SQLDataSetAdd.ParamByName('nazwisko').AsString := add_nazwisko.Text;
SQLDataSetAdd.ParamByName('gg').AsString := add_gg.text;
SQLDataSetAdd.ParamByName('telefon').AsString := add_telefon.Text;
SQLDataSetAdd.ParamByName('email').AsString := add_email.Text;
SQLDataSetAdd.ExecSQL();
end;
MessageBox(0,'Dodalem nowy rekord','OK',MB_ICONINFORMATION); // wyswietl okienko informujace o dodaniu
Adresy.pokaz_adresy(); // zaladuj rekordy z bazy
Close; // zamknij okno
end;

Screen: add.jpg

Mamy kolejny dział za sobą. Procedura dodaje wartosci editów do nowego rekordu tabeli. Pozniej wywoluje procedurę wyświetlajacą tabelę i zamyka okno. Radzę zmodyfikować troszkę kod na własne potrzeby.

USUWANIE REKORDÓW:

Co jeśli chcemy usunąc istniejący rekord? Można to zrobić na dwa sposoby:

  1. Poprzez bezpośrednie zapytanie do bazy wymusząjące usunięcie zaznaczony rekord.
  2. Tak jak w poprzednich przypadkach przez żmudny ale stabilny proces z wykorzystaniem DataSet.

Metoda 1.:
Wykorzystajmy podręczne menu kontekstowe wywolywane naciśnięciem prawego klawisza. Wrzuć na formę Popupmenu i w OnMouseDown wpisz:

var
P:TPoint;
begin
if ssRight in Shift then begin
GetCursorPos(P);
Popupmenu1.Popup(P.X,P.Y);

Jeśli na aktywnym ListView zostanie wciśnięty prawy przycisk, program wywoła popupmenu w miejscu kliknięcia. Dorzuć do menu jakis element np. Usuń rekord. Przejdź do oprogramowania zdarzenia. W największej liczbie przypadków każdy rekord ma swoje ID więc to wykorzystajmy.

var
zapytanie:string;
begin
zapytanie:='DELETE FROM baza WHERE id='+ListView.Selected.Caption;
DM.SQLConnection1.ExecuteDirect(zapytanie);

Teraz zostanie usunięty rekord z bazy. Funkcja ExecuteDirect wykonuje zapytanie do bazy. W naszym przypadku jest to zmienna zapytanie. Ustalamy ze id jest wartoscia rekordu z pierwszej kolumny. Urozmaice troche kod o małe zabezpieczenia.

var
zapytanie:string;
begin
zapytanie:='DELETE FROM baza WHERE id='+ListView.Selected.Caption;
if MessageBox(Handle,'Czy na pewno chcesz usunąć zaznaczony rekord?','Ostrzeżenie',MB_ICONWARNING+MB_OK)=IdYes then
DM.SQLConnection1.ExecuteDirect(zapytanie);
Adresy.pokaz_adresy;

I teraz użytkownik przed usunęcie zostanie poproszony o potwierdzenie swojej decyzji. Na koniec wywolujemy jeszcze procedure pokaz_adres, aby pobrala zawartosc zmienionej tabeli. Owszem mozna poprzez ListView1.Selected.Delete, ale ID jest automatycznie przydzielanym kluczem, i kazdy 'nowy' rekord dostanie przydzielone nowe ID.

Kod:

procedure TAdres.Usun;
var
zapytanie:string;
begin
zapytanie:='DELETE FROM baza WHERE id='+ListView.Selected.Caption;
if MessageBox(Handle,'Czy na pewno chcesz usunąć zaznaczony rekord?','Ostrzeżenie',MB_ICONWARNING+MB_OK)=IdYes then
DM.SQLConnection1.ExecuteDirect(zapytanie);
Adresy.pokaz_adresy;
end;

POBIERANIE LISTY TABEL

Tak przy tym pisaniu przypomnialo mi się, że możemy jeszcze pobrać liste wszystkich tabel zawartych w bazie. dbExpress posiada kolejną fajną procedurę: GetTableNames. Wystarczy, że podamy listę zmiennych tekstowych (TStrings) i tak np. wykorzystajmy ComboBox i jego rekord Items. Wrzuć na formę ComboBox'a i Button'a. Oprogramuj OnClick guzika np. w ten sposób.

if DM.SQLConnection1.Connected=true then begin
DM.SQLConnection1.GetTableNames(tabele.Items, False);
tabele.ItemIndex:=0;
end;

Program najpierw sprawdzi czy jest połączenie, następnie pobierze listę dostępnych tabel i zmieni ItemIndex na 0 czyli będzie widoczny pierwszy element z listy.

W razie czego służę pomocą. Wkrótce modyfikacja.
Pozdrawiam. Feratoin.

36 komentarzy

Mam D7 Personal i nie widzę nigdzie tego SQLa... Gdzie jest?

Cały czas mi wywala że nie może załadować mysqllib.dll, mimo że ją mam. Prubowałem włożyć do Borland/Delphi/Lib, Borland/Delphi/Bin do folderów systemowych do folderu z programem i nic.

Ty, a to jest z bazami lokalnymi?
Jak tak to dajcie jaki artykuł jak można zrobić swoją bazę sieciową

A jest jakiś art. gdzie jest opisane tworzenie i edytowanie baz, bez tej libmysql.dll, tylko z ODBC, czy cos, i TTable i TDatabase?

Mi ciągle wyrzuca jakiś wyjątek i zamyka aplikację...

Do zabaw z MySQL-em w Delphi polecam darmowe komponenty AnyDAC. Działają po prostu świetnie.

a... i jeszcze jedno. jeśli będziemy chcieli wydobyć z bazy dane typu TIMESTAMP lub DATETIME i przypisać do string'a polecam uzycia konstrukcji SQLDataSet.FieldByName('nazwa_pola').AsString zamiast SQLDataSet.FieldValues['nazwa_pola'].

http://www.justsoftwaresolutions.co.uk/delphi/dbexpress_and_mysql_5.html
dziala z mysql 5; jest otwarty, ale ma wade; nie da sie zmienic portu... :/

a gdzie się ustawia ten alias??

Jeśli komuś nie chodzi libmysql.dll (tak jak mi), to niech ściągnie sobie Connector/ODBC z www.mysql.com. Trzeba go tylko skonfigurować: Panel sterowania -> Narzędzia administracyjne -> Źródła danych (ODBC) , następnie Dodaj... ze sterownikiem MySQL ODBC Driver i już może działać jak na bazie lokalnej przez alias.

Ja od siebie dodam, ze dla poprawnego dzialania trzeba skopiowac libmysql.dll nie z %mysqlroot%\bin, tylko %mysqlroot%\lib\debug - u mnie bynajmniej ta biblioteka dopiero zadzialala... (mam delphi 2005 proffesional)

Jesli chodzi o bledy z libmysql to jest to wina "starych" komponentow ktore w Delphi 5,6,7 nie obsluguja nowych wersji biblioteki :/
Co do latwego sposobu na zabawe z MySQL to polecam MyDAC. W nowych wersjach Delphi (chyba od 2005 w gore - ENterprise) jest dolaczany, a do starszych mozna sciagnac z Sieci. Niestety trial - wyskakuje okienko z przyciskiem przy laczeniu z baza ale "Polak potrafi" :D

Niestety rozwiązanie to ma pewną znaczacą wadę. Parametr CommandText obiektu tupi TSQLDataSet może mieć maksymalnie 255 znaków. A więc nasze zapytanie jest ograniczone do 255 znaków! W praktyce każde zapytanie które zawiera group by/having, joina lub podzapytanie przekracza 255 znaków.
Nie polecam używania rozwiazania przedstawionego w tym artykule.

daleko z tym artykułem nie dotarłem, u mnie gdy dam Connected na True dostaje: " Unable to find procedure getSQLDriverMySQL" co mam z tym zrobic??

Wszystko byłoby super... gdyby nie błąd: "dbExpress Error: [0x0003]: Invalid Field Type". Kiedy wywaliłem linijkę DM.SQLDataSet1.Open tego błędu nie było.. no ale oczywiście nie mogłem wtedy nic z bazy pobrać :P

Jakiś hint?

a mnie zastanawia taka rzecz - skąd wziąłeś, że "...Nie możemy użyć do tego SQLQuery ponieważ nie jest on kompatybilny z MySQL tak samo jak dbGrid, dlatego zastosujemy ListView.". Bo ListView zamiast DBGrid do prostego wyświetlenia danych tabelarycznych to raczej pomyłka. Poza tym za każdym razem jak zmienisz coś w tabeli (np. dodasz/usuniesz kolumnę) to musisz zmieniać w kodzie.

Druga sprawa to pobieranie danych z DataSetu przez FieldValues['nazwa_kolumny'] jest niebezpieczne ponieważ dane zwracane są jako Variant i konwersja jest niewidoczna co może prowadzić do dziwnych efektów w działaniu aplikacji. Dużo bezpieczniejsze jest FieldByName('nazwa_kolumny').AsTyp gdzie typ jaki ma zwrócić DataSet jest ustalany przez programistę

A po trzecie na dbExpressie świat się nie kończy...

Masz wszystko w mojej sygnaturce no ale łap ;)

GG:1968439
[email protected]

Pozdrawiam. Juz za niedlugo dopiszę opis dynamicznego odświeżania bazy przez ClientDataSet. Cierpliwości ;)

czy autor udostepnil jakis kontakt do siebie? gg czy maila... Mial bym pare pytan, ale wolal bym sie publicznie nie upokarzac:) Byl bym wdzieczny
Pozdrawiam

I jeszcze raz ja, Gilbert - MySQL w ver. 4.xx działa (poprawnie) z delphi ale w wersji 2005 jak już to napisałem poniżej, z "7" będziesz mieć problemy jak ja (z niewiadomych przyczyn...) bo jak zwykle wszystkiego nie da się opisać w specyfikacji... hehe life is brutal a some times full of zasadzkas... - ja to juz dawno wydziargałem na monitorze żeby nie być ździwionym.

Jeszcze raz pozdro.

Witam ponownie...
Moim skromnym zdaniem moża nieco uprościć sprawę operacji związanych z danymi tzn. wszędzie tam gdzie pojawia się problem z kursorem (mam nadzieję że wiadomo o co chodzi - np. komunikat o błędzie zwrotu kursora z bazy...) otóż z pomocą przychodzi wersja MySQL 4.xx i wyższe gdzie problem ten został rozwiązany, ale jak na ironię losu wersja delphi, która poprawnie to obsłuży nosi oznaczenie "2005". Szczerze mówiąc dopiero testuję ale jak zakończę testy dam znać... Zobacze czy faktycznie jest tak miło i przyjemnie jak zapewniaja twórcy nowej wersji. Myśle że też powinieneś rzucic okiem na kilka nowości w "2005" dotyczacych baz danych.

Pozdrawiam.

Wpisywanie danych z ręki... no to tak.. wszystko siedzi w dwóch pliczkach: dbxconnections.ini oraz dbxdrivers.ini . Jeśli masz delphiego na kompie to te pliczki są edytowane przy starcie programu w C:\Program Files\Common Files\Borland czy jakos tak... wiec w form create i destroy zrób zapis zmiany ini do tych pliczków (w sumie 4).

No i jeszcze jedno: co zrobić, żeby wpisywać adres bazy z ręki, a nie przy kompilacji programu.

Opowiem wam o moich doświadczeniach z MySQL-em w delphi 7.

  • Do działania w internecie nadaje się baza 4.0 - z 4.1 są problemy - nie chce się logować.
  • libmysql.dll z wersji 4.0 ogólnie działa z wersją mysql 4.1, ale wysypuje się przy indeksach.
  • fajnie by było gdyby ktoś w końcu opisał od początku do końca sposób połączenia z nowszymi werjsami MySQL - u mnie za chiny nie działa z 4.1

No ok... poprawilem formatowanie i pousuwalem emoty

<font color="red">Do autora:</span>
Koniecznie zapoznaj się z tym materiałem:
http://4programmers.net/Pomoc/Formatowanie_tekstu
i popraw artykuł wg zaleceń. Kilka rzeczy zmieniłem, ale to nadal nie jest to.
A co najważniejsze, WYMAGAMY polskich znaków diakrytycznych w artykułach!
Tak samo, jak nie używamy emotek w artykule - to nie blog, lecz baza rzetelnych materiałów [w założeniu]

jesli chodzi o numerek to testowane na 7 Enterprise. Natomiast komponenty dbExpress od dluzszego czasu sa dostepne w internecie. Do prawidlowego dzialania wystarczy wspomniany libMySQL.dll i tyle :) Radzę zajrzeć na google :]

Co do artykułu to podstawowa jego wada jest taka, że autor nie napisał w jakich wersjach środowiska Delphi jego porady będą działały, to samo dotyczy komponentu dbExpress (niestety już się tak porobiło że wersji Delphi namnożyło się tyle co Windows), ja osobiście czekam na artykuł o bazach danych działających w Delphim w wersji Personal (chodzi mi o sprawdzone i działające rozwiązanie) !!!

jasne... relacje i formularze sa wymagane w konkursie :) wiec musze :P

Akurat tak tematyka bardzo mnie kręci, tamat jest ok... Jak bedzie bardziej rozwiniety to nie pogniewam się ! Zakładam, że nie poprzestaniesz tylko na prostych operacjach do i z bazy typu insert, update, delete itp. mam tu na mysli działania na wynikach i moze nawet drukowanie z Listview... Pozdrawiam.

Akurat tak tematyka bardzo mnie kręci, tamat jest ok... Jak bedzie bardziej rozwiniety to nie pogniewam się ! Zakładam, że nie poprzestaniesz tylko na prostych operacjach do i z bazy typu insert, update, delete itp. mam tu na mysli działania na wynikach i moze nawet drukowanie z Listview... Pozdrawiam.

Informacja dla Krasnalowców :)

Jeśli updatowales mysql do wersji 4.1 zachowaj nowa biblioteke, przyda sie do polaczen z bazami w sieci. Natomiast do system32 wrzuc ze starej wersji. Jesli nie masz sciagnij stad:

http://www.feratoin.infocoig.pl/art_mysql/libmySQL.dll

  1. Możliwe, że jest uszkodzona... ja tak mialem, gdy zmienilem libmysql z wersji 4.1 i chcialem sie polaczyc z serwerem na kompie gdzie mam 3.33 czy jakos tak, dostarczanej razem z krasnalem. Ogolnie do laczenia sie z serwerem na kompie dzialaja te starsze... a te nowsze przy polaczeniach z bazami gdzies w sieci.
  2. Sprawdz wersje bazy ;)

Skopiowałem do katalogu Windows\system32 bibliotekę libMySQL.dll i przy próbie ustawienia własności Connected komponentu SQLConnection na True wyskakuje mi błąd "Unable to Load LIBMYSQL.dll" (dodam że sprawdzałem to w Delphi w wersji 6 Ent)

Tak to rozdzielac? Lepiej dopisze do tego :P Nie wiem... niech tutaj Adam wyrazi zdanie czy ktos

Jasne :) Jak tylko ocenka sie utrzymie :) Tylko teraz nie wiem czy chcecie w tym artykule czy w innym. Pozdrawiam

Jasne, że w innym