Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

naruszenie ochrony pamięci MYSQL

Ostatnio zmodyfikowano 2013-10-07 18:39
Autor Wiadomość
roserek
Temat założony przez niniejszego użytkownika
naruszenie ochrony pamięci MYSQL
» 2013-10-03 09:51:16
Witam. Mam problem z mysql, polaczenie z baza danych nie wyrzuca błedu, dopiero kiedy wysyłam zapytanie to wywala mi błąd z tematu. Program się kompiluje.

klasa do mysql:
C/C++
#include "mysql.h"
#include <iostream>
#include <string>
#include <fstream>


using namespace std;


class database_mysql
{
private:
    string host;
    string user;
    string password;
    string sql_db;
    unsigned int sql_port;
    unsigned int sql_flags;
    MYSQL * sock;
   
public:
    database_mysql( const int );
   
    ~database_mysql( void );
   
    void connect_mysql();
   
    void inquiry_mysql( const char * inquiry );
   
    void clear_base();
   
    void close();
   
    MYSQL * get_sock();
};



database_mysql::database_mysql( const int gender )
{
    string tab[ 10 ], tmp;
    int i = 0;
    stringstream ss;
   
    fstream conf;
    conf.open( "mysql_config" );
   
    do {
        getline( conf, tmp );
        for( int j = tmp.length() - 1; j > 0; --j )
        {
            if( tmp[ j ] != ' ' )
                 tab[ i ] = tmp[ j ] + tab[ i ];
            else
                 break;
           
        }
        ++i;
    } while( !conf.eof() );
   
    host = tab[ 0 ];
    sql_port = atoi( tab[ 1 ].c_str() );
    sql_flags = atoi( tab[ 2 ].c_str() );
   
    if( gender == 1 )
    {
        user = tab[ 3 ];
        password = tab[ 5 ];
        sql_db = tab[ 7 ];
    }
    else if( gender == 0 )
    {
        user = tab[ 4 ];
        password = tab[ 6 ];
        sql_db = tab[ 8 ];
    }
   
    sock = mysql_init( NULL );
}


void database_mysql::close( void )
{
    mysql_close( sock );
}


database_mysql::~database_mysql( void )
{
    mysql_close( sock );
}


void database_mysql::connect_mysql()
{
   
    if( !mysql_real_connect( sock, host.c_str(), user.c_str(), password.c_str(), sql_db.c_str(), sql_port, NULL, sql_flags ) )
    {
        const char * error_message = mysql_error( sock );
        cout << error_message << endl;
    }
}



void database_mysql::inquiry_mysql( const char * inquiry )
{
    if( mysql_query( sock, inquiry ) )
    {
        const char * error_message = mysql_error( sock );
        throw error_message;
    }
   
}


void database_mysql::clear_base()
{
    string inquiry = "show tables";
    stringstream ss;
    MYSQL_ROW wiersz;
   
    if( mysql_query( sock, inquiry.c_str() ) )
    {
        const char * error_message = mysql_error( sock );
        mysql_close( sock );
        throw error_message;
    }
   
    MYSQL_RES * idzapytania = mysql_store_result( sock );
   
    while(( wiersz = mysql_fetch_row( idzapytania ) ) != NULL )
    {
        ss << "delete from " << wiersz[ 0 ];
       
        if( mysql_query( sock, ss.str().c_str() ) )
        {
            const char * error_message = mysql_error( sock );
            mysql_close( sock );
            throw error_message;
           
        }
        ss.str( "" );
    }
}


MYSQL * database_mysql::get_sock()
{
    return sock;
}


Natomiast w tym miejscu wysyłam zapytanie do bazy:

C/C++
database_mysql female_db( 0 );
question = "insert into name values (" + label_female + ", " + name + ")";
cout << question << endl;
female_db.inquiry_mysql( question.c_str() );
female_db.close();
P-93045
DejaVu
» 2013-10-06 11:40:26
Naruszenie ochrony pamięci wynika z tego, że nie działa API MySQL-a, czy Twój wrapper na MySQL-a? Działa Ci najprostszy przykład komunikacji z MySQL-em, wyjęty z tutoriala? Sprawdzałeś debuggerem w którym miejscu się wywala program?
P-93231
roserek
Temat założony przez niniejszego użytkownika
» 2013-10-07 10:19:24
Tak, komunikacja z mysql dziala bez problemu, na innym przykładzie dziala ok. A mam jeszcze takie pytanie. Czy jest możliwe aby utworzyć dwa obiekty tej klasy i polączyć się z dwiema różnymi bazami danych ?? Chodzi o to że chciałbym mieć dostęp do dwóch baz jednocześnie.
P-93304
DejaVu
» 2013-10-07 18:39:52
Jeżeli biblioteka działa poprawnie dla przykładów z tutoriala, a po zmianie kodu na Twój wyrzucane są błędy to znaczy, że coś źle napisałeś i dobrze wówczas sprawdzić debuggerem gdzie się aplikacja wysypuje. Co do Twojego drugiego pytania - jeżeli nie używasz zmiennych statycznych i klasa jest poprawnie zaprojektowana, to powinieneś mieć możliwość połączenia się z n-bazami jednocześnie, gdzie każdy obiekt tej klasy będzie obsługiwał jedną bazę.
P-93322
« 1 »
  Strona 1 z 1