Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Połączenie z bazą danych MySQL w C/C++

09 Paź 2008 18:32 24989 18
  • #1 09 Paź 2008 18:32
    Anonymous
    Użytkownik usunął konto  
  • #2 09 Paź 2008 18:55
    Dr.Vee
    VIP Zasłużony dla elektroda

    Z instalacji mysql. Zobacz tutaj.

    A co do głównego problemu, to pewnie nie będziesz mógł się połączyć z tym serwerem, bo serwer bazy danych otwarty "na świat" wymaga szczególnych zabezpieczeń.

    Najlepszą drogą jest wykorzystanie RPC, np. xml-rpc albo SOAP - jest to standardowy mechanizm zdalnego dostępu do usług sieciowych.

    Pozdrawiam,
    Dr.Vee

    0
  • #3 09 Paź 2008 19:33
    Dżyszla
    Poziom 42  

    kocyk napisał:
    Chcę wykonać program pod Windows "komunikujący" się ze stroną WWW. Chyba najprostszym wyjściem jest zapis/odczyt danych z bazy MySQL
    Nie. Najprostszym wyjściem jest mechanizm HTTP i przekazywanie parametrów metodą POST.

    -1
  • #4 09 Paź 2008 20:18
    fantom
    Poziom 31  

    Co ma piernik do wiatraka ? Pytanie podstawowe po co chcesz sie komunikowac z ta strona WWW i co ten program ma wlasciwie robic ?
    A tak na marginesie strona WWW jesli w ogole korzysta z bazy danych to najczesciej komunikuje sie z nia po interfejsie lokalnym ktory nie jest dostepny na zewnatrz.

    0
  • #5 09 Paź 2008 22:14
    lord_dagoth
    Poziom 25  

    To może ja podczepie się pod temat. Czyli najlepiej, żeby czytać i zapisywać dane do bazy danych na jakimś serwerze byłoby mieć na serwerze skrypty np. napisane w php odpowiedzialne za komunikację z bazą oraz program napisany np. w C++, który by tym skryptom przekazywał informacje?

    Wyglądało by to tak: Użytkownik z jakiegoś komputera wysyła na serwer dane (http i post) -> (teraz już po stronie serwera) skrypt w php interpretuje te dane, sprawdza itp, itd, a następnie łączy się z bazą danych i wykonuje żądane operacje.

    Czy takie coś byłoby dobrym pomysłem?

    0
  • #6 10 Paź 2008 07:53
    Krashan7
    Poziom 17  

    Bez przesady Panowie. Przy rozsądnym administrowaniu bazą SQL zdalny dostęp do tejże nie jest aż tak niebezpieczny. Pamiętać trzeba wszakże o kilku podstawowych zasadach:
    - dedykowany użytkownik bazy, posiadający tylko i wyłącznie takie uprawnienia, jakie są potrzebne przy komunikacji. Czyli na przykład, jeżeli tylko czytamy dane z tabeli 'xyz' to użytkownik globalnie ma tylko 'USAGE' (na przykładzie MySQL), a tylko i wyłącznie do tabeli 'xyz' ma tylko i wyłącznie 'SELECT'.
    - dostęp zabezpieczony hasłem + ograniczenie do wybranych hostów.
    - przy danych poufnych można używać połączenia SSL.
    Bezpośrednia komunikacja z bazą jest rozwiązaniem znacznie wydajniejszym, niż przebijanie się przez pośredniczące PHP. Poza tym taka warstwa pośrednia z jednej strony niby zwiększa bezpieczeństwo, z drugiej jednak im bardziej złożony system, tym łatwiej w nim o błąd...

    0
  • #7 10 Paź 2008 08:23
    Anonymous
    Użytkownik usunął konto  
  • #8 11 Paź 2008 17:08
    Dr.Vee
    VIP Zasłużony dla elektroda

    kocyk napisał:
    Może ktoś doradzi w jakiej książce lub artykule tego szukać (po polsku)? W google jest dużo ale nic nie jest dobrze opisane.


    Nie jest dobrze opisane = jest po angielsku? Sorry, takie realia.

    W poście z forum mysql (do którego linka podałem w poprzednim poście) masz opisane wszystko - konfigurację projektu dla VC++ 6.0 oraz pełny kod programu. Podobno tyle Ci wystarczy?

    API mysqla jest opisane tutaj. W pierwszych dwóch akapitach jest napisane jakich bibliotek należy użyć, oraz gdzie znaleźć przykłady programów używających w/w API.

    Może przyłóż się trochę do szukania?

    Pozdrawiam,
    Dr.Vee

    0
  • #9 11 Paź 2008 17:24
    Anonymous
    Użytkownik usunął konto  
  • #10 31 Paź 2008 15:32
    Glinek
    Poziom 12  

    Jesteś jeszcze zainteresowany tym tematem?

    Ja szukałem długo odpowiedzi i naprawdę ciężko coś znaleźć tym bardziej po Polsku. Miałem jeden problem i odpowiedz znalazłem tylko na 1 forum dosłownie po tygodniu szukania odpowiedzi. Okazało się że więcej ludzi na świecie miało taki problem ale zwykle od paru lat nikt nie odpowiedział dobrze na ich posty. Przykładowe examples nie działały. Jak to robiłem nie byłem za bardzo kumaty w temacie MySQL C API. Teraz stwierdzam ze wszystko jest w MySQL Reference Manual, no ale trzeba czegoś lżejszego żeby wejść w temat.

    Zrobiłem coś podobnego do tego co Ty chcesz. Mój program łączy się ze sterownikiem PLC i wysyła jego zawartość pamięci do bazy danych skąd robię wizualizacje na stronie. Mogę udostępnić moduł do komunikacji z bazą danych zrealizowany w środowisku Borland C++ Builder 6.

    0
  • #11 31 Paź 2008 16:01
    Anonymous
    Użytkownik usunął konto  
  • Pomocny post
    #12 31 Paź 2008 18:50
    Glinek
    Poziom 12  

    Trzeba dodać pliki:

    Code:

    #include <winsock.h>
    #include <mysql.h>

    Oprócz tego do projektu musiałem dodać plik libmysql.lib bo inaczej nie dało się skompilować. Plik ten dostępny jest po instalacji MySQL. Problem był taki że plik skompilowany jest dla VC++ a ja używam Borland Builder C++ 6. W tym celu musiałem skorzystać z narzędzia coff2omf.exe z katalogu bin Buildera. Uruchamia się to z wiersza poleceń. Więcej info w HELPie. Dojście do tego było moim największym problemem. Reszta działała od kopa.

    Deklaracja zmiennych
    Code:

    static char *opt_host_name = "localhost";       /* server host (default=localhost) */
    static char *opt_user_name = "root";            /* username (default=login name) */
    static char *opt_password = "krasnal";          /* password (default=none) */
    static unsigned int opt_port_num = NULL;        /* port number (use built-in value) */
    static char *opt_socket_name = NULL;            /* socket name (use built-in value) */
    static char *opt_db_name = NULL;                /* database name (default=none) */
    static unsigned int opt_flags = 0;              /* connection flags (none) */
    static MYSQL *conn;                             /* pointer to connection handler */


    Korzystałem z projektu Krasnal Serv.


    Otwarcie połączenia, utworzenie bazy danych, wybór bazy danych:
    Code:

    conn = mysql_init (NULL);
    mysql_real_connect (conn, opt_host_name, opt_user_name, pt_password, opt_db_name, opt_port_num, opt_socket_name, opt_flags);
    mysql_query(conn, "CREATE DATABASE plc_memory");
    mysql_select_db(conn, "plc_memory");


    Utworzenie tabeli.
    Code:

    mysql_query(conn, "CREATE TABLE plc_m  (id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, value TINYINT  NOT NULL, PRIMARY KEY (id))");


    usunięcie bazy danych i zamknięcie połączenia:
    Code:

    mysql_query(conn, "DROP DATABASE IF EXIST plc_memory" )
    mysql_close(conn);


    Powodzenia, czekam na informacje czy się udało :)

    Polecam Krasnala, z innymi gotowcami nie zawsze działało od kopa.

    3
  • #13 01 Lis 2008 14:14
    Anonymous
    Użytkownik usunął konto  
  • #14 01 Lis 2008 17:31
    Glinek
    Poziom 12  

    No to wskaż w projekcje ścieżkę gdzie ten plik się znajduje. Ewentualnie powinno pomóc skopiowanie wszystkich plików z katalogu include do katalogu z projektem. Bo skopiowanie tylko mysql.h nie pomoże bo ten plik odwołuje się do innych *.h z tamtego katalogu.

    PS: a masz w ogóle ten plik na dysku? Jak sie instaluje samego MySQL to w składnikach trzeba dodać biblioteki. Ja korzystałem z krasnala i tam były wszystkie pliki

    0
  • #15 02 Lis 2008 19:12
    Anonymous
    Użytkownik usunął konto  
  • #16 05 Lis 2008 10:36
    Glinek
    Poziom 12  

    No to gratuluje :)

    Ja z kolei miałem problem z libmysql.lib nie wiedziałem że trzeba skonwertować

    Można wiedzieć w jakim środowisku to robisz?

    0
  • #17 05 Lis 2008 14:48
    Anonymous
    Użytkownik usunął konto  
  • #18 06 Lis 2008 10:21
    Glinek
    Poziom 12  

    A to nie wiem nie używałem nigdy tego środowiska.

    Nie funkcja mysql_real_connect służy do łączenia się z bazą.
    mysql_connect chyba sie nie używa

    Do wysyłania zapytań jest

    mysql_query(identyfikator_połączenia, "zapytanie")

    np: mysql_query(conn, "DROP DATABASE IF EXIST baza1" )

    w przykładzie jaki podałem identyfikatorem jest conn

    jest to odpowiednik

    mysql_query() z PHP :)

    PS: Myślałem że jest jakaś wersja darmowa VC++, przynajmniej ja taką kiedyś zassałem ze strony M$.. ale nie jestem pewien bo nie odpalałem

    0
  • #19 06 Lis 2008 16:47
    Anonymous
    Użytkownik usunął konto