Обработка ошибок подключения к Интернету и подключений к базе данных - PullRequest
2 голосов
/ 03 октября 2010

Я понимаю, что нет никакой атомарной гарантии:

if(hasInternet)
    doDatabaseCall();

Однако, Как правильно решать проблемы с подключением при работе с объектами DbConnection и DbCommand в мире .NET? Меня особенно интересуют объекты MySqlConnection и MySqlCommand, но я предполагаю (надеюсь), что их схема исключений такая же, как у классов SQL Server.

Я бы предположил, что если интернет отключится до вызоваconn.Open (), MySqlException вызывается.Я также предположил бы, что то же самое случится, если вы вызовете ExecuteReader или ExecuteNonQuery, и интернет отключится.

Я не уверен, потому что документы для объектов MySql не говорят.Объекты SqlServer просто говорят, что он может вызвать SqlException, что означает:

Исключительная ситуация при выполнении команды для заблокированной строки.Это исключение не генерируется при использовании Microsoft .NET Framework версии 1.0.

Это, по-видимому, не распространяется на проблемы с подключением ... Что я хотел бы сделать, это обработать исключение, подождитев течение некоторого времени и начать все сначала.Единственная цель моего приложения - выполнить эти вызовы базы данных и запустить его на выделенной системе, так что повторные попытки навсегда - действительно лучший вариант, на мой взгляд.Тем не менее, Я хотел бы провести различие между исключениями соединения и другими видами исключений из базы данных, возможно ли это?

Я провел некоторое тестирование, и, похоже, оно работает, как я предполагаю, но работает ли он во всех пограничных случаях? Например: команда была успешно отправлена ​​на сервер базы данных, но соединение прерывается до или во время возврата результатов?Если это не работает во всех крайних случаях, тогда мне придется: выполнить команду, запросить требуемое изменение состояния, выполнить следующую команду и т. Д. Важно, чтобы каждая команда прошла.

Я подключаюсь к порту на локальном хосте, который пересылается через SSH на удаленный сервер, если это имеет значение.

1 Ответ

1 голос
/ 03 октября 2010

Что касается SqlDataProvider:

Исключение SqlException имеет несколько свойств, которые предоставляют подробную информацию о том, почему ваша операция завершилась неудачей.

Для вашего случая использования свойство "Class" может быть хорошимвыбор.Это байт, указывающий серьезность исключения.

См .: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.class.aspx

Если это не достаточно конкретно, вы можете проверить эти отдельные ошибки в коллекции ошибок.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.errors.aspx

На основании этой информации вы можете решить, следует ли повторить попытку.

...