2011-06-13 67 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参数是不允许的,但很显然,你不会得到与原来的错误,实际连接上下文,你改写。