[C++/MySQL C API] struct toewijzen...?

Pagina: 1
Acties:

  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 13-04 08:48
Hallo,

Ben op het moment bezig met een mySQL class met de mysql functies daarin (C API)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <windows.h>
#include <MySQL\mysql.h>

using namespace std;

class Database {
      
      public:
             MYSQL myIns;
             MYSQL_RES myRes;
             MYSQL_FIELD myFld;
             MYSQL_ROW myRow;
             
             void init();
             void connect(const char *hostname, const char *username, const char *password, unsigned int port);
             void selectdb(const char *database);
             void query(const char *query);
             void fetch();
             Database();
             ~Database();
};

Database::Database() {
//
}

Database::~Database() {
//
}

void Database::init() {
     
     if(mysql_init(&myIns) == NULL) {
          cout << "Could not initialize MySQL" << endl;
          mysql_close(&myIns);
     }
}

void Database::connect(const char *hostname, const char *username, const char *password, unsigned int port) {

     if(mysql_real_connect(&myIns,hostname,username,password,NULL,port,NULL,0) == NULL) {
          cout << "Could not connect with the database" << endl;
          mysql_close(&myIns);
     }
}

void Database::selectdb(const char *database) {
     if(mysql_select_db(&myIns,database) != 0) {
          cout << "Could not select database \'" << database << "\'" << endl;
          mysql_close(&myIns);
     }
}

void Database::query(const char *query) {
     if(mysql_query(&myIns,query) != 0) {
          cout << "Could not execute the query" << endl;
          mysql_close(&myIns);
     }
     
     myRes = mysql_store_result(&myIns);
     
     if(myRes == NULL) {
          cout << "Could not result the query" << endl;
          mysql_free_result(&myRes);
          mysql_close(&myIns);
     }     
     
}     

void Database::fetch() {
     
     unsigned long numRow;
     
     numRow = mysql_num_rows(&myRes);
     
     cout << "Found " << numRow << " records" << endl;
     
     mysql_free_result(&myRes);
     mysql_close(&myIns);
             
}

int main() {

    Database *SQL = new Database;
    
    SQL->init();
    SQL->connect("localhost","root","",3306);
    SQL->selectdb("simplycms");
    SQL->query("SELECT * FROM users;");
    SQL->fetch();
    
    system("PAUSE");
    
    delete SQL;
    
    return 0;
    
}


Nu krijg ik de volgende error's:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Compiler: Default compiler
Building Makefile: "C:\Documents and Settings\Av3ng3r\Bureaublad\cpp\mySQL connector\Makefile.win"
Executing  make...
make.exe -f "C:\Documents and Settings\Av3ng3r\Bureaublad\cpp\mySQL connector\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/include/c++/3.3.1"  -I"C:/Dev-Cpp/include/c++/3.3.1/mingw32"  -I"C:/Dev-Cpp/include/c++/3.3.1/backward"  -I"C:/Dev-Cpp/lib/gcc-lib/mingw32/3.3.1/include"  -I"C:/Dev-Cpp/include"  -Wall  

main.cpp: In member function `void Database::query(const char*)':
main.cpp:61: error: no match for 'operator=' in 'this->Database::myRes = 
   mysql_store_result(MYSQL*)(this)'
C:/Dev-Cpp/include/MySQL/mysql.h:208: error: candidates are: st_mysql_res& 
   st_mysql_res::operator=(const st_mysql_res&)
main.cpp:63: error: no match for 'operator==' in 'this->Database::myRes == 0'
C:/Dev-Cpp/include/objbase.h:80: error: candidates are: BOOL operator==(const 
   GUID&, const GUID&)

main.cpp:100:2: warning: no newline at end of file

make.exe: *** [main.o] Error 1

Execution terminated


Als ik de functie beschrijvingen op mysql.com lees zie ik dat mysql_store_result het type MYSQL_RES (struct) terug geeft en ik heb in de class de variabel 'myRes' als MYSQL_RES type gededefinieerd. Nu snap ik niet waarom ik niet met = operator mag verwijzen naar de lege variabel myRes die hetzelfde type is.

Op en aanmerkingen over de code zijn ook welkom

[ Voor 9% gewijzigd door Av3ng3rtje op 20-02-2005 12:58 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

De = en == operators zijn niet geïmplementeerd voor de types die jij gebruikt. Dat betekent dat er twee mogelijkheden zijn om dingen te vergelijken/toe te kennen, namelijk alle velden van de structs (Classes? Ik dacht dat je operators alleen kon overloaden in klassen?) één voor één aflopen en één voor één toekennen/vergelijken, of je vergelijkt pointers, maar dat heeft in 99 van de 100 gevallen geen nut en al helemaal niet het effect dat je zoekt.

Ik weet niet of de MySQL includes die je gebruikt open zijn, maar als je in de code kan, dan kun je natuurlijk ook gewoon zelf de = en == operators implementeren, alsmede alle andere operatoren die je nodig denkt te gaan hebben. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Av3ng3rtje
  • Registratie: December 2002
  • Laatst online: 13-04 08:48
-NMe- schreef op zondag 20 februari 2005 @ 13:52:
De = en == operators zijn niet geïmplementeerd voor de types die jij gebruikt. Dat betekent dat er twee mogelijkheden zijn om dingen te vergelijken/toe te kennen, namelijk alle velden van de structs (Classes? Ik dacht dat je operators alleen kon overloaden in klassen?) één voor één aflopen en één voor één toekennen/vergelijken, of je vergelijkt pointers, maar dat heeft in 99 van de 100 gevallen geen nut en al helemaal niet het effect dat je zoekt.

Ik weet niet of de MySQL includes die je gebruikt open zijn, maar als je in de code kan, dan kun je natuurlijk ook gewoon zelf de = en == operators implementeren, alsmede alle andere operatoren die je nodig denkt te gaan hebben. :)
Het zijn inderdaad structs , ik heb even de MYSQL_RES struct opgezocht in mysql.h...

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct st_mysql_res {
  my_ulonglong row_count;
  MYSQL_FIELD   *fields;
  MYSQL_DATA    *data;
  MYSQL_ROWS    *data_cursor;
  unsigned long *lengths;       /* column lengths of current row */
  MYSQL     *handle;        /* for unbuffered reads */
  MEM_ROOT  field_alloc;
  unsigned int  field_count, current_field;
  MYSQL_ROW row;            /* If unbuffered read */
  MYSQL_ROW current_row;        /* buffer to current row */
  my_bool   eof;            /* Used by mysql_fetch_row */
} MYSQL_RES;


Volgens mij kan het overloaden van een operator alleen in classes , dus dan zou ik alle members van de struct apart moeten toewijzen ? Ik vind dit een beetje vaag want al ik kijk een example code (ik heb de mySQL api via de dev-c++ update binnengehaald) dan zie ik dit staan:

code allemaal in main():

C++:
1
2
3
    MYSQL          *myDatabase      = NULL;
    MYSQL_RES      *myResult        = NULL;
    MYSQL_FIELD    *myField         = NULL;


En even verder op:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
    myResult = mysql_store_result(myDatabase);
    
        // Failed...
        if(!myResult)
        {
            // Alert user...
            printf("] Error: Unable to retrieve result...\n");
            
            // Cleanup, abort, terminate...
            mysql_close(myDatabase);
            getch();
            return 0;        
        }


Als ik dit compile geeft hij echter geen errors ?

Nu heb ik al geprobeerd om van mijn eigen mysql class members een pointer te maken, maar dan krijg ik ook errors.

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Av3ng3rtje schreef op zondag 20 februari 2005 @ 23:50:
Volgens mij kan het overloaden van een operator alleen in classes , dus dan zou ik alle members van de struct apart moeten toewijzen ? Ik vind dit een beetje vaag want al ik kijk een example code (ik heb de mySQL api via de dev-c++ update binnengehaald) dan zie ik dit staan:

code allemaal in main():

C++:
1
2
3
    MYSQL          *myDatabase      = NULL;
    MYSQL_RES      *myResult        = NULL;
    MYSQL_FIELD    *myField         = NULL;


En even verder op:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
    myResult = mysql_store_result(myDatabase);
    
        // Failed...
        if(!myResult)
        {
            // Alert user...
            printf("] Error: Unable to retrieve result...\n");
            
            // Cleanup, abort, terminate...
            mysql_close(myDatabase);
            getch();
            return 0;        
        }


Als ik dit compile geeft hij echter geen errors ?
Blijkbaar geeft mysql_store_result() dus geen MYSQL_RES terug, maar een pointer naar een MYSQL_RES.

Je kunt operators trouwens net zo goed overloaden op structs als op classes hoor. Het enige verschil tussen een class en een struct is dat alle members van classes standaard private zijn, terwijl ze bij structs standaard public zijn.