2009-11-08 5 views
0

J'écris un programme utilisant C++ et l'API MySQL C (version 5.1.31 ubuntu2). Toutefois, si la requête est UPDATE alors j'obtiens une erreur Segmentation Fault lors de l'exécution de la ligne "RowsReturned = mysql_num_rows (Resultat);".Mysql_num_rows() Segfaults

//this code snippet contains only the relevant code 
MYSQL_RES *Result; 
long RowsReturned; 

MYSQL_RES *MYSQLDB::RunQuery(const char* Query) 
{ 
    if(mysql_query(Connection, Query)) 
    { 
     std::cout << "Error: " << mysql_error(Connection); 
     exit(1); 
    } 

    Result = mysql_store_result(Connection); 
    RowsReturned = mysql_num_rows(Result); 

    return Result; 
} 

g ++ en utilisant Compilé 4.3.3 (g ++ test.cpp -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient_r -o Test)

Merci à l'avance.

//this snippet contains the entire class code 
class MYSQLDB 
{ 

public: 
    void Connect(const char* DB); 
    MYSQL_RES *RunQuery(const char* Query); 
    long NumRows(); 
    void Close(); 
    MYSQL_ROW GetRow(); 
private: 
    MYSQL *Connection; 
    MYSQL_RES *Result; 
    MYSQL_ROW Row; 

    long RowsReturned; 
}; 

void MYSQLDB::Connect(const char* DB) 
{ 
    Connection = mysql_init(NULL); 

    if(Connection == NULL) 
    { 
     std::cout << "Error: " << mysql_error(Connection); 
     exit(1); 
    } 

    if (mysql_real_connect(Connection, "localhost", "root", "password", DB, 0, NULL, 0) == NULL) 
    { 
     std::cout << "Error: " << mysql_error(Connection); 
     exit(1); 
    } 
} 

MYSQL_RES *MYSQLDB::RunQuery(const char* Query) 
{ 
    if(mysql_query(Connection, Query)) 
    { 
     std::cout << "Error: " << mysql_error(Connection); 
     exit(1); 
    } 

    Result = mysql_store_result(Connection); 
    RowsReturned = (long)mysql_num_rows(Result); //ERROR!!!!!!! 

    return Result; 
} 

long MYSQLDB::NumRows() 
{ 
    return RowsReturned; 
} 

void MYSQLDB::Close() 
{ 
    mysql_free_result(Result); 
    mysql_close(Connection); 
} 

MYSQL_ROW MYSQLDB::GetRow() 
{ 
    return mysql_fetch_row(Result); 
} 

Répondre

3

De la documentation MySQL:

mysql_store_result() renvoie un pointeur NULL si l'instruction n'a pas retourné un jeu de résultats (par exemple, si elle était une instruction INSERT).

Vous êtes en train de mettre à jour afin d'avoir une valeur NULL en tant que résultats.

Essayez quelque chose comme ceci:

Result = mysql_store_result(Connection); 
if (Result) { 
    RowsReturned = mysql_num_rows(Result); 
} else { 
    RowsReturned = 0; 
} 
+0

Merci pour l'aide :)! – Kewley

+0

Pas de problème. :-) – terminus

Questions connexes