Microsoft Access 错误找不到 .mdb 但数据库是 .accdb
Microsoft Access error cannot find .mdb but database is .accdb
我正在做一个访问 Microsoft Access 数据库的示例程序。它是一个 .accdb 文件。数据库的名称是 ACRONYM_DB.accdb 并且有一个名为 ACRONYM 的数据 table。我的代码如下:
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();
在执行 reader 行我收到错误:
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。
您忘记引用您的价值:
myCommand.CommandText = "[..snip..]ACRONYM_NAME='" + acrName + "'";
^-----------^^^^^^^
没有引号,你正在做
ACRONYM_NAME=foo
而不是
ACORNYM_NAME='foo'
这意味着数据库正在寻找一些名为 foo
的 unknown/non-existent FIELD,而不是字符串 'foo'
.
不要在 SELECT
语句中包含数据库名称:
myCommand.CommandText = "SELECT * FROM ACRONYM WHERE ACRONYM_NAME=" + acrName;
该更改应该会阻止数据库引擎抱怨找不到 ACRONYM_DB.mdb。
但是,如果您的 ACRONYM_NAME 字段是文本数据类型,修改后的语句仍然可能会失败,并出现不同的错误。如果是文本,您可以通过在 acrName:
的值前后加上引号来避免缺少参数值投诉
myCommand.CommandText = "SELECT * FROM ACRONYM WHERE ACRONYM_NAME='" + acrName + "'";
但是,实际上,参数查询会是更好的方法,因为您将受到保护免受 SQL 注入,并且如果 acrName 是文本值。
将 Microsoft Office 16.0 对象库添加到您的引用中。
我正在做一个访问 Microsoft Access 数据库的示例程序。它是一个 .accdb 文件。数据库的名称是 ACRONYM_DB.accdb 并且有一个名为 ACRONYM 的数据 table。我的代码如下:
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();
在执行 reader 行我收到错误:
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。
您忘记引用您的价值:
myCommand.CommandText = "[..snip..]ACRONYM_NAME='" + acrName + "'";
^-----------^^^^^^^
没有引号,你正在做
ACRONYM_NAME=foo
而不是
ACORNYM_NAME='foo'
这意味着数据库正在寻找一些名为 foo
的 unknown/non-existent FIELD,而不是字符串 'foo'
.
不要在 SELECT
语句中包含数据库名称:
myCommand.CommandText = "SELECT * FROM ACRONYM WHERE ACRONYM_NAME=" + acrName;
该更改应该会阻止数据库引擎抱怨找不到 ACRONYM_DB.mdb。
但是,如果您的 ACRONYM_NAME 字段是文本数据类型,修改后的语句仍然可能会失败,并出现不同的错误。如果是文本,您可以通过在 acrName:
的值前后加上引号来避免缺少参数值投诉myCommand.CommandText = "SELECT * FROM ACRONYM WHERE ACRONYM_NAME='" + acrName + "'";
但是,实际上,参数查询会是更好的方法,因为您将受到保护免受 SQL 注入,并且如果 acrName 是文本值。
将 Microsoft Office 16.0 对象库添加到您的引用中。