Microsoft Access 错误找不到 .mdb 但数据库是 .accdb

Posted

技术标签:

【中文标题】Microsoft Access 错误找不到 .mdb 但数据库是 .accdb【英文标题】:Microsoft Access error cannot find .mdb but database is .accdb 【发布时间】:2015-06-26 14:25:17 【问题描述】:

我正在做一个访问 Microsoft Access 数据库的示例程序。它是一个 .accdb 文件。数据库的名称是 ACRONYM_DB.accdb 并且有一个名为 ACRONYM 的数据表。我的代码如下:

string currentLoc = System.AppDomain.CurrentDomain.BaseDirectory.ToString();

ObservableCollection<Acronym.Acronym> acrOC = new ObservableCollection<Acronym.Acronym>();
string ConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + currentLoc + "\\Assets\\ACRONYM_DB.accdb;Jet OLEDB:Database Password=password";

OleDbConnection MyConn = new OleDbConnection(ConnStr);
MyConn.Open();
OleDbCommand myCommand = MyConn.CreateCommand();
myCommand.CommandText = "SELECT * FROM ACRONYM_DB.ACRONYM WHERE ACRONYM_NAME=" + acrName;
OleDbDataReader myReader = myCommand.ExecuteReader();

在执行阅读器行我得到错误:

System.Data.OleDb.OleDbException was unhandled by user code
  HResult=-2147467259
  Message=Could not find file 'C:\Users\Mark\Desktop\release\ACRONYM_DB.mdb'.
  Source=Microsoft Office Access Database Engine
  ErrorCode=-2147467259
  StackTrace:
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
       at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
       at System.Data.OleDb.OleDbCommand.ExecuteReader()
       at AcronymFinder.Model.Database.AcronymDatabase.HistoricalDef(String acrName) in c:\Users\Mark\Documents\Visual Studio 2013\Projects\AcronymFinder\AcronymFinder\Model\Database\AcronymDatabase.cs:line 28
       at AcronymFinder.ViewModel.MainViewModel.set_SelectedAcronym(Acronym value) in c:\Users\Mark\Documents\Visual Studio 2013\Projects\AcronymFinder\AcronymFinder\ViewModel\MainViewModel.cs:line 315
  InnerException: 

我知道错误必须与我正在使用的查询有关,但我需要做些什么不同的事情?我也在使用 64 位版本的 Access 2013。

【问题讨论】:

如果把表名中的ACRONYM_DB.去掉怎么办? 【参考方案1】:

不要在SELECT 语句中包含数据库名称:

myCommand.CommandText = "SELECT * FROM ACRONYM WHERE ACRONYM_NAME=" + acrName;

该更改应该会阻止 db 引擎抱怨它找不到 ACRONYM_DB.mdb

但是,如果您的 ACRONYM_NAME 字段是文本数据类型,则修改后的语句仍可能失败,并出现不同的错误。如果是文本,您可以通过在 acrName 的值前后加上引号来避免缺少参数值投诉:

myCommand.CommandText = "SELECT * FROM ACRONYM WHERE ACRONYM_NAME='" + acrName + "'";

但是,实际上,参数查询会是一种更好的方法,因为您可以防止 SQL 注入,并且如果 acrName 是文本值,则您无需担心引号。

【讨论】:

是的,我肯定会在此上添加参数以对其进行参数化。只是让它工作。【参考方案2】:

你忘了引用你的价值:

    myCommand.CommandText = "[..snip..]ACRONYM_NAME='" + acrName + "'";
                                                    ^-----------^^^^^^^

没有引号,你正在做

ACRONYM_NAME=foo

而不是

ACORNYM_NAME='foo'

这意味着数据库正在寻找一些未知/不存在的FIELD,名为foo,而不是字符串'foo'

【讨论】:

【参考方案3】:

将 Microsoft Office 16.0 对象库添加到您的引用中。

【讨论】:

以上是关于Microsoft Access 错误找不到 .mdb 但数据库是 .accdb的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 数据库引擎找不到输入表或查询

Microsoft.Jet.OLEDB.4.0 “找不到提供程序。它可能没有正确安装。”错误

JSP - Microsoft ODBC - Microsoft Access 驱动程序找不到文件“(未知)”

使用 Microsoft Access 2010 在子查询中找不到表

vc连接access2003出错,头都大了runtime错误。。。跪求!!在线等

使用 PHP 打开 Microsoft Access 数据库