Avatar billede Slettet bruger
29. juli 2007 - 23:10 Der er 17 kommentarer og
1 løsning

Mysql Compiling fejl

Jeg bruger en kode jeg har fundet her på Eksperten (lavet af arne_v). Jeg har dog også brugt andre koder, som alle giver samme fejl.
Koden ser således ud:

#include <windows.h>
#include <iostream>
#include <mysql.h>
#include <stdio.h>
#include <stdlib.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", "root", "lol", "bjarke", 0, NULL, 0))
    {
        printf("MySQL error: %s", mysql_error(handle));
        exit(1);
    }
    mysql_query(handle, "SELECT * FROM test");
    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;
}

Det min compiler så svare er:
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_close@4
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_free_result@4
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_fetch_lengths@4
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_fetch_row@4
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_num_fields@4
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_store_result@4
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_query@8
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_real_connect@32
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_error@4
example1_mysql.obj : error LNK2001: unresolved external symbol _mysql_init@4
Debug/example1_mysql.exe : fatal error LNK1120: 10 unresolved externals
Error executing link.exe.

example1_mysql.exe - 11 error(s), 0 warning(s)

Håber i kan hjælpe

//Bjarke
Avatar billede arne_v Ekspert
29. juli 2007 - 23:43 #1
Du mangler at linked med mysql library.
Avatar billede Slettet bruger
29. juli 2007 - 23:43 #2
Hvem hvor hvad og hvordan :)?
Avatar billede arne_v Ekspert
29. juli 2007 - 23:44 #3
Hvilken compiler/IDE bruger du ?
Avatar billede arne_v Ekspert
29. juli 2007 - 23:47 #4
Udfra fejlen gætter jeg på at det er Microsoft Visual ...

Så skal du bare link mod libmysql.lib som kommer med MySQL (plejer at ligge i
lib\opt under MySQL).
Avatar billede Slettet bruger
29. juli 2007 - 23:48 #5
Glem det.. har fundet ud af det :)
Vil tilgengæld lige spørge hvordan jeg får et specifik frem.
Noget i den dur?

printf(row[feltnavn]);

Mvh
Bjarke - Der ikke rigtig ved så meget om C++, men ikke kan tage sig sammen til at lære det før han våger sig ud i mysql :)
Avatar billede Slettet bruger
29. juli 2007 - 23:49 #6
Du er alt for hurtigt arne :)

*Vil til gengæld lige spørge hvordan jeg får et specifik felt frem.
Avatar billede arne_v Ekspert
29. juli 2007 - 23:51 #7
Jeg mener at du bliver nødt til at kalde en af:

mysql_fetch_field()
mysql_fetch_field_direct()
mysql_fetch_fields()

og selv gemme navn-index oversættelsen.

http://dev.mysql.com/doc/refman/5.0/en/c-api-functions.html har dokumentation for
alle funktionerne.
Avatar billede Slettet bruger
30. juli 2007 - 00:13 #8
hmm når jeg sætter en MYSQL_FIELD *field; ind
så underkender den pludeselig de andre variabler :S

C:\C++\example2_mysql.cpp(11) : warning C4101: 'row' : unreferenced local variable
C:\C++\example2_mysql.cpp(14) : warning C4101: 'i' : unreferenced local variable
C:\C++\example2_mysql.cpp(13) : warning C4101: 'l' : unreferenced local variable

    MYSQL_ROW row;
    MYSQL_FIELD *field;
    int *l;
    int i;
Avatar billede Slettet bruger
30. juli 2007 - 00:15 #9
Nej nu er den der ikke :P.. Nå. post et svar så får du points :)

Men ville være cool hvis du ville kigge lidt på den hvis jeg har spm.. :)

Mvh
Bjarke
Avatar billede arne_v Ekspert
30. juli 2007 - 00:19 #10
Selvfølgelig.
Avatar billede Slettet bruger
30. juli 2007 - 00:26 #11
hehe jeg tror jeg giver op med det der specifik felt navn halløj.. Selv ikke google kan hjælpe mig ;).. Det er bare underligt at skulle bruge et Row nr, når man er vant til andet igennem mange år med asp :)
Avatar billede Slettet bruger
30. juli 2007 - 01:10 #12
Nu har jeg roddet mig ud i noget andet... Du skal bare sige til hvis jeg skal oprette seperat spørgsmål...
Jeg skal lave noget replace af mit data..

char line = replace(row[2], "Hej", "Goddag");           
cout << line << endl;

Jeg får denne fejl.. Og ved ikke rigtig hvad jeg skal gøre

C:\C++\Mysql.cpp(57) : error C2440: 'initializing' : cannot convert from 'void' to 'char'
        Expressions of type void cannot be converted to other types
Error executing cl.exe.
Avatar billede arne_v Ekspert
30. juli 2007 - 01:43 #13
Jeg ved ikke hvad det er for en replace funktion.

Men et gæt ville være:

replace(row[2], "Hej", "Goddag");         
char *line = row[2];
cout << line << endl;
Avatar billede arne_v Ekspert
30. juli 2007 - 01:44 #14
Eller måske bedre:

char *line = new char[strlen(row[2]) + 1];
strcpy(line, row[2]);
replace(line, "Hej", "Goddag");       
cout << line << endl;
Avatar billede arne_v Ekspert
30. juli 2007 - 01:53 #15
Kode der udskriver felt navne:

#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", "root", "", "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);
    /* */
    for(i=0; i<nfields; i++) {
        printf(" %s", mysql_fetch_field_direct(result, i)->name);
    }
    printf("\n");
    /* */
    while ((row = mysql_fetch_row(result))) {
        l = (int *)mysql_fetch_lengths(result);
        for (i=0; i<nfields; i++) {
            printf(" %.*s", row[i] ? l[i] : 4, row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }
    mysql_free_result(result);
    mysql_close(handle);
    return 0;
}

Hvis du vil bruge feltnavne (og du bruger C++), så kan du gemme navn til index i en
STL map og slå op med den i row.
Avatar billede Slettet bruger
30. juli 2007 - 02:00 #16
Tror jeg formulerede mig forkert ;)
Jeg vil ikke have feltnavnene, jeg ville kalde data frem ved hjælp af felt navne.
I asp ville dette se således ud:

rs = conn.execute("Select * from Tabel")
response.write rs("Navn")

:)

BTW Så virkede din char løsning, helt perfekt.. Takker
Mvh
Bjarke
Avatar billede Slettet bruger
30. juli 2007 - 02:17 #17
Men det er lige meget :) Det med row nr er faktisk også ret sejt :)

Takker for hjælpen, du skal da have noget karma med på vejen :)
Avatar billede arne_v Ekspert
30. juli 2007 - 02:25 #18
Jeg vidste godt hvad du mente med navn.

Det kan ikke laves helt så nemt i C++, men som jeg antydere i de sidste 2 linier,
så kan man lave noget.

Her er et mere uddybet eksempel:

#include <cstdio>
#include <cstdlib>

#include <iostream>
#include <string>
#include <map>

using namespace std;

#include "mysql.h"

int main()
{
    MYSQL *handle= mysql_init(NULL);
    if(handle == NULL)
    {
        cerr << "MySQL error: " << mysql_error(handle) << endl;
        exit(1);
    }
    if(!mysql_real_connect(handle, "localhost", "root", "", "Test", 0, NULL, 0))
    {
        cerr << "MySQL error: " << mysql_error(handle) << endl;
        exit(1);
    }
    mysql_query(handle, "SELECT * FROM t1");
    MYSQL_RES *result = mysql_store_result(handle);
    int nfields = mysql_num_fields(result);
    /* */
    map<string,int> name2index;
    for(int i=0; i<nfields; i++) {
      name2index[(mysql_fetch_field_direct(result, i))->name] = i;
    }
    /* */
    MYSQL_ROW row;
    char *buf = new char[256];
    while ((row = mysql_fetch_row(result))) {
        int *l = (int *)mysql_fetch_lengths(result);
        // print F1
        strncpy(buf,row[name2index["F1"]] ? row[name2index["F1"]] : "NULL",row[name2index["F1"]] ? l[name2index["F1"]] : 4);
        buf[row[name2index["F1"]] ? l[name2index["F1"]] : 4] = '\0';
        cout << " " << buf;
        // print F2
        strncpy(buf,row[name2index["F2"]] ? row[name2index["F2"]] : "NULL",row[name2index["F2"]] ? l[name2index["F2"]] : 4);
        buf[row[name2index["F2"]] ? l[name2index["F2"]] : 4] = '\0';
        cout << " " << buf;
        cout << endl;
    }
    delete[] buf;
    mysql_free_result(result);
    mysql_close(handle);
    return 0;
}
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