naruszenie ochrony pamięci MYSQL
Ostatnio zmodyfikowano 2013-10-07 18:39
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: #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: 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();
|
|
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? |
|
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. |
|
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ę. |
|
« 1 » |