2015-06-26 149 views
2

我在做一个访问Microsoft Access数据库的示例程序。它是一个.accdb文件。数据库的名称是ACRONYM_DB.accdb,并有一个名为ACRONYM的数据表。我的代码如下:Microsoft Access错误找不到.mdb,但数据库是.accdb

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位版本的2013年

+1

如果从表名中删除'ACRONYM_DB.'会怎样? – juharr

回答

3

不包括在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是文本值,则不需要打扰引号。

+1

是的,我肯定要addParameter对此进行参数化。只是让它工作。 – yams

0

你忘了注明您的值:

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

不带引号,你正在做

ACRONYM_NAME=foo 

代替

ACORNYM_NAME='foo' 

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

+0

我修改了它,我仍然收到错误 – yams

相关问题