Обработка исключений при работе с ZennoPoster.Db

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 542
Баллы
113
Почему-то при любой ошибке, возникающей при работе с БД из C# кода, не переходит в исключение.

Примерный шаблон кода выглядит так:
C#:
try {
   ZennoPoster.Db.ExecuteQuery("INSERT INTO threads (one, two, three) VALUES ('1', '2', '3');",
   null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.MySqlClient, "server="+mysql_ip+";port="+mysql_port+";user id="+mysql_login+";database=namebase;password="+mysql_pass, "|", "");
   return "Все окей";
} catch (Exception e) {
  return e.InnerException.Message.ToString();
}
Заведомо не указал пароль от пользователя. В итоге получаю ретурном "Все окей", а чуть выше в логах
Ошибка при выполнении Db.ExecuteQuery Authentication to host '123.456.78.90' for user 'supermegaroot' using method 'mysql_native_password' failed with message: Access denied for user 'supermegaroot'@'domain.com' (using password: NO)
Как перекидывать все ошибки связанные с БД в исключение?
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93
Перехода в catch нет, так как сами по себе зенновские методы по работе с БД не могут как-то ломаться, они в любом случае возвращают некое значение.
Для лучшего понимания рассмотрим работу этих методов на примере того же добавления строки (метод ExecuteNonQuery).
Внутри методов соединение и работа с БД происходит через свои try-catch-finally. Если всё проходит успешно и ошибок нет - метод просто возвращает (все методы ZennoPoster.Db возвращают что-либо) количество задействованных (добавленных) строк, в нашем случае это 1. Если есть какая-то ошибка, она ловится конкретным catch, где осуществляется вывод текста ошибки в лог постера и определяется возвращаемое значение для всего метода. В итоге метод возвращает 0 - что значит строка не добавлена из-за ошибки.
Резюмируя, по факту у нас могут быть ошибки "внутри", но не могут быть "снаружи". Поэтому тот код так и ведёт себя.
Исходя из этой информации ответ на следующий вопрос:
Как перекидывать все ошибки связанные с БД в исключение?
Если задача просто знать, успешно ли метод отработал или нет - отслеживать возвращаемое значение.
Если задача ловить конкретное исключение - работать напрямую с библиотекой MySQL.

PS: В примере для инсерта использовался метод ExecuteQuery - по уму лучше так не делать, хоть и работает.
Метод ExecuteNonQuery предназначен для отправки запросов, которые не возвращают данные (н-р инсерты, апдейты, делиты), методы ExecuteQuery - соответственно, для запросов, возвращающих данные (н-р селекты).
 
  • Спасибо
Реакции: fridayman, deopl и ibred

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 542
Баллы
113
Если всё проходит успешно и ошибок нет - метод просто возвращает (все методы ZennoPoster.Db возвращают что-либо) количество задействованных (добавленных) строк, в нашем случае это 1. Если есть какая-то ошибка, она ловится конкретным catch, где осуществляется вывод текста ошибки в лог постера и определяется возвращаемое значение для всего метода. В итоге метод возвращает 0 - что значит строка не добавлена из-за ошибки.
Так-с, с INSERT разобрался, действительно возращается 0 или 1. А как быть с SELECT'ом?

Смотрите какая ситуация, LaGir, у меня есть код который обращается к БД в цикле, он проверяет ячейку на наличие записи (SELECT). Если она пустая - ждем N-секунд и повторяем запрос, до тех пор пока не получим ответ. Косяк в том, что если возникнет ошибка в этом цикле, я её никак не отслежу так как она нигде не выводится, а мне будет приходить пустой ответ. В итоге - бесконечный цикл.

Да и UPDATE такая же история. Если вернулось 0, как узнать почему? Не нашлось строк в таблице под эти критерии или из-за ошибки?

PS: В примере для инсерта использовался метод ExecuteQuery - по уму лучше так не делать, хоть и работает.
Метод ExecuteNonQuery предназначен для отправки запросов, которые не возвращают данные (н-р инсерты, апдейты, делиты), методы ExecuteQuery - соответственно, для запросов, возвращающих данные (н-р селекты).
Спасибо, учту.
 
Последнее редактирование:

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93
Как и писал выше, значит надо начать работать с библиотекой MySql.Data.dll напрямую (она есть в папке Progs с установленным ZP, достаточно скопировать в ExternalAssemblies и подключить к проекту), в обход зенновских методов - тогда можно будет поймать и идентифицировать любую ошибку. Как работать с библиотекой - подробную документацию можно скачать с офсайта, примеров в сети тоже много. Несколько примеров точно есть и тут на форуме, только искать насколько помню стоит старые сообщения, до появления класса ZennoPoster.Db (год назад и раньше).
 
  • Спасибо
Реакции: Sanekk и ibred

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)