我有两个不同的.Net(c#)应用程序,都使用Microsoft.ACE.OLEDB.12.0。
当我在干净的机器上安装它们时 - Windows 8.1 x64 - 没有办公室或其他任何安装 - 当我尝试阅读时,两者都给我“... OLEDB.12.0提供程序未注册...”错误消息来自MS Access DB的数据,当然,因为我没有安装运行时,所以这是预期的。
安装MS Access Runtime时会发生奇怪的事情。如果我安装x64版本,应用程序A读取msaccess或excel文件没有任何问题,但应用程序B仍然收到“... not registered”错误消息。 然后我去卸载MS Access Runtime x64并安装x32。你猜怎么着?应用程序A停止工作,应用程序B工作......
我不知道那里发生了什么。
应用程序A使用以下连接字符串:
protected override void ConnectBase()
{
try
{
m_connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + m_filePath;
m_connection = new OleDbConnection(m_connectionString);
m_connection.Open();
m_command = new OleDbCommand("", m_connection);
}
catch (Exception ex)
{
throw new ConnectionException(ex.Message, ex);
}
}
应用程序B使用此:
protected override void LoadTableNames()
{
m_tableNames = new List<string>();
if (string.IsNullOrWhiteSpace(DataSource))
return;
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + DataSource;
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
DataTable allTables = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
for (int i = 0; i < allTables.Rows.Count; i++)
m_tableNames.Add(allTables.Rows[i]["TABLE_NAME"].ToString());
}
}
他们都将目标框架设置为4.0 他们都有 AnyCPU 的平台目标 它们都是ClassLibrary(dlls)
调用应用程序A的exe将平台目标设置为x86
调用应用程序B的exe也将平台目标设置为x86
我在这里缺少什么?任何人吗?
答案 0 :(得分:1)
您正在描述的症状 - “x64 Access运行时:App A工作/ App B失败,x32 Access运行时:App A失败/ App B工作”听起来非常像App A是64位应用程序,而App B是一个32位的应用程序。每个版本都需要与其可执行类型相对应的驱动程序的“位数”,因此要使两者都正常工作,您可能需要安装两者 32位和64位运行时(驱动程序)。