2013-04-22 3 views
0

Я пытаюсь поймать error 1045 (access denied) из MySQL, но у меня есть некоторые странные проблемы. Что-то не так с моим кодом?MySQL-try-catch не работает должным образом

Вместо обработки исключения он бросает меня в VS?

private bool connOpen() 
{ 
    bool kleir = false; 
    try 
    { 
     conn.Open(); 
     kleir = true; // throws exception here 
    } 
    catch (MySqlException ex) 
    { 
     switch (ex.Number) 
     { 
      case 1045: 
       MainWindow.connError = true; 
       break; 
     } 
     kleir = false; 
    } 
    return kleir; 
} 
+0

Прокомментируйте строку 'kleir = true;' и посмотрите, не вызывает ли она ошибку. – Brian

+0

@Brian по-прежнему та же проблема, я даже пытался просто использовать 'return false' и' return true' вместо 'bool kleir'. Но он не войдет в блок 'catch', он останется в блоке' try':/ – DeMama

+1

Какое сообщение об ошибке исключения? Добавьте Console.WriteLine (ex.Message) перед коммутатором – Steve

ответ

0

Я подозреваю, что исключение при попытке открыть соединение, но диалог в меню DEBUG.Exceptions.Common Language Runtime Exceptions имеет флажок отмечен в столбце Thrown. Это должно быть причиной того, почему ваш код останавливается на указанной строке и не входит в блок catch.

+0

Да, это была проблема, единственное странное, что мое сообщение об ошибке равно ошибке '1045'. Но теперь 'errorCode' говорит мне 0 вместо' 1045' .. Странно! – DeMama

1

Предполагая, что вы отлаживаете это в VS. VS остановится на исключении, даже если у вас есть обработчик исключений , потому что вы находитесь в режиме отладки. Если вы запустите это за пределами студии, исключение будет обработано блоком. Вы также можете просто нажать F5 (Run), чтобы продолжить.

Но это, на мой взгляд, просто боковое шоу. Код, который вы показали, довольно плох. Этот фрагмент подразумевает, что вы открываете одно соединение, используя это для создания одного или нескольких вызовов БД, а затем где-то по пути у вас есть другой метод его закрытия.

Вы никогда не должны инициализировать/управлять соединениями от того места, где вы на самом деле их используете. Пул соединений более чем способен правильно обрабатывать большое количество соединений/разъединений. Причина, по которой вы должны сохранить этот код вместе, заключается в том, что чем больше событий между открытием и закрытием соединения, тем больше возможностей, которые ваш код неправильно удаляет из этих объектов. Когда они не будут удалены, пул соединений будет кратером с очень странными и трудными для отладки проблем, а использование памяти идет вверх.

Объекты базы данных соединения и команды являются неуправляемыми объектами. Они реализуют IDisposable, потому что они управляют неуправляемыми ресурсами. Примером правильного способа это является:

using (SqlConnection conn = new SqlConnection(connstring)) { 
    using (SqlCommand cmd = new SqlCommand(conn)) { 
    // do atomic database stuff 
    } 
} 

Операторы использования автоматически закрывают и удаляют эти объекты. Пул соединений (который вам даже не нужно думать) гарантирует, что если вы вызовете вышеуказанный код 1000 раз, он все равно будет работать очень быстро.

+0

+1, я уже знал об использовании трюка, и, возможно, я подумаю об изменении моего кода на использование блоков. Но это может пригодиться программистам, которые новы с MySQL в .NET. – DeMama

Смежные вопросы