![](/img/trans.png)
[英]OleDbConnection.Open() throws a “No error message available” error before even contacting the SQL Server
[英]Why OleDbConnection.Open() throws Unrecognized database format if Ole.DB provider is available on the system
我在Windows x64上尝试了下一代码,但代码编译后运行为x86。 如果我在Windows 7或10 x86中运行应用程序,则会出现相同的行为。
static IList<string> GetOleDbProviders()
{
OleDbEnumerator oleDbEnumerator = new OleDbEnumerator();
DataTable oleDbProviders = oleDbEnumerator.GetElements();
IDictionary<string, string> descriptions = new Dictionary<string, string>();
int typeColumnIndex = oleDbProviders.Columns.IndexOf("SOURCES_TYPE");
int nameColumnIndex = oleDbProviders.Columns.IndexOf("SOURCES_NAME");
int descriptionColumnIndex = oleDbProviders.Columns.IndexOf("SOURCES_DESCRIPTION");
foreach (DataRow dataRow in oleDbProviders.Rows)
{
int type = (int)dataRow[typeColumnIndex];
if (type == 1)
{
string name = (string)dataRow[nameColumnIndex];
string description = (string)dataRow[descriptionColumnIndex];
descriptions.Add(name, description);
}
}
IList<string> providers = new List<string>();
foreach (KeyValuePair<string, string> pair in descriptions)
{
providers.Add(pair.Value);
}
return providers;
}
static void Test5()
{
// has item 'Microsoft.Jet.Ole.DB.4.0'
IList<string> providers = GetOleDbProviders();
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\my.accdb";
System.Data.Common.DbConnection connection = new OleDbConnection(connectionString);
try
{
// throws OleDbException on 32 bit with message 'Unregonized database format'
connection.Open();
}
catch (InvalidOperationException e)
{
// break point when running on 64-bit runtime
}
catch (OleDbException e)
{
// break point when running on 32-bit runtime
}
}
如果系统提供Jet.OleDb,为什么connection.Open()会抛出异常? 或者这是否意味着Jet.OleDb支持其他格式,但不支持* .accdb。
当然,在安装Microsoft Access 2013 Runtime之后它仍然有效,但仍然如此? 如果不从oleDbEnumerator.GetElements()返回Microsoft.Jet.Ole.Db.4.0提供程序并且抛出ProviderNotFound异常,那么会更正确吗?
编辑
安装Microsoft Access 2013 Runtime后,它仍然无法正常工作 。 您必须使用较新的ACE提供程序而不是Jet。 必须相应地更新连接字符串。
或者这是否意味着Jet.OleDb支持其他格式,但不支持* .accdb。
是的 - 旧版本的驱动程序将支持旧的mdb格式。
根据文档 :
从Access 2007开始,.accdb是默认的Access文件格式。
在Access 2007中引入.accdb文件格式之前,Access文件格式使用.mdb文件扩展名。
如果您感兴趣,该链接将为您提供有关mdb和accdb之间差异的更多信息。
如果不从oleDbEnumerator.GetElements()返回Microsoft.Jet.Ole.Db.4.0提供程序并且抛出ProviderNotFound异常,那么会更正确吗?
不,它不会。 提供者在那里。 它不支持所有版本的Access数据库并不意味着它不存在 。 如果它根本不可见,人们将无法使用驱动程序访问mdb文件 - 作为一个例子(破坏了许多旧的VB6应用程序)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.