【问题标题】:Identifiying Exceptions of the same OleDbException type识别相同 OleDbException 类型的异常
【发布时间】:2013-04-12 03:36:58
【问题描述】:

我有以下代码来验证 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 并显示一条消息:“它不是有效的密码”。

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

【问题讨论】:

  • 不要使用异常的Message 属性来告诉您异常的含义。那只是人类可读的文本,微软可以更改文本,或者对不同的文本使用相同的例外。例如,问问自己,如果 Microsoft 修复了消息中的错字,你的代码会发生什么?
  • 嗨,约翰!这正是我不想做的:使用 message 属性。必须有另一种方法来识别这些异常。

标签: c# exception


【解决方案1】:

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

请参阅此link,了解有关可能出现的错误的更多信息。

【讨论】:

  • 感谢您的链接。这很有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-03-20
  • 2016-08-10
  • 2015-06-19
  • 1970-01-01
  • 2018-01-24
  • 2018-11-11
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多