识别相同OleDbException类型的exception

我有以下代码来validation另一个应用程序(数据库已经有密码)是否在独占模式下打开MSAccess 2003数据库:

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并显示一条消息:“它不是有效的密码”。

我如何识别这两个例外? 密码validation是在另一种方法中进行的,所以我只想知道数据库是否以独占模式打开,然后用“请输入密码”对话框来烦扰用户。

OleDbException类提供Errors属性,实际上是OleDbErrorCollection 。 此集合包含OleDbError对象,它提供有关错误的信息。

您可以使用OleDbError类的SQLState属性来区分这两种情况:

 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; } } 

有关可能的错误的更多信息,请参阅此链接 。