我的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()不起作用。为什么?
答案 0 :(得分:3)
连接失败后conn_ptr_db设置为NULL。然后尝试使用此值作为调用msql_errono()的参数,实际上是msql_errno(NULL)。因此你得到错误代码。
答案 1 :(得分:1)
因为在第二个示例中,您将结果分配给conn_ptr_db
。
你不应该这样做。
如果是MYSQL *连接句柄 连接成功,如果是NULL 连接不成功。为一个 成功连接,回归 value与值相同 第一个参数。
如果连接不成功(您有),则已使用conn_ptr_db
替换了NULL
对象,然后尝试使用mysql_error
进行操作。
The documentation for mysql_error
没有明确表示不允许使用NULL
参数,但很明显您不会收到与原始实际连接上下文相关的错误你覆盖了。