2013-04-11 20 views
3

我有下面的代碼以驗證是否MSACCESS 2003數據庫以獨佔方式打開另一個應用程序(數據庫中已經有一個密碼):裏識別同一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; 
     } 
} 

當數據庫被打開在獨佔模式中,它不關心密碼,它會拋出一個OleDbException,並顯示以下消息:「文件已被使用」。 當數據庫不處於獨佔模式並收到錯誤的密碼時,它會拋出一個OleDbException,並顯示一條消息:「它不是有效的密碼」。

如何識別這兩個例外?用另一種方法進行密碼驗證,所以我只想知道數據庫是否在獨佔模式下打開,然後用「請輸入密碼」對話框來煩惱用戶。

+1

不要使用異常的'Message'屬性來告訴你異常的含義。這只是人類可讀的文本,微軟可以改變文本,或者對不同的文本使用相同的例外。例如,問問你自己,如果微軟修復了郵件中的錯字,你的代碼會發生什麼? – 2013-04-11 19:41:07

+0

嗨,約翰!這正是我不想做的:使用消息屬性。必須有另一種方法來確定這些例外情況。 – 2013-04-11 19:49:11

回答

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

正是我在找什麼,謝謝! – 2013-04-11 19:49:43

+0

感謝您的鏈接。這很有幫助。 – Sascha 2017-01-25 16:59:38