2015-06-26 4 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(); 

На Execute читатель линии Я gettting ошибки:

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 г.

+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

Да, я определенно собираюсь добавитьпараметр для его параметризации. Просто заставить его работать. – yams

0

Вы забыли процитировать свою ценность:

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

без кавычек, вы делаете

ACRONYM_NAME=foo 

вместо

ACORNYM_NAME='foo' 

, что означает, что DB ищет неизвестные/не существующие FIELD с именем foo, вместо строки 'foo'.

+0

Я изменил его, и я все еще получаю сообщение об ошибке – yams