Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 19:10 Der er 63 kommentarer og
1 løsning

MySQL begynder script.

Jeg er praktisk taget meget nybegynder med C++ men mangler et simpelt script til at connecte til en MySQL database.

Der må gerne være et simpelt eksempel til:
SELECT
UPDATE
DELETE

Hvis der skal bruges ekstra filer må der gerne være en forklaring på hvordan jeg finder og bruger dette.
Avatar billede arne_v Ekspert
08. januar 2004 - 19:27 #1
#include <stdio.h>
#include <stdlib.h>

#include "mysql.h"

int main()
{
    MYSQL *handle;
    MYSQL_RES *result;
    MYSQL_ROW row;
    int nfields;
    int *l;
    int i;
    handle= mysql_init(NULL);
    if(handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(handle));
        exit(1);
    }
    if(!mysql_real_connect(handle, "localhost", "", "", "Test", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(handle));
        exit(1);
    }
    mysql_query(handle, "SELECT * FROM T1");
    result = mysql_store_result(handle);
    nfields = mysql_num_fields(result);
    while ((row = mysql_fetch_row(result))) {
        l = (int *)mysql_fetch_lengths(result);
        for (i=0; i<nfields; i++) {
            printf(" %.*s", l[i], row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }
    mysql_free_result(result);
    mysql_close(handle);
    return 0;
}
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 19:33 #2
Den laver nogle fejl..
[C++ Error] Unit1.cpp(4): E2209 Unable to open include file 'mysql.h'
[C++ Error] Unit1.cpp(8): E2451 Undefined symbol 'MYSQL'
[C++ Error] Unit1.cpp(8): E2451 Undefined symbol 'handle'
[C++ Error] Unit1.cpp(9): E2451 Undefined symbol 'MYSQL_RES'
osv..
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 19:37 #3
Jeg fandt filen.. Men så laver den en anden fejl..
[C++ Error] mysql_com.h(116): E2303 Type name expected
[C++ Error] mysql_com.h(180): E2147 'SOCKET' cannot start a parameter declaration
[C++ Warning] Unit1.cpp(28): W8060 Possibly incorrect assignment
Avatar billede arne_v Ekspert
08. januar 2004 - 19:41 #4
Det problem kender jeg !

#define SOCKET int
#include "mysql.h"

bør løse det !
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 19:43 #5
Hvor skal det stå?
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 19:49 #6
Hvis jeg indsætter det i min header får jeg flere fejl..
[C++ Warning] Unit1.cpp(29): W8060 Possibly incorrect assignment
[Linker Error] Unresolved external 'mysql_init' referenced from C:\PROGRAMMER\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'mysql_real_connect' referenced from C:\PROGRAMMER\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'mysql_error' referenced from C:\PROGRAMMER\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'mysql_query' referenced from C:\PROGRAMMER\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
osv..
Avatar billede arne_v Ekspert
08. januar 2004 - 19:57 #7
Den linie med #define skal indsætte slige over den #include du
allerede har.
Avatar billede arne_v Ekspert
08. januar 2004 - 19:57 #8
Link fejlene skyldes at du skal linke mod:
  mysqlclient.lib
Avatar billede arne_v Ekspert
08. januar 2004 - 19:58 #9
Altså:

#include <stdio.h>
#include <stdlib.h>

#define SOCKET int
#include "mysql.h"

int main()
{
    MYSQL *handle;
    MYSQL_RES *result;
    MYSQL_ROW row;
    int nfields;
    int *l;
    int i;
    handle= mysql_init(NULL);
    if(handle == NULL)
    {
        printf("MySQL error: %s", mysql_error(handle));
        exit(1);
    }
    if(!mysql_real_connect(handle, "localhost", "", "", "Test", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(handle));
        exit(1);
    }
    mysql_query(handle, "SELECT * FROM T1");
    result = mysql_store_result(handle);
    nfields = mysql_num_fields(result);
    while ((row = mysql_fetch_row(result))) {
        l = (int *)mysql_fetch_lengths(result);
        for (i=0; i<nfields; i++) {
            printf(" %.*s", l[i], row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }
    mysql_free_result(result);
    mysql_close(handle);
    return 0;
}
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 20:15 #10
ved den kode laver den fejlene
[Linker Error] Unresolved external 'mysql_init' referenced from C:\PROGRAMMER\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'mysql_real_connect' referenced from C:\PROGRAMMER\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'mysql_error' referenced from C:\PROGRAMMER\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'mysql_query' referenced from C:\PROGRAMMER\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
osv..
Avatar billede arne_v Ekspert
08. januar 2004 - 20:19 #11
Du skal linke mod mysqlclient.lib !
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 21:19 #12
Det virker slet ikke når jeg gør det..
Den laver fejl med en masse tegn..
[C++ Error] mysqlclient.lib(2): E2206 Illegal character '`' (0x60)
[C++ Error] mysqlclient.lib(3): E2206 Illegal character '' (0x2)
Avatar billede arne_v Ekspert
08. januar 2004 - 21:28 #13
Der er vist et eller andet med Borland og lib.

Prøv med:

coff2omf \mysql\lib\opt\libmysql.lib \mysql\borlib\opt\libmysql.lib

og så link mod den sidste.

(coff2omf bør ligge et sted i C++Builder dir)
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 21:30 #14
ok.. den der forstod jeg ikke helt.
Hvor skal det skrives henne?
Avatar billede arne_v Ekspert
08. januar 2004 - 21:34 #15
åben DOS box

PATH=\some\dir\in\C++Builder\bin;%PATH;
md \wheremysqlis\borlib\opt
coff2omf \wheremysqlis\lib\opt\libmysql.lib \wheremysqlis\borlib\opt\libmysql.lib
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 21:36 #16
Her laver den samme fejl som før.. Filen består stadigt bare af an masse underlige tegn.
Avatar billede arne_v Ekspert
08. januar 2004 - 21:43 #17
Nu skrev du var ny til C++, så jeg vil tillade mig at spørge: hvordan
angiver du at den fil skal linkes med ?
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 21:45 #18
lavede bare en include.
Men det kan jeg høre nok ikke er rigtigt.

Arbejder normalt i PHP og javascript..
Avatar billede arne_v Ekspert
08. januar 2004 - 21:47 #19
Nej.

Nu kender jeg ikke C++Builder, men du skal ind i noget options og angive
at der skal linkes med den fil.
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 21:51 #20
Ahh, jeg kigger lige på det. Ellers må jeg lige have fat i en kammerat som ved det..
Avatar billede arne_v Ekspert
08. januar 2004 - 21:52 #21
Måske skal du bare adde lib til projektet.

Jeg mener at vi har et par C++Builder hajer her - måske kigger de forbi.
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 21:54 #22
Hvilken compiler kan jeg ellers bruge?
Avatar billede arne_v Ekspert
08. januar 2004 - 21:56 #23
Der er jo masser af compilere.

Jeg har mest brugt MS BC++ som IDE.
Avatar billede arne_v Ekspert
08. januar 2004 - 21:57 #24
VC++
Avatar billede sylvesternielsen Nybegynder
08. januar 2004 - 21:57 #25
Er den gratis?
Om ikke andet hvor henter jeg den så?
Avatar billede arne_v Ekspert
08. januar 2004 - 22:04 #26
Nej - det er den ikke.
Avatar billede arne_v Ekspert
08. januar 2004 - 22:05 #27
Men du må også kunne tilføje det lib til C++Builder - det er en hel
elementær ting.
Avatar billede arne_v Ekspert
08. januar 2004 - 22:09 #28
Jeg fandt en sjov lille ting på nettet !

Det siges at man kan bruge:

#pragma link "xyz.lib"

til at linke mod et lib med C++Builder.
Avatar billede jakobdo Ekspert
09. januar 2004 - 12:33 #29
Man kan også linke på denne måde: #pragma comment(lib,"library.lib")
Avatar billede jakobdo Ekspert
09. januar 2004 - 13:08 #30
Jeg er også noob på MYSQL området, hvor finder mysql.h og mysqlclient.lib henne?
Har nemlig ikke installeret MYSQL på min computer! (men har en MYSQL remote)
Avatar billede arne_v Ekspert
09. januar 2004 - 13:15 #31
Du downloader og installerer en MySQL server lokalt.

MySQL C API (mysql.h og mysqlclient.lib) kommer med den.

Du kan jo bare lade være med at starte serveren.
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 14:35 #32
Den laver nu fejlen:
Project1.exe - komponent ikke fundet
Dette program kunne ikke startes, fordi LIBMYSQL.DLL ikke blev fundet
Avatar billede arne_v Ekspert
09. januar 2004 - 14:56 #33
Du skal så have tilføjet det directory som indeholder
LIBMYSQL.DLL (eller så skal den være i samme directory som din EXE).
Avatar billede arne_v Ekspert
09. januar 2004 - 15:02 #34
Du skal så have tilføjet det directory som indeholder
LIBMYSQL.DLL til PATH (eller så skal den være i samme directory som din EXE).
Avatar billede jakobdo Ekspert
09. januar 2004 - 15:17 #35
Er der ikke en venlig sjæl som gider sende disse 3 filer i en email til: jakobdo[SLET]@hotmail[SLET].com
Avatar billede arne_v Ekspert
09. januar 2004 - 15:24 #36
Hvis ikke andre vil skal jeg nok gøre det i aften.
Avatar billede jakobdo Ekspert
09. januar 2004 - 15:27 #37
Takker... (prøver dog lige at finde dem)
Avatar billede jakobdo Ekspert
09. januar 2004 - 15:27 #38
Da det er nu jeg sidder og leger, og så skal jeg jo gerne have dem! NU...
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 15:29 #39
Så fik jeg endeligt lavet en forbindelse.

Det jeg bare mangler er lidt info om hvad de forskellige ting i scriptet gør.

Kan gennemskue det meste, men %s forstår jeg ikke samt denne linie:
printf(" %.*s", l[i], row[i] ? row[i] : "NULL");
Avatar billede arne_v Ekspert
09. januar 2004 - 15:39 #40
Udskriv en streng med maksimal længde l[i]

hvis row[i] != NULL så udskriv den eller udskriv "NULL"
Avatar billede arne_v Ekspert
09. januar 2004 - 15:40 #41
Avatar billede jakobdo Ekspert
09. januar 2004 - 15:50 #42
Jeg får denne fejl:

C:\Tools>bcc32 mysql.cpp
Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland
mysql.cpp:
Warning W8060 mysql.cpp 33: Possibly incorrect assignment in function main()
Turbo Incremental Link 5.60 Copyright (c) 1997-2002 Borland
Error: 'C:\TOOLS\MYSQLCLIENT.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

Filen mysqlclient.lib ligger i samme dir, som min source kode!
Avatar billede jakobdo Ekspert
09. januar 2004 - 15:50 #43
Har forresten fundet dem! :o)
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 15:51 #44
det var denne del af det jeg ikke forstod:
" %.*s"
Avatar billede arne_v Ekspert
09. januar 2004 - 15:56 #45
jakob>

mysqlclient.lib er i MS VC++ format - du skal bruge et tool for at
konvertere til BCB.
Avatar billede arne_v Ekspert
09. januar 2004 - 15:57 #46
dj>

Den format er en %s hvor der hentes en max længde fra argumenterne.
Avatar billede arne_v Ekspert
09. januar 2004 - 15:58 #47
jakob>

Jeg har selv buildet med dne gratis command line BCB med:

coff2omf \mysql\lib\opt\libmysql.lib .\libmysql.lib
bcc32 -DSOCKET=int -I\mysql\include mysqltest.c libmysql.lib
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 15:59 #48
ahhh.

Lige en sidste ting..
cout << "Indtast dit navn: ";
    cin >> navn;
    mysql_query(handle,"INSERT INTO `test` ( `id` , `navn` ) VALUES ('', `navn`)");

Hvordan indsætter jeg variablen i min sql?
Avatar billede arne_v Ekspert
09. januar 2004 - 16:05 #49
Gode gamle sprintf !

Eksempel:

char cmd[100];
sprintf(cmd,"INSERT INTO test(id,navn) VALUES ('','%s')","Arne");
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 16:06 #50
Kan du give mig en lidt længere forklaring.
Kan ikke lige gennemskue hvordan den fungere.
Avatar billede arne_v Ekspert
09. januar 2004 - 16:11 #51
sprintf virker helt ligesom printf - den skriver bare til et char array
fremfor consollen.

Nyt eksempel:

int id;
// noget kode hvor man får en værdi får ID som skal slåes op i databasen
char cmd[100];
sprintf(cmd,"SELECT * FROM xyz WHERE id = %d",id);
mysql_query(handle,cmd);
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 16:12 #52
Den der laver da det samme som den jeg har..
Den indsætter jo ikke min cin >> navn
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 16:13 #53
Ahh, fik det til at virke..

    cout << "Indtast dit navn: ";
    cin >> navn;
    char cmd[100];
    sprintf(cmd,"INSERT INTO test(id,navn) VALUES ('','%s')",navn);
    mysql_query(handle,cmd);
Avatar billede arne_v Ekspert
09. januar 2004 - 16:14 #54
16:11:15 indsætter en int på %d pladsen.

char navn[50];
cin >> navn;
char cmd[100];
sprintf(cmd,"INSERT INTO test(id,navn) VALUES ('','%s')",navn);

vil indsætte navn ved %s
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 16:17 #55
Kan man lave koden som en tekst streng?

char sql[64];
sql = "SELECT * FROM test where id = " . navn . "";

Det var så lidt PHP agtigt, men kan man lave en streng på samme måde i C++ eller skal jeg bruge en sprintf til hver variabel jeg vil indsætte?
Avatar billede arne_v Ekspert
09. januar 2004 - 16:23 #56
Du er nærmest nød til at bruge sprintf i C.

C++ har lidt flere muligheder.

Bl.a.:

char navn[100];
...
string cmd = "SELECT * FROM test where id = '" + navn + "'";
mysql_query(handle, cmd.c_str());
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 17:15 #57
det er jo meget simpelt.. Takker..
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 17:35 #58
Det lader ikke til at jeg kan lave 2 query's efter hinanden.

    mysql_query(handle,cmd);
    mysql_query(handle, "SELECT * FROM test");

Er der en måde det skal gøres på?
Avatar billede arne_v Ekspert
09. januar 2004 - 19:26 #59
Umiddelbart ser da meget OK ud - hvad fejl får du ?
Avatar billede sylvesternielsen Nybegynder
09. januar 2004 - 19:44 #60
Jeg får ingen fejl.
Men kan ikke få det til at virke på andre maskiner.. der mangler en masse .dll filer til at køre programmet.
Avatar billede arne_v Ekspert
09. januar 2004 - 19:57 #61
MySQL kræver LIBMYSQL.DLL, programmer lavet med C++Builder kræver
afhængig af settings også nogle DLL filer.

Prøv evt. at søg her i C/C++ kategorien. Det spørgsmål har været oppe
tit. Men da jeg ikke selv bruger C++Builder (aller højest command line
versionen), så kan jeg ikke hjælpe mere.
Avatar billede errorx Nybegynder
09. december 2004 - 07:49 #62
Jeg finner ikke mysqlclient.lib :-/
Avatar billede arne_v Ekspert
09. december 2004 - 08:17 #63
Har du hentet kit med header og lib filer ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester