Обнаружение ошибок в клиентской программе C, соединяющей MySQL - PullRequest
0 голосов
/ 13 июня 2011

Моя клиентская программа на 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' (с использованием пароля: ДА)

Это правильный вывод.

Но если я сделаю следующее:

#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 ]

3 голосов
/ 13 июня 2011

После сбоя соединения conn_ptr_db устанавливается в NULL.Затем вы пытаетесь использовать это значение в качестве параметра для вызова msql_errono (), по сути msql_errno (NULL).Отсюда и код ошибки вашего получения.

1 голос
/ 13 июня 2011

Поскольку во втором примере вы присваиваете результат conn_ptr_db.

Вы не должны были этого делать.

С документация :

Дескриптор подключения MYSQL *, если подключение было успешным, NULL, если подключение было неудачным.Для успешного подключения возвращаемое значение совпадает со значением первого параметра.

В случае неудачного подключения (которое у вас есть) вы заменили объект conn_ptr_dbс NULL, затем попытайтесь что-то с ним сделать (mysql_error).

В документации для mysql_error явно не говорится, что параметр NULL запрещен, ноясно, что вы не получите ошибку, относящуюся к исходному, фактическому контексту соединения, который вы перезаписали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...