Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C++] Verbinding met MySQL mislukt

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb niet veel ervaring met het programmeren van Win32 applicaties, maar probeer nu een programma te schrijven dat waarden in een MySQL database kan zetten. Op de website van MySQL vond ik een voorbeeld hiervan. Deze heb ik gewoon copy/paste naar Visual Studio 2010 gedaan en gebuild in Release mode.

Nu krijg ik de volgende error:

Unhandled exception at 0x7855b9f0 in lift_db.exe: 0xC0000005: Access violation reading location 0x736f686c.

De code zier er als volgt uit:

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
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>

#include "mysql_connection.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

using namespace std;

int main(void){
    cout << endl;
    cout << "Running 'SELECT 'Hello World!'AS _message'..." << endl;

    try {
        sql::Driver *driver;
        sql::Connection *con;
        sql::Statement *stmt;
        sql::ResultSet *res;

        /* Create a connection */
        driver = get_driver_instance();
        con = driver->connect("localhost", "root", "pass");
        /* Connect to the MySQL test database */
        con->setSchema("test");

        stmt = con->createStatement();
        res = stmt->executeQuery("SELECT 'Hello World!' AS _message");
        while (res->next()) {
            cout << "\t... MySQL replies: ";
            /* Access column data by alias or column name */
            cout << res->getString("_message") << endl;
            cout << "\t... MySQL says it again: ";
            /* Access column fata by numeric offset, 1 is the first column */
            cout << res->getString(1) << endl;
        }
        delete res;
        delete stmt;
        delete con;
    } 

    catch (sql::SQLException &e) {
        cout << "# ERR: SQLException in " << __FILE__;
        cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
        cout << "# ERR: " << e.what();
        cout << " (MySQL error code: " << e.getErrorCode();
        cout << ", SQLState: " << e.getSQLState() << " )" << endl;
    }

    cout << endl;
    return EXIT_SUCCESS;
}


Heeft iemand enig idee wat er fout gaat? Volgens de Visual Studio debugger zit de fout bij ''driver->connect''. De gegevens die hier ingevoerd zijn kloppen gewoon. Via de command-line client van MySQL server kan ik hiermee inloggen.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 08:22
Niet gehinderd door enige specifieke kennis gok ik dat de MySQL library die je gebruikt incompatible is met de gebruikte C++ compiler. Weet je zeker dat die library geschikt is voor Visual Studio 2010? Aan je credentials kan het niet liggen; die kunnen nooit een access violation opleveren.

(Los daarvan is het waarschijnlijk handig om je applicatie eerst in debug-mode te testen, dan krijg je meestal meer zinnige data, hoewel je er in dit geval waarschijnlijk niet veel wijzer van wordt.)

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 17-11 15:31
Verwijderd schreef op maandag 05 november 2012 @ 19:25:
C++:
1
2
        driver = get_driver_instance();
        con = driver->connect("localhost", "root", "pass");
Gaat het daar niet mis? Als get_driver_instance() nu NULL returned?

Het makkelijkst is toch in Debug mode stap voor stap door je programma heengaan en daarbij je variabelen goed in de gaten houden.

Overigens heeft je programma nog weinig met Win32 te maken..

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

epic007 schreef op dinsdag 06 november 2012 @ 10:49:
[...]


Gaat het daar niet mis? Als get_driver_instance() nu NULL returned?
Nee, want dan krijg je geen "Access violation reading location 0x736f686c"

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 23-11 22:51

leuk_he

1. Controleer de kabel!

Bouwen in debug mode en kijken op welke regel het fout gaat?

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


  • __fred__
  • Registratie: November 2001
  • Laatst online: 23-11 01:01
Ik schat dat je een mixup hebt tussen debug en release libs/dlls. Het gaat vast fout bij het doorgeven van de string argumenten.

Zie ook http://bugs.mysql.com/bug.php?id=44272

Verwijderd

Topicstarter
Soultaker schreef op dinsdag 06 november 2012 @ 03:07:
Weet je zeker dat die library geschikt is voor Visual Studio 2010?
Het gaat om MySQL Connector/C++ 1.0.5. Op de MySQL site staat het volgende:
"MySQL Connector/C++ supports only Microsoft Visual Studio 2003 and above on Windows"
dus dat zou geen problemen moeten opleveren.
leuk_he schreef op dinsdag 06 november 2012 @ 13:23:
Bouwen in debug mode en kijken op welke regel het fout gaat?
Volgensmij ging het fout bij de volgende regel:
con = driver->connect("localhost", "root", "pass");

Die gegevens kloppen 100% zeker.

Heb nu de inmiddels uitgekomen versie 1.1.1. geprobeerd, deze geeft tijdens het builden de fout dat connection.h het bestand boost/variant.hpp niet kan vinden. (dacht dat boost alleen nodig was wanneer je de connector van source ga opbouwen??).

Denk dat ik het even met Visual Studio 2008 ga proberen. Zodra ik meer weet zal ik het jullie laten weten.

In ieder geval alvast bedankt voor de hulp! :)

Verwijderd

Topicstarter
Met Visual Studio 2008 en MySQL C++ connector 1.0.5. lukt het wel. Blijkbaar is de connector niet compatible met VS2010

Het werkt dan echter alleen wanneer ik in Release mode ga builden. In Debug krijg ik het volgende:

"Unhandled exception at 0x7855b9f0 in elevator.exe: 0xC0000005: Access violation reading location 0xcccccccc."

Hij valt over de regel:
C++:
1
con = driver->connect("tcp://127.0.0.1:3306", "root", "pass");


Wanneer ik 'tcp://' weghaal krijg ik geen exception, maar kan ik geen verbinding maken met de MySQL server.

Hoort niet helemaal in dit topic, dus zal verder zelf even uitzoeken waar dit van komt..

Bedankt!
Pagina: 1