#159 closed улучшение (fixed)
Отсутствие диагностики при ошибке подключения к базе данных
Reported by: | alx | Owned by: | dimag |
---|---|---|---|
Priority: | major | Milestone: | 2 очередь |
Component: | ПО MC04-Dispatcher. Пульт диспетчера/техника | Keywords: | |
Cc: | san |
Description
Когда при подключении к базе данных возникает ошибка, программа выдает пользователю сообщение "Ошибка соединения с базой данных", и все. Какая именно возникла ошибка, видимо, предлагается угадать. :)
Необходимо кроме уведомления о самом факте возникновения ошибки также сообщать, какая именно ошибка возникла. Например: "Ошибка соединения с базой данных: Access denied for user 'john'@'heaven.org'".
Change History (10)
comment:1 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:2 by , 8 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
??? Нет ревизии r227 в репозитории.
comment:3 by , 8 years ago
Появился вывод ошибки соединения с базой данных, но работает он странно. При соединении с базой и получении от нее отказа в доступе программа пишет "имя пользователя или пароль неверны". Пока все хорошо. Теперь пробуем соединиться в ситуации, когда сервер mysql не запущен и... опять получаем ошибку "имя пользователя или пароль неверны"... При чем тут имя пользователя и пароль, если программа даже подключиться к базе не смогла? Она получила Connection Refused, а вовсе не отказ в доступе...
Надо разобраться с кодом, формирующим сообщения об ошибках, чтобы выводимые ошибки соответствовали действительности.
comment:4 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
Тогда будет сообщение "Ошибка соединения с базой данных, невозможно инициализировать MySQL"
comment:5 by , 8 years ago
Когда "тогда"? Должна выводиться та ошибка, которая действительно имела место. Если программа не смогла инициализировать MySQL (что бы это не означало), она должна сказать "не могу инициализировать MySQL". Если случилось что-то другое - должна вывести что-то другое. Говорить надо правду. По-моему так.
comment:6 by , 8 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Только что проведен эксперимент, при котором сервер вообще ничего не отвечал программе. Результат - все то же "имя пользователя или пароль неверны". Сообщение совершенно не соответствует действительности. Это уж точно явный баг, тикет переоткрываю.
follow-up: 8 comment:7 by , 8 years ago
В случае когда сервер не работает и в случае когда введены неверное имя пользователя или пароль, функция
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);
вернёт NULL. Как распознать ситуацию когда сервер не отвечает и когда имя пользователя и пароль не верен?
comment:8 by , 8 years ago
Replying to dimag:
Как распознать ситуацию когда сервер не отвечает и когда имя пользователя и пароль не верен?
Согласно документации mysql, ошибку, возникшую при выполнении любой операции можно получить с помощью mysql_error()
:
mysql_error() const char *mysql_error(MYSQL *mysql) Description For the connection specified by mysql, mysql_error() returns a null-terminated string containing the error message for the most recently invoked API function that failed.
А в описании использованной Вами mysql_real_connect()
есть пример ее использования:
MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name"); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(&mysql)); }
comment:9 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
r233
Сейчас текст ошибки возвращаемой mysql_error будет выводиться в строке состояния и лог программы.
rev 227