2011-06-13 68 views
0

我的C客戶端程序連接MySQL服務器。我可以連接,但是當我嘗試實現錯誤檢測代碼時會出現問題。如果我下面的(在這裏我也故意把不正確的用戶名):連接MySQL的C客戶端程序中的錯誤檢測

#include "mysql.h" 

int main() 
{ 
    MYSQL* conn_ptr_db; 

    conn_ptr_db = mysql_init(NULL); 

    if(!conn_ptr_db) 
    { 
     perror("Error connecting to MySQL! "); 
     exit(0); 
    } 

    if(mysql_real_connect(conn_ptr_db,"localhost","rooti","root","mysql",0,NULL,0)) 
    { 
     printf("Hurrah! we have connected to MySQL! "); 
     mysql_close(conn_ptr_db); 
    } 
    else 
    { 
     printf("Connection failed to MySQL! \n"); 
     printf("Error code: %d %s %s\n",mysql_errno(conn_ptr_db),mysql_sqlstate(conn_ptr_db),mysql_error(conn_ptr_db)); 
    } 

    //mysql_close(conn_ptr_db); 
    return 0; 
} 

現在輸出到這個程序:

./db_access 連接失敗到MySQL! 錯誤代碼:1045 28000訪問被拒絕用戶'rooti'@'localhost'(使用密碼:是)

這是正確的輸出。

但是,如果我做到以下幾點:

#include "mysql.h" 

int main() 
{ 
    MYSQL* conn_ptr_db; 

    conn_ptr_db = mysql_init(NULL); 

    if(!conn_ptr_db) 
    { 
     perror("Error connecting to MySQL! "); 
     exit(0); 
    } 

    //CHANGES ------------- 
    conn_ptr_db = mysql_real_connect(conn_ptr_db,"localhost","rooti","root","mysql",0,NULL,0); 
    if(conn_ptr_db) 
    { 
     printf("Hurrah! we have connected to MySQL! "); 
     mysql_close(conn_ptr_db); 
    } 
    else 
    { 
     printf("Connection failed to MySQL! \n"); 
     printf("Error code: %d %s %s\n",mysql_errno(conn_ptr_db),mysql_sqlstate(conn_ptr_db),mysql_error(conn_ptr_db)); 
    } 

    //mysql_close(conn_ptr_db); 
    return 0; 
} 

我得到以下輸出: ./db_access 連接失敗到MySQL! 錯誤代碼:0 08001

在這裏,mysql_errno()和mysql_error()不起作用。爲什麼?

回答

3

連接失敗後,conn_ptr_db被設置爲NULL。然後嘗試將此值用作調用msql_errono()的參數,實際上是msql_errno(NULL)。因此,你得到的錯誤代碼。

1

因爲在第二個示例中,您將結果分配給conn_ptr_db

你不應該這樣做。

the documentation

一個MYSQL *連接句柄。如果 連接成功,NULL,如果 連接不成功。對於 連接成功,返回 值與 第一個參數的值相同。

在一個不成功的連接(你有)的情況下,你已經更換了你conn_ptr_db對象與NULL然後嘗試做的東西與它(mysql_error)。

The documentation for mysql_error沒有明確說,一個NULL參數是不允許的,但很顯然,你不會得到與原來的錯誤,實際連接上下文,你改寫。