2013-04-11 1 views
3

У меня есть следующий код, чтобы проверить, если база данных MSAccess 2003 открыта в монопольном режиме другим приложением (база данных уже есть пароль):Identifiying Исключения одного и того же типа OleDbException

OleDbConnectionStringBuilder conString = new OleDbConnectionStringBuilder(); 
conString.Provider = "Microsoft.Jet.OLEDB.4.0"; 
conString.DataSource = "some path to some mdb file"; 
// I don't care about the password, 
// I just whant to know if it is opened in Exclusive Mode 
conString["Jet OLEDB:Database Password"] = String.Empty; 
conString["Mode"] = "Share Deny None"; 
string completeConnStr = conString.ConnectionString; 

using (OleDbConnection con = new OleDbConnection(completeConnStr)) 
{ 
     try 
     { 
     con.Open(); 
     con.Close(); 
     } 
     catch (Exception ex) 
     { 
     string s = ex.Message; 
     } 
} 

Когда база данных открыта в Exclusive Mode он не заботится о пароле, он генерирует исключение OleDbException со следующим сообщением: «Файл уже используется». Когда база данных не находится в эксклюзивном режиме и получает неверный пароль, она генерирует исключение OleDbException с сообщением: «Это не допустимый пароль».

Как определить эти два исключения? проверка пароля выполняется другим способом, поэтому я просто хочу знать, открыта ли база данных в эксклюзивном режиме, прежде чем раздражать пользователя диалоговым окном «Введите пароль».

+1

Не используйте свойство 'Message' для исключения, чтобы сообщить вам, что означает это исключение. Это просто текст, читаемый человеком, и Microsoft получает возможность изменять текст или использовать одно и то же исключение с другим текстом. Спросите себя, например, что происходит с вашим кодом, если Microsoft исправляет опечатку в сообщении? –

+0

Привет, Джон! Это именно то, чего я не хочу делать: использование свойства message. Должен быть другой способ идентифицировать эти исключения. –

ответ

6

Класс OleDbException предоставляет имущество Errors, которое на самом деле является OleDbErrorCollection. Эта коллекция содержит OleDbError объектов, которые содержат информацию об ошибке.

Вы можете использовать SQLState свойство в классе OleDbError различать два случая:

try 
{ 
    con.Open(); 
    con.Close(); 
} 
catch (OleDbException dbException) 
{ 
    switch (dbException.Errors[0].SQLState) 
    { 
    case "3031": // Authentication failed... 
     MessageBox.Show("Authentication failed..."); 
     break; 
    case "3045": // File already in use... 
     MessageBox.Show("Database already in use..."); 
     break; 
    default: 
     break; 
    }   
} 

Пожалуйста, ознакомьтесь link для получения дополнительной информации о возможных ошибках.

+0

Точно, что я искал, спасибо !!! –

+0

Спасибо за ссылку. Это было полезно. – Sascha

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