我有以下代码来验证是否由另一个应用程序以独占模式打开了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并显示一条消息:“它不是有效的密码”。

如何确定这两个例外?密码验证是用另一种方法进行的,因此我只想知道是否在以“独占模式”打开数据库之前,先用“请输入密码”对话框烦扰用户。

最佳答案

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以获取有关可能的错误的更多信息。

09-25 22:23