识别相同 OleDbException 类型的异常

3

我有以下代码来验证是否有另一个应用程序以独占模式打开了一个带有密码的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异常。
如何识别这两个异常?密码验证是在另一个方法中完成的,因此我只想知道在打扰用户进行“请输入密码”对话框之前,数据库是否以独占模式打开。

1
不要使用异常的“Message”属性来告诉您异常的含义。那只是人类可读的文本,Microsoft 可以更改文本,或者使用相同的异常并附带不同的文本。例如,问问自己,如果 Microsoft 修正了消息中的拼写错误,您的代码会发生什么? - John Saunders
嗨,约翰!那正是我不想做的事情:使用消息属性。必须有另一种方法来识别这些异常。 - Broken_Window
1个回答

6

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

请查看此链接,了解可能出现的错误信息。

谢谢提供链接,这很有帮助。 - Sascha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接