Łączenie się z bazą danych MySQL z poziomu C++
Do tej pory aplikacje, które omawiałem przy okazji artykułów z C++ zapisywały swoje dane w pamięci RAM lub za pomocą zwykłych plików. W pierwszym przypadku oczywiście wszystko co „zapisaliśmy” w zmiennych bądź stałych po wyłączeniu programu po prostu traciliśmy. Korzystając z plików ten problem mogliśmy już ominąć.
Niestety nasz system rezerwacji miejsc w kinie, który został stworzony w ostatnich artykułach jest jednak zbyt wymagający do tego, żeby zapisywać wygenerowane za jego pośrednictwem dane w zwykłych plikach. Tutaj potrzebujemy czegoś znacznie lepszego i dodatkowo umożliwiającego dostęp do danych z kilku urządzeń. Dobrym pomysłem będzie więc skorzystanie z serwera bazodanowego wyposażonego na przykład w bazę MySQL. Przyjrzyjmy się więc, jak połączyć się z taką bazą.
Na początku musimy dołączyć odpowiednie pliki nagłówkowe, zarówno na Windowsie jak i OS X oraz Linuxie będzie to plik mysql.h
(konfiguracja Xcode):
#include <mysql.h>
Po zaimportowaniu odpowiedniego pliku przechodzimy do stworzenia obiektu (zmiennej) typu MYSQL
oraz jej inicjalizacji:
MYSQL mysql; // tworzymy zmienną typu MYSQL mysql_init(&mysql); // inicjalizacja
Kolejnym krokiem będzie nawiązanie połączenia z naszym serwerem bazodanowym. Jeśli nie dysponujecie takim możecie na potrzeby edukacyjne uruchomić go lokalnie, jak zresztą sam zrobiłem.
Z bazą MySQL łączymy się za pomocą funkcji mysql_real_connect()
. Pamiętajcie żeby przygotować takie informacje jak adres serwera (w przypadku postawienia bazy na własnym komputerze czyli lokalnie jest to domyślnie – 127.0.0.1
), nazwy użytkownika, hasła oraz nazwy utworzonej bazy danych (np. mysql
– jest to baza tworzona domyślnie i zawiera informacje o waszej instalacji MySQL):
mysql_real_connect(&mysql, "127.0.0.1", "root", "", "mysql", 0, NULL, 0);
Ogólna składnia:
mysql_real_connect(&mysql, "adresSerwera", "nazwaUrzytkownika", "haslo", "nazwaBazyDanych", port, unixSocket, flagiKlienta); MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag);
Połączenie z bazą danych zamykamy za pomocą instrukcji mysql_close()
:
mysql_close(&mysql);
Przykładowy program, łączący się z bazą danych:
#include <iostream> #include <mysql.h> int main(int argc, const char * argv[]) { MYSQL mysql; mysql_init(&mysql); // incjalizacja if(mysql_real_connect(&mysql, "127.0.0.1", "root", "", "mysql", 0, NULL, 0)) printf("Połączenie z bazą danych MySQL nawiązano poprawnie!\n"); else printf("Błąd połączenia z bazą MySQL: %d, %s\n", mysql_errno(&mysql), mysql_error(&mysql)); mysql_close(&mysql); // zamknij połączenie return 0; }
A jak by wyglądał kod wyciągający jakieś dane z bazy danych i umieszczający je w zmiennych, jest mi to dość potrzebne, prosiłbym o dokładny przykład, bo to jest tak skomplikowana operacja (przynajmniej dla mnie, dopiero teraz pozbyłem się błędów i skompilowałem aplikację), że powstaje błąd na błędzie. Z góry dzięki, pozdrawiam.
Pisałem o tym: http://strefakodera.pl/programowanie/c/pobieramy-i-wyswietlamy-dane-z-bazy-mysql-w-c
Dzięki, wielkie ! Pozdrawiam.
Witam!
Niestety nie mam biblioteki mysql używam VS2012 co powinienem zrobić ?
$ gcc -I/usr/include/mysql polaczenie_mysql_example.cpp
/usr/bin/ld: /tmp/ccKoSuYx.o: in function `main’:
polaczenie_mysql_example.cpp:(.text+0x33): undefined reference to `mysql_init’
/usr/bin/ld: polaczenie_mysql_example.cpp:(.text+0x68): undefined reference to `mysql_real_connect’
/usr/bin/ld: polaczenie_mysql_example.cpp:(.text+0x93): undefined reference to `mysql_error’
/usr/bin/ld: polaczenie_mysql_example.cpp:(.text+0xa5): undefined reference to `mysql_errno’
/usr/bin/ld: polaczenie_mysql_example.cpp:(.text+0xca): undefined reference to `mysql_close’
/usr/bin/ld: /tmp/ccKoSuYx.o: in function `__static_initialization_and_destruction_0(int, int)’:
polaczenie_mysql_example.cpp:(.text+0x112): undefined reference to `std::ios_base::Init::Init()’
/usr/bin/ld: polaczenie_mysql_example.cpp:(.text+0x127): undefined reference to `std::ios_base::Init::~Init()’
collect2: error: ld returned 1 exit status
$
Coś nie bardzo działa ten przykład.