我正在做一个示例程序,用于访问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:
我知道错误与我正在使用的查询有关,但是我需要做些什么呢?另外,我正在使用Access 2013的64位版本。
在SELECT
语句中不要包括数据库名称:
myCommand.CommandText = "SELECT * FROM ACRONYM WHERE ACRONYM_NAME=" + acrName;
该更改应阻止db引擎抱怨它找不到ACRONYM_DB.mdb。
但是,如果您的ACRONYM_NAME字段为text数据类型,则修改后的语句仍可能失败,并出现其他错误。如果是文本,则可以通过在acrName值之前和之后加上引号来避免丢失参数值投诉:
myCommand.CommandText = "SELECT * FROM ACRONYM WHERE ACRONYM_NAME='" + acrName + "'";
但是,实际上,参数查询将是更好的方法,因为可以防止SQL注入,并且如果acrName是文本值,则无需担心引号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句