我有以下代码来验证另一个应用程序(数据库已经有密码)是否在独占模式下打开了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并显示一条消息:“它不是有效的密码”。
我如何识别这两个例外情况?密码验证是在另一种方法中进行的,所以我只想知道数据库是否以独占模式打开,然后用“请输入密码”对话框来烦扰用户。
答案 0 :(得分: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。