连接MySQL的C客户端程序中的错误检测

时间:2011-06-13 14:03:05

标签: mysql c error-handling

我的C客户端程序与MySQL服务器连接。我可以连接,但是当我尝试实现错误检测代码时出现了问题。如果我执行以下操作(此处我故意添加了错误的用户名):

#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'拒绝访问(使用密码:YES)

这是正确的输出。

但如果我这样做:

#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()不起作用。为什么?

2 个答案:

答案 0 :(得分:3)

连接失败后conn_ptr_db设置为NULL。然后尝试使用此值作为调用msql_errono()的参数,实际上是msql_errno(NULL)。因此你得到错误代码。

答案 1 :(得分:1)

因为在第二个示例中,您将结果分配给conn_ptr_db

你不应该这样做。

来自the documentation

  

如果是MYSQL *连接句柄   连接成功,如果是NULL   连接不成功。为一个   成功连接,回归   value与值相同   第一个参数。

如果连接不成功(您有),则已使用conn_ptr_db替换了NULL对象,然后尝试使用mysql_error进行操作。

The documentation for mysql_error没有明确表示不允许使用NULL参数,但很明显您不会收到与原始实际连接上下文相关的错误你覆盖了。